Cod sursa(job #915882)

Utilizator adibossiseuMihalca Andrei adibossiseu Data 15 martie 2013 14:31:27
Problema Sortare topologica Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 2.67 kb
#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;
}