Cod sursa(job #793765)

Utilizator noctavianNastasie Ion Octavian noctavian Data 3 octombrie 2012 23:09:38
Problema Sortare topologica Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.1 kb
#include <stdio.h>
#include <stdlib.h>

typedef struct {
	int viz;
	int *vec;
	int nvec;
} state;

void add(state* viz, int a, int b) {
	viz[a].vec = (viz[a].nvec == 0 ? (int*)malloc(sizeof(int)) : (int*)realloc(viz[a].vec,(viz[a].nvec + 1)*sizeof(int)));
	viz[a].vec[viz[a].nvec] = b;
	viz[a].nvec++;
}

int sort(const void *x, const void *y) {
	int *a = (int*)x;
	int *b = (int*)y;
	return *a - *b;
}

void vizit(state* viz, int nod, FILE *fis) {
	int i;
	viz[nod].viz = 1;
	fprintf(fis, "%i ", nod);
	for(i = 0; i < viz[nod].nvec; i++)
		if(viz[viz[nod].vec[i]].viz == 0)
			vizit(viz, viz[nod].vec[i], fis);
}
int main() {
	int x, y, N, M, i, j;
	state *viz;
	FILE *fis;

	fis = fopen("sortaret.in", "rt");
	fscanf(fis, "%i %i", &N, &M);
	viz = (state*)calloc(N+1, sizeof(state));
	for(i = 0; i < M; i++) {
		fscanf(fis, "%i %i", &x, &y);
		add(viz, x, y);
	}
	fclose(fis);

	for(i = 1; i <=N; i++)
		if(viz[i].nvec > 0)
			qsort(viz[i].vec, viz[i].nvec,  sizeof(int), sort);	

	fis = fopen("sortaret.out","wt");
	for(i = 1; i <=N; i++)
		if(viz[i].viz == 0)
			vizit(viz, i, fis);
	fclose(fis);

	free(viz);
	return 0;
}