Cod sursa(job #352949)

Utilizator MihaiGmihaig MihaiG Data 3 octombrie 2009 19:58:44
Problema Sortare topologica Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <stdio.h>
#include <vector>
#define MAX 500005
using namespace std;
FILE*f=fopen("sortaret.in","r");
FILE*g=fopen("sortaret.out","w");

int n,m,i,nod,nod2,k,gintern[MAX],lungime[MAX],solutie[MAX],j,p,u;
vector<int>graf[MAX];

void citire(){
	fscanf(f,"%d %d",&n,&m);
	for(i=1;i<=m;i++){
		fscanf(f,"%d %d",&nod,&nod2);
		graf[nod].push_back(nod2);
	}
	fclose(f);
}

void solve(){
	for(i=1;i<=n;i++){
		lungime[i] = graf[i].size();
	}
	for(i=1;i<=n;i++){
		for(j=0;j<lungime[i];j++){
			gintern[graf[i][j]]++;
		}
	}
	k=0;
	for(i=1;i<=n;i++){
		if(gintern[i]==0){
			k++;
			solutie[k]=i;
		}
	}
	u=k;
	p=1;
	while(p<=u){
		for(i=0;i<lungime[solutie[p]];i++){
			gintern[graf[solutie[p]][i]]--;
			if(gintern[graf[solutie[p]][i]]==0){
				u++;
				solutie[u]=graf[solutie[p]][i];
			}
		}
		p++;
	}
}

void afisare(){
	for(i=1;i<=n;i++){
		fprintf(g,"%d ",solutie[i]);
	}
}

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