Cod sursa(job #1232569)

Utilizator florinpocolPocol Florin florinpocol Data 23 septembrie 2014 12:35:54
Problema Sortare topologica Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
/*
  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;
}