P8893. 智能推荐

考点

  • 拓扑排序

题解

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;
}

思路

每次只能做被推荐的题目,而题目要被推荐,得先做完一系列前置题目

令前置题目指向推荐题目后,直接套拓扑排序板子即可