Cerința
Se dă un graf orientat aciclic cu N
noduri numerotate de la 1
la N
. Să se realizeze o sortare topologică a nodurilor.
Date de intrare
Fișierul de intrare topsort.in
conține pe prima linie numerele N M
, reprezentând numărul de noduri și numărul de arce din graf, iar pe următoarele M
linii câte o pereche de noduri i j
, cu semnificația că în graf există arcul (i j)
.
Date de ieșire
Fișierul de ieșire topsort.out
va conține pe prima linie cele N
noduri ale grafului, separate prin exact un spațiu, în ordinea dată de sortarea topologică.
Restricții și precizări
1 ≤ N ≤ 100000
1 ≤ M ≤ 400000
Exemplu
topsort.in
7 10 1 2 2 5 3 4 3 5 4 5 7 1 7 2 7 4 7 5 7 6
topsort.out
7 6 3 4 1 2 5
Explicație
#include <bits/stdc++.h> using namespace std; ifstream cin("topsort.in"); ofstream cout("topsort.out"); vector <int> G[100001]; vector <int> L; int n , m , x , y , v[100001]; void dfs(int nod) { v[nod] = 1; for(auto i : G[nod]) if(!v[i]) v[i] = 1 , dfs(i); L.push_back(nod); } int main() { cin >> n >> m; for(int i = 1 ; i <= m ; i++) { cin >> x >> y; G[x].push_back(y); } for(int i = 1 ; i <= n ; i++) if(!v[i]) dfs(i); for(int i = L.size() - 1 ; i >= 0 ; i--) cout << L[i] << " "; }