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
| #include <bits/stdc++.h> using namespace std; const int LEN = 5e3 + 50; int N, K, P, R, tot, ans = -1, arr[LEN], head[LEN], ind[LEN], val[LEN]; queue<int> q;
struct edge { int to_, nxt_; } e[LEN * LEN];
void add(int u, int v) { e[tot].to_ = v, e[tot].nxt_ = head[u]; head[u] = tot++; }
void toposort() { for (int i = 1; i <= P; ++i) q.emplace(arr[i]); while (!q.empty()) { int u = q.front(); q.pop(); if (u == K) { ans = val[K]; return; } for (int i = head[u]; ~i; i = e[i].nxt_) { int v = e[i].to_; val[v] = max(val[v], val[u] + 1); if (--ind[v] == 0) q.emplace(v); } } }
int main() { memset(head, -1, sizeof(head)); int u, v, s, p; cin >> N >> K >> P; for (int i = 1; i <= P; ++i) cin >> arr[i]; cin >> R; for (int i = 1; i <= R; ++i) { cin >> v >> s; for (int j = 1; j <= s; ++j) { cin >> u; add(u, v); ++ind[v]; } } toposort(); cout << ans; }
|