https://www.luogu.com.cn/problem/P1137
很显然,每个点的答案是它所有前驱节点的答案加1,即num[i]=max(num[i], num[j]+1);
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100005;
int n, m;
struct edge {
int to, cost = 1;
edge(int to) {
this->to = to;
}
};
vector<edge> e[MAXN];
int ru[MAXN], chu[MAXN];
int num[MAXN];
void slove() {
queue<int> que;
vector<int> ans;
for(int i = 1; i <= n; i++) {
if(!ru[i]) {
num[i] = 1;
que.push(i);
}
}
while(!que.empty()) {
int u = que.front();
que.pop();
ans.push_back(u); // 这里其实不需要ans
for(int i = 0; i < e[u].size(); i++) {
edge x = e[u][i];
--ru[x.to];
if(!ru[x.to]) que.push(x.to);
num[x.to] = max(num[x.to], num[u] + 1);
}
}
for(int i = 1; i <= n; i++) {
cout << num[i] << endl;
}
}
int main() {
cin >> n >> m;
for(int i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
e[a].push_back(edge(b));
ru[b]++;
chu[a]++;
}
slove();
return 0;
}