Cod sursa(job #356912)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 17 octombrie 2009 15:03:28
Problema Sortare topologica Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.03 kb
#include<iostream>

using namespace std;

//definim clasa nod
class nod
{
public:

	int nr; 
	int noduri;
    int stg;
	int drp;
	int intrari;

	nod *urmator; 
	nod *ultim;
	
	nod(void):nr(0),noduri(0),stg(0),drp(0),intrari(0),urmator(NULL),ultim(NULL){};
};



//definim lista
class nd
{
public:
	
int nr;
nd *urm;

nd(void):nr(0),urm(NULL){};
};




nod v[50001];
nd *lista,*clista;


int main(void)
{
	
	freopen("sortaret.in","r",stdin);
	freopen("sortaret.out","w",stdout);
	
	clista=lista;
	int n,m,i,x,y;
	
	cin>>n>>m;
	
	
	//creem vectorul cu listele de noduri
	for(i=1; i<=m; i++)
	{
		cin>>x>>y;
		
		if(v[x].noduri==0)
		{   
			nod *var=new nod;
            var->nr=y;
            var->urmator=NULL;
			v[x].noduri=1;
			v[x].urmator=var;
			v[y].intrari++;
			v[x].ultim=v[x].urmator;
		}
		
		
		
		else 
		{ 
			nod *var=new nod; 
		    
            var->nr=y;
            var->urmator=NULL;
			v[x].ultim->urmator=var;
			v[x].ultim=var;
            v[x].noduri++;
		    v[y].intrari++;
		}
	}
	
		
	
	
	int noduri=n;
	int primul=1;
	
	while(noduri)
	{
		int aux=primul;
		int j,noduri2=noduri;
		
		for(j=1; j<=noduri; j++)
		{
			
			//verificam daca are gradul interior 0
			if(v[aux].intrari==0){ if(aux==primul)primul++;
			                        
			                       //punem nodul in lista
								   nd *r=new nd;
			                       r->nr=aux;
								   clista->urm=r; 
								   clista=r;
								   
								   //"taiem" legaturile
								   
								   int k;
								   nod *auxiliar;
								   auxiliar=v[aux].urmator;
								   k=v[aux].noduri;
								   while(k){ v[auxiliar->nr].intrari--; auxiliar=auxiliar->urmator;}
								   aux=v[aux].drp;
								   noduri2--;
								   
								   
			}
								   
			                       
			
			
			
			
		}
		
		
		
		
		
		
		noduri=noduri2;
	}
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	cout<<n<<" "<<m;
	
	return 0;
}