Pagini recente » Cod sursa (job #629671) | Cod sursa (job #2606146) | Cod sursa (job #1694905) | Cod sursa (job #658903) | Cod sursa (job #915882)
Cod sursa(job #915882)
#include <stdio.h>
#include <stdlib.h>
/*
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
*/
typedef struct nod
{
int caracter;
int nr_pred;
struct nod_stiva *varf;
struct nod *urm;
}NOD;
typedef struct nod_stiva
{
NOD *nod_lista;
struct nod_stiva *urmator;
}NOD_STIVA;
NOD *cautare(int ch,NOD **sant1, NOD **sant2)
{
NOD *p;
(*sant2)->caracter=ch;
p=(*sant1)->urm;
while(p->caracter!=ch)
p=p->urm;
if(p==*sant2)
{
*sant2=(NOD *)malloc(sizeof(NOD));
(*sant2)->urm=0;
p->varf=0;
p->urm=*sant2;
p->nr_pred=0;
}
return p;
}
int main()
{
int N,M,i;
int x,y;
FILE *f,*g;
f=fopen("sortaret.in","r");
g=fopen("sortaret.out","w");
NOD *sant1,*sant2,*p,*q,*p1;
NOD_STIVA *r,*r1;
sant1=(NOD *)malloc(sizeof(NOD));
sant2=(NOD *)malloc(sizeof(NOD));
sant1->urm=sant2;
sant2->urm=0;
fscanf(f,"%d",&N);
fscanf(f,"%d",&M);
for(i=0; i<M; i++)
{
fscanf(f,"%d",&x);
fscanf(f,"%d",&y);
p=cautare(x,&sant1,&sant2);
q=cautare(y,&sant1,&sant2);
q->nr_pred++;
r=(NOD_STIVA *)malloc(sizeof(NOD_STIVA));
r->nod_lista=q;
r->urmator=p->varf;
p->varf=r;
}
p=sant1->urm;
p1=sant1;
while(p!=sant2)
{
if(p->nr_pred!=0)
{
p1=p;
p=p->urm;
}
else
{
fprintf(g,"%d ",p->caracter);
r=p->varf;
while(r!=0)
{
r->nod_lista->nr_pred--;
r1=r;
r=r->urmator;
free(r1);
}
p1->urm=p->urm;
free(p);
p=sant1->urm;
p1=sant1;
}
}
fclose(f);
fclose(g);
return 0;
}