P1137 旅行计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10;
int n,m,tot;
int h[N],e[N],ne[N],d[N];
int top[N],idx=0;
int f[N];
void add(int a,int b){
e[tot]=b; ne[tot]=h[a]; h[a]=tot++;
}
void topsort(){
queue<int> q;
for(int i=1;i<=n;i++){
if(!d[i]){
top[++idx]=i;
q.push(i);
}
}
while(q.size()){
int u=q.front(); q.pop();
for(int i=h[u];~i;i=ne[i]){
int j=e[i];
if(--d[j]==0){
top[++idx]=j;
q.push(j);
}
}
}
}
int main(){
scanf("%d %d",&n,&m);
memset(h,-1,sizeof(h));
for(int i=1;i<=m;i++){
int a,b;
scanf("%d %d",&a,&b);
add(a,b); d[b]++;
}
topsort();
for(int i=1;i<=idx;i++) f[i]=1;
for(int i=1;i<=idx;i++){
int u=top[i];
for(int j=h[u];~j;j=ne[j]){
int v=e[j];
f[v]=max(f[v],f[u]+1);
}
}
for(int i=1;i<=n;i++) printf("%d\n",f[i]);
return 0 - 0 ;
}