Pagini recente » Cod sursa (job #2480965) | Cod sursa (job #1118861) | Cod sursa (job #1907647) | Cod sursa (job #880385) | Cod sursa (job #1232569)
/*
Cerinta: 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.
*/
#include <fstream>
using namespace std;
//graf orientat aciclic (fara noduri) daca are noduri ar trebui sa dea eroare
//dar e combatuta prin vectorul culoare care are rolul de a memora daca vf k a fost pus sau nu
typedef struct nod {
int vf;
nod * next;
} *PNOD, NOD;
PNOD L[50005];//Listele de vecini pentru fiecare nod
PNOD adresa; // lista simplu inlantuita
int color[50005];//este un vector auxiliar pentru verificare
int N, M;
void Add( int x, int y) //reprezinta arcul de la x la y
{
NOD *aux; // p reprezinta doar o auxiliara ce contribuie la formarealiste L
aux = new NOD;
aux->vf = y;
aux->next = L[x];
L[x] = aux;
}
void citeste()
{
int i,x,y;
ifstream f("sortaret.in");
f>>N>>M;
for (i=1; i<=M; i++)
{
f>>x>>y;
Add(x,y);
}
f.close();
}
void Push( int k)
{
NOD *aux;
aux = new NOD;
aux->vf = k;
aux->next = adresa;
adresa =aux;
}
void DF( int k)
{
NOD *aux;
color[k]=1; //e o culoare intermediara inca nu a fost pus varful k
aux=L[k]; //L[k] e o sublista ce memoreaza vecinii nodului k
while (aux != NULL)
{
if (color [aux->vf]==0)
DF(aux->vf);
aux=aux->next;
}
color[k] =2;
Push(k); // se porneste dimtr-un nod si se introduc toti vecinii fiecarui nod
// in ordine inversa
}
void Sortare_Topologica()
{
int i;
for ( i = 1; i <= N; ++i )
if ( color[i] == 0 ) //inseamna ca nodul i inca nu a fost pus in lista adresa
DF( i );
}
void scrie()
{
NOD *aux;
ofstream g("sortaret.out");
aux=adresa;
while( aux!=NULL)
{
g<<aux->vf<<" ";
aux=aux->next;
}
g.close();
}
int main()
{
citeste();
Sortare_Topologica();
scrie();
return 0;
}