RT,拓扑排序+邻接表
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 200000+10 ,M=100000+10;
int n,m,e[N],ne[N],h[N],idx,d[M],cnt,sum,book[M],dis[M];
inline int read(){
int f=1,x=0; char ch;
do{ch=getchar();if(ch=='-')f=-1;} while(ch<'0'||ch>'9');
do{x=(x<<1)+(x<<3)+ch-'0';ch=getchar();} while(ch>='0'&&ch<='9');
return f*x;
}
inline void add(int a,int b){
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
inline void topsort(){
int que[M],head=1,tail=2;
for(int i=1;i<=n;i++){
if(!d[i]){
que[tail]=i;
tail++;
}
}
while(head<tail){
int t=que[head];
head++;
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i];
if(--d[j]==0){
que[tail]=j;
tail++;
dis[j]=dis[t]+1;
}
}
}
return ;
}
int main(){
memset(h,-1,sizeof h);
n=read(),m=read();
for(int i=1;i<=m;i++){
int x,y;
x=read(),y=read();
add(x,y);
d[y]++;
}
for(int i=1;i<=n;i++){
topsort();
printf("%d\n",dis[i]+1);
}
return 0;
}