代码很好理解的(玖玖的代码):
#include<bits/stdc++.h>
using namespace std;
int n,m,num[100010],x,y,dp[100010],p,vis[100010];
vector<int> a[100010];
int dfs(int k){
if(dp[k]) return dp[k];
int maxs=0;
for(int i=0;i<num[k];i++){
if(vis[a[k][i]]!=p){
vis[a[k][i]]=p;
maxs=max(maxs,dfs(a[k][i]));
}
}
return max(maxs,k);
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
scanf("%d%d",&x,&y);
num[x]++;
a[x].push_back(y);
}
for(int i=n;i>=1;i--){
vis[i]=++p;
dp[i]=dfs(i);
}
for(int i=1;i<=n;i++) printf("%d ",dp[i]);
return 0;
}