反向建边,倒序用下标更新ans数组,dfs搜索,若遇统计过的点返回
#include<bits/stdc++.h>
using namespace std;
using ll = long long ;
/*====================*/
const int N=1e5+10;
/*====================*/
const int INF = 0x3F3F3F3F;
const int MOD = 80112002;
/*====================*/
class C_Graph{//建图
public:
int n;
struct Edge{
int u,v,w;
Edge(int _u = 0,int _v = 0,int _w = 0){
u = _u,v = _v,w = _w;
}
friend bool operator<(const Edge &a,const Edge &b){
return a.w < b.w;
}
int operator()(int x)const{
return u^v^x;
}
};
vector<Edge>edges;
vector<vector<int> >edge;
void Init(int n){
this -> n = n;
edge.assign(n + 1,vector<int>());
}
void AddEdge(int u,int v,int w = 0){
edges.push_back(Edge(u,v,w));
edge[u].push_back(edges.size() - 1);
}
};
/*====================*/
int ans[N],n;
void dfs(int res,int x, const C_Graph &g){//搜索,查点更新
if(ans[x] != -1) return ;
ans[x] = res;//要把自己更新
for(auto it : g.edge[x]){
dfs(res,g.edges[it](x),g);
}
}
/*====================*/
void Solve(){
int m;cin >> n >> m;
C_Graph g;g.Init(n);
for(int i = 1;i <= m;i++){
int u,v;cin >> u >> v;
g.AddEdge(v,u);
}
memset(ans,-1,sizeof ans);
for(int i = n;i >= 1;i--){//从大的小搜
dfs(i,i,g);
}
for(int i = 1;i <= n;i++){
cout << ans[i] << " ";
}
}
/*====================*/
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
int T=1;//cin>>T;
while(T--)Solve();
return 0;
}