倒序建边,用邻接表
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn = 1e5 + 10;
vector<int> v[maxn];
int n,m;
int used[maxn],A[maxn];
void DFS(int x,int s){
if(A[x])return ;
A[x]=s;
for(int i=0;i<v[i].size();i++)DFS(v[x][i],s);
}
int main(){
memset(A,0,sizeof(A));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y;scanf("%d%d",&x,&y);
v[y].push_back(x);
}
for(int i=n;i>0;i--)DFS(i,i);
for(int i=1;i<=n;i++)
printf("%d ",A[i]);
printf("\n");
return 0;
}