rt
注意:不要理会代码中那些奇奇怪怪的注释(
#include<bits/stdc++.h>
using namespace std;
struct node
{
int to , nxt;
}e[200100];
int n , m;
int head[200010] , tot = 0;
int rudu[100010] , topological[100010];
queue<int> q;
int cnt = 0;
int dp[100010];
void add(int u , int v)
{
++ tot;
e[tot].to = v;
e[tot].nxt = head[u];
head[u] = tot;
}
void Topological_sort()
{
for(int i = 1 ; i <= n ; i ++)
{
if(rudu[i] == 0) // 入度(手)为0,第一个被砍头(
{
q.push(i); // 载入史册(
topological[++ cnt] = i; // 拓扑排序被砍头的第一人(点)!
}
}
while(!q.empty()) // 赶尽杀绝
{
int u = q.front(); // 找到部队头领
q.pop(); // 寄!
for(int i = head[u] ; i != 0 ; i = e[i].nxt) // 诛九族!
{
int v = e[i].to; // 上一个点是吧
rudu[v] --; // 砍手!
if(rudu[v] == 0) // 手砍没了 , 就该砍头了(
{
q.push(v); // 载入史册(
topological[++ cnt] = v; // 拓扑排序被砍头的第cnt人(点)!
}
}
}
}
void input()
{
scanf("%d%d" , &n , &m);
for(int i = 1 ; i <= m ; i ++)
{
int u , v;
scanf("%d%d" , &u , &v);
add(u , v);
rudu[v] ++; // 这个人手的只数+1(((
}
}
void init()
{
for(int i = 1 ; i <= n ; i ++)
dp[i] = 1;
}
void dp_qwq()
{
for(int i = 1 ; i <= n ; i ++)
{
int u = topological[i];
for(int i = head[u] ; i != 0 ; i = e[i].nxt)
{
int v = e[i].to;
dp[v] = max(dp[u] + 1 , dp[v]);
}
printf("%d\n" , dp[i]);
}
}
void check()
{
for(int i = 1 ; i <= n ; i ++)
printf("%d " , topological[i]);
}
int main()
{
input();
Topological_sort();
init();
dp_qwq();
// check();
// 有Python那味了(
return 0;
}