20分代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int MAX=1000010;
int head[MAX],ver[MAX],nxt[MAX],edge[MAX],dist[MAX],st[MAX],tot;
int ru[MAX],chu[MAX];
queue<int>q;
int maxn;
void add(int x,int y){
nxt[++tot]=head[x];
head[x]=tot;
ver[tot]=y;
}
void bfs(){
while(!q.empty()){
int f=q.front();
q.pop();
for(int i=head[f];i;i=nxt[i]){
int v=ver[i];
ru[v]--;
if(!ru[v]){
dist[v]=dist[f]+1;
q.push(v);
}
}
}
}
int main(){
cin>>n>>m;
int u,v;
for(int i=1;i<=m;i++){
cin>>u>>v;
ru[v]++;
chu[u]++;
add(u,v);
}
for(int i=1;i<=n;i++){
if(!ru[i]){
q.push(i);
dist[i]=1;
break;
}
}
bfs();
for(int i=1;i<=n;i++){
cout<<dist[i]<<endl;
}
return 0;
}