Pagini recente » Cod sursa (job #3156226) | Cod sursa (job #2249131) | Cod sursa (job #1314731) | Cod sursa (job #2982231) | Cod sursa (job #2940052)
#include <iostream>
#include <bits/stdc++.h>
#define fin cin
#define fout cout
using namespace std;
//ifstream fin("f.in");
//ofstream fout("f.out");
const int TMAX = 500, NMAX = 1e4 + 1, KMAX = 1e5 + 1, QSIZE = (1 << 17) - 1;
bool occ[TMAX][NMAX];
vector<int> gr[NMAX];
vector<int> patr[KMAX];
int len[KMAX];
struct pack {
int pos, t;
}q[QSIZE];
int l, r;
int qlen;
void push(pack a) {
q[r] = a;
qlen++;
r = (r + 1) & QSIZE;
}
pack pop() {
qlen--;
pack a = q[l];
l = (l + 1) & QSIZE;
return a;
}
int main()
{
int n, m, k;
fin >> n >> m >> k;
for (int i = 0; i < m; i++) {
int u, v;
fin >> u >> v;
gr[u].push_back(v);
gr[v].push_back(u);
}
for (int i = 0; i < k; i++){
int pos;
fin >> len[i];
for (int j = 0; j < len[i]; j++) {
fin >> pos;
patr[i].push_back(pos);
}
}
for (int i = 0; i < TMAX; i++) {
for (int j = 0; j < k; j++) {
occ[i][patr[j][i % len[j]]] = 1;
}
}
l = 0, r = 0;
qlen = 0;
push({0, 0});
bool found = 0;
int ans;
bool ok = 1;
while (!found) {
if (qlen == 0) {
ok =0;
break;
}
pack cr = pop();
if (cr.t > 4000 == 0) {
ok =0;
break;
}
int ct = cr.t % TMAX;
occ[ct][cr.pos] = 0;
int nt = (cr.t + 1) % TMAX;
if (!occ[nt][cr.pos]) {
occ[nt][cr.pos] = 1;
push({cr.pos, cr.t + 1});
}
for (int nxt: gr[cr.pos]) {
if (!occ[nt][nxt]) {
if (nxt == n - 1) {
found = 1;
ans = cr.t + 1;
}
occ[nt][nxt] = 1;
push({nxt, cr.t + 1});
}
}
}
if (!ok)
fout << -1;
else
fout << ans;
return 0;
}