Cod sursa(job #798059)

Utilizator florin.ilieFlorin Ilie florin.ilie Data 15 octombrie 2012 17:39:39
Problema Sortare topologica Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>

using namespace std;

int n,m;
struct nod{
	int x;
	nod *urm;
};

struct varf{
	int ok;
	int viz;
	nod *p;
	nod *u;
}*a[1000000];

void adaugare_prim(int x,nod *&p,nod *&u)
{
	p=new nod;
	p->x=x;
	p->urm=NULL;
	u=p;
}

void adaugare_sf(int x,nod *&u)
{
	nod *q=new nod;
	q->x=x;
	q->urm=NULL;
	u->urm=q;
	u=q;
}

void stergere (nod *&l)
{
	nod *q=l->urm;
	if(l->urm){
		l->x=l->urm->x;
		l->urm=l->urm->urm;
	}else{
		delete l;
		l=NULL;
	}
	delete q;
}

nod *c,*uc,*sol,*solu;
void citire ()
{
	freopen("sortaret.in","r",stdin);
	int x,y;
	scanf("%d %d",&n,&m);
	for(int i=1;i<=n;i++){
		a[i]=new varf;
		a[i]->viz=0;
		a[i]->ok=0;
		a[i]->p=NULL;
		a[i]->u=NULL;
	}
	for(int i=0;i<m;i++)
	{
		scanf("%d %d",&x,&y);
		if(!a[x]->p){
			adaugare_prim(y,a[x]->p,a[x]->u);
		}
		else
			adaugare_sf(y,a[x]->u);
		a[y]->ok=1;
	}
	for(int i=1;i<=n;i++)
		if(a[i]->ok==0){
			if(!c)
				adaugare_prim(i,c,uc);
			else
				adaugare_sf(i,uc);
		}		
}
int ver(int x)
{
	for(int i=1;i<=n;i++)
		for(nod *j=a[i]->p;j;j=j->urm)
			if(j->x==x)
				return 0;
	return 1;
}

void parc ()
{
	for(nod *i=c;i;i=i->urm){
		if(!sol)
			adaugare_prim(i->x,sol,solu);
		else
			adaugare_sf(i->x,solu);
		for(;a[i->x]->p;){
			int x=a[i->x]->p->x;
			stergere(a[i->x]->p);
			if(ver(x))
				adaugare_sf(x,uc);
		}
	}
}

void afisare ()
{
	freopen("sortaret.out","w",stdout);
	for(nod *i=sol;i;i=i->urm)
		printf("%d ",i->x);
	printf("\n");
}

int main ()
{
	citire();
	parc();
	afisare();
	return 0;
}