Link to this code:
https://cses.fi/paste/3febffc363f54010ceed11/
#include <bits/stdc++.h>
using namespace std;
#define repeat(i,n) for(int i = 0 ; i < n ; i++)
#define repeat_range(i,a,n) for(int i = a ; i < n ; i++)
#define PB push_back
#define F first
#define S second
#define max_ll(a,b) ((a) > (b) ? (a) : (b))
#define min_ll(a,b) ((a) < (b) ? (a) : (b))
typedef long long ll;
typedef pair<int,int> pii;
const int INF = 1e9 ;
const int MOD = 1e9+7;
vector<vector<int>> adj_list ;
vector<int> min_node_subtree ;
vector<bool> visited ;
int n , m ;
void dfs1(int u, int p){
visited[u] = true ;
min_node_subtree[u] = u ;
for(int v : adj_list[u])
if(v != p){
visited[v] = true ;
dfs1(v,u) ;
min_node_subtree[u] = min(min_node_subtree[v],min_node_subtree[u]) ;
}
}
vector<int> result ;
void dfs2(int u, vector<bool> & visited2){
visited2[u] = true ;
for(int v : adj_list[u])
if(!visited2[v]){
visited2[v] = true ;
dfs2(v,visited2) ;
}
result.push_back(u) ;
}
int main() {
cin >> n >> m ;
adj_list.resize(n) ;
min_node_subtree.assign(n,0) ;
repeat(i,m){
int u , v ;
cin >> u >> v ;
u-- ; v-- ;
adj_list[v].push_back(u) ; // To do v you must do u first
}
/*
Algo : Start a DFS from 1 then , for each branch maintain the smallest node in that tree
choose the one with the smallest always
Now push in the result vector in the order
*/
visited.assign(n,0) ;
min_node_subtree.assign(n,INF) ;
for(int i = 0 ; i<n ; i++)
if(!visited[i])
dfs1(i,i) ;
// Sort the adj_list based on the min_node_subtree
for(int i = 0 ; i<n ; i++)
sort(
adj_list[i].begin(),adj_list[i].end(),
[&](int a, int b){return min_node_subtree[a] < min_node_subtree[b] ; }
) ;
// Now run the dfs on sorted_Adj_list
vector<bool> visited2(n,0) ;
for(int s = 0 ; s<n ; s++){
if(!visited2[s])
dfs2(s,visited2) ;
}
repeat(i,n)
cout << result[i] + 1 << " \n"[i==n-1] ;
return 0;
}