317
Cerința
Se consideră un graf orientat aciclic cu n noduri și m arce. Să se determine sortarea topologică a nodurilor grafului, minimă lexicografic.
Date de intrare
Programul citește de la tastatură numerele n și m, iar apoi m perechi de numere naturale, separate prin spații, x y cu semnificația: există în graful orientat arcul (x, y).
Date de ieșire
Programul va afișa pe ecran, separate prin câte un spațiu, nodurile grafului în ordinea lexicografică a acestora.
Restricții și precizări
1 ≤ n ≤ 100.0001 ≤ m ≤ 500.000- Este garantat că graful orientat este aciclic, deci va exista o soluție
Exemplu
Intrare
6 7 3 6 3 1 6 1 5 1 2 5 4 1 4 2
Ieșire
3 4 2 5 6 1
Explicație
Digraful din exemplu este cel de mai jos.

Există mai multe soluții, precum 4,3,6,2,5,1, dar această soluție este mai mare din punct de vedere lexicografic.
#include <bits/stdc++.h>
using namespace std;
vector <int> G[100002];
set <int> Q;
int n , m , x , y , g[100002];
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= m ; i++)
{
cin >> x >> y;
G[x].push_back(y);
g[y]++;
}
for(int i = 1 ; i <= n ; i++)
if(g[i] == 0)Q.insert(i);
while(!Q.empty())
{
x = *(Q.begin());
Q.erase(x);
cout << x << " ";
for(int i : G[x])
{
g[i]--;
if(g[i] == 0) Q.insert(i);
}
}
}
Comentarii