Sortare topologica

download Sortare topologica

of 7

Transcript of Sortare topologica

Sortare topologica O sortare topologica a varfurilor unui graf orientat aciclic este o operatie de ordonare liniara a varfurilor, astfel incat, daca exista un arc ( i, j ), atunci i apare inaintea lui j in aceasta ordonare. Date de intrare In fisierul de intrare sortaret.in vom avea pe prima linie doua numere intregi N si M. Pe fiecare dintre urmatoarele M linii se vor afla cate doua numere intregi, separate intre ele printr-un spatiu, X si Y, cu semnificatia ca exista arc de la nodul X catre nodul Y. Date de iesire Fisierul de iesire sortaret.out va contine pe o singura linie N numere separate intre ele prin spatii, care reprezinta sortarea topologica a nodurilor grafului dat. Daca exista mai multe solutii se va afisa oricare. Restrictii 1 N 50000 1 M 100000 Pot exista mai multe arce intre doua noduri X si Y Exemplusortaret.insortaret.out 98 12 13 34 35 59 46 47 48 123467859 Indicatii de rezolvare O scurta prezentare a acestui subiect gasiti aici Algoritmul de Sortare Topologica il gasiti foarte bine explicat si in cartea Introducere in algoritmi, Thomas Cormen, editura Agora, Cluj-Napoca. O idee de rezolvare este sa introducem, pe rand, intr-o lista, nodurile care la un moment dat un gradul exterior zero. Odata ce un nod este introdus in lista, vom scoate nodul respectiv din graf si vom considera in continuare graful ramas. O implementare directa are complexitatea O(N2) si se gaseste aici. #include

#include #include using namespace std; #define MAXN 50100 #define pb push_back int N, M, viz[MAXN], deg[MAXN]; vector G[MAXN]; void solve_and_write(void) { int i, j, k; for(i = 1; i next = adresa;

adresa = p; } void Write() { freopen( "sortaret.out", "w", stdout ); for ( PNOD p = adresa; p; p = p->next ) printf( "%d ", p->vf ); }

Rezolvare gasita de mine: #include #include using namespace std; int n, m, grad[100000], coada[100000]; vector vecini[50100]; void rezolvare() { int x; coada[0]=0; for (x=1;x