#include <cstdio>
#include <vector>
using namespace std;
const int MAX_N = 500;
const int MAX_M = 1000;
const int MAX_CELLS = 15000000;
short cells[2][MAX_CELLS + 1];
vector<short> rep[MAX_N + 1];
short seq[MAX_M + 1];
bool can_rep[MAX_N + 1];
int pi[MAX_M + 1];
void compute_pi(int m) {
pi[1] = 0;
int k = 0;
for (int q = 2; q <=m; q++) {
while ((k > 0) && (seq[k + 1] != seq[q])) {
k = pi[k];
}
if (seq[k + 1] == seq[q]) {
k++;
}
pi[q] = k;
}
}
bool find(int to_cells, int to_cells_size, int m) {
int q = 0;
for (int i = 1; i <= to_cells_size; i++) {
while ((q > 0) && (seq[q + 1] != cells[to_cells][i])) {
q = pi[q];
}
if (seq[q + 1] == cells[to_cells][i]) {
q++;
}
if (q == m) {
return true;
}
}
return false;
}
int simulate(int n, int m) {
int from_cells = 0;
int from_cells_size = 1;
cells[0][1] = 1;
int to_cells = 1;
int to_cells_size = 0;
int minute = 1;
while (true) {
minute++;
// printf("----------minute: %d----------\n", minute);
to_cells_size = 0;
for (int i = 1; i <= from_cells_size; i++) {
short from_cell = cells[from_cells][i];
// printf("%hd -> ", from_cell);
for (int j = 0; j < rep[from_cell].size(); j++) {
short to_cell = rep[from_cell][j];
// printf("%hd ", to_cell);
cells[to_cells][++to_cells_size] = to_cell;
if (to_cells_size > MAX_CELLS) {
if (find(to_cells, to_cells_size, m)) {
return minute;
}
return -1;
}
}
// printf("\n");
}
/*
for (int i = 1; i <= to_cells_size; i++) {
printf("%d ", cells[to_cells][i]);
}
printf("\n");
*/
if (find(to_cells, to_cells_size, m)) {
return minute;
}
int tmp = from_cells;
from_cells = to_cells;
to_cells = tmp;
from_cells_size = to_cells_size;
}
return -1;
}
int main() {
int n, m, l;
short h;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
can_rep[i] = false;
}
for (int i = 1; i <= n; i++) {
scanf("%d", &l);
for (int j = 0; j < l; j++) {
scanf("%hd", &h);
rep[i].push_back(h);
can_rep[i] = true;
}
}
for (int i = 1; i <= m; i++) {
scanf("%hd", &seq[i]);
}
int res = 0;
for (int i = 1; i <= m; i++) {
if (!can_rep[seq[i]]) {
res = -1;
}
}
if (res != -1) {
compute_pi(m);
res = simulate(n, m);
}
printf("%d\n", res);
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include <cstdio> #include <vector> using namespace std; const int MAX_N = 500; const int MAX_M = 1000; const int MAX_CELLS = 15000000; short cells[2][MAX_CELLS + 1]; vector<short> rep[MAX_N + 1]; short seq[MAX_M + 1]; bool can_rep[MAX_N + 1]; int pi[MAX_M + 1]; void compute_pi(int m) { pi[1] = 0; int k = 0; for (int q = 2; q <=m; q++) { while ((k > 0) && (seq[k + 1] != seq[q])) { k = pi[k]; } if (seq[k + 1] == seq[q]) { k++; } pi[q] = k; } } bool find(int to_cells, int to_cells_size, int m) { int q = 0; for (int i = 1; i <= to_cells_size; i++) { while ((q > 0) && (seq[q + 1] != cells[to_cells][i])) { q = pi[q]; } if (seq[q + 1] == cells[to_cells][i]) { q++; } if (q == m) { return true; } } return false; } int simulate(int n, int m) { int from_cells = 0; int from_cells_size = 1; cells[0][1] = 1; int to_cells = 1; int to_cells_size = 0; int minute = 1; while (true) { minute++; // printf("----------minute: %d----------\n", minute); to_cells_size = 0; for (int i = 1; i <= from_cells_size; i++) { short from_cell = cells[from_cells][i]; // printf("%hd -> ", from_cell); for (int j = 0; j < rep[from_cell].size(); j++) { short to_cell = rep[from_cell][j]; // printf("%hd ", to_cell); cells[to_cells][++to_cells_size] = to_cell; if (to_cells_size > MAX_CELLS) { if (find(to_cells, to_cells_size, m)) { return minute; } return -1; } } // printf("\n"); } /* for (int i = 1; i <= to_cells_size; i++) { printf("%d ", cells[to_cells][i]); } printf("\n"); */ if (find(to_cells, to_cells_size, m)) { return minute; } int tmp = from_cells; from_cells = to_cells; to_cells = tmp; from_cells_size = to_cells_size; } return -1; } int main() { int n, m, l; short h; scanf("%d%d", &n, &m); for (int i = 1; i <= n; i++) { can_rep[i] = false; } for (int i = 1; i <= n; i++) { scanf("%d", &l); for (int j = 0; j < l; j++) { scanf("%hd", &h); rep[i].push_back(h); can_rep[i] = true; } } for (int i = 1; i <= m; i++) { scanf("%hd", &seq[i]); } int res = 0; for (int i = 1; i <= m; i++) { if (!can_rep[seq[i]]) { res = -1; } } if (res != -1) { compute_pi(m); res = simulate(n, m); } printf("%d\n", res); return 0; } |
English