#include #define GRAPHE "graphe" #define NMAX 32 typedef struct { int n; int mat[NMAX][NMAX]; } Graph; Graph read(char *name) { int i,j; Graph r; FILE *fp; fp = fopen(name,"r"); if (fp == NULL) { fprintf(stderr,"Je ne peux pas ouvrir %s\n",name); exit(-1); } fscanf(fp,"%d",&r.n); for (i = 0 ; i < r.n ; i++) for (j = 0 ; j < r.n ; j++) fscanf(fp,"%d",&r.mat[i][j]); fclose(fp); return r; } void topo(Graph g) { int printed = 0; /* nombre de sommets affiche's */ int i,j; int ones[NMAX]; /* nombre de 1 par ligne */ int encore; /* drapeau */ /* initialiser ones */ for (i = 0 ; i < g.n ; i++) { ones[i] = 0; for (j = 0 ; j < g.n ; j++) { if (g.mat[i][j]) ones[i]++; } } for(encore=1;encore;) /* tant que c'est possible... */ for(encore=i=0;!encore && i < g.n;i++) /* chercher une ligne de zeros */ if (ones[i] == 0) { ones[i] = -1; printf("%d ",i+1); printed++; for (j = 0 ; j < g.n ; j++) /* ajuster ones */ if (g.mat[j][i]) ones[j]--; encore = 1; /* chercher encore */ } printf("\n"); if (printed != g.n) { /* tous les sommets n'ont pas ete affiche's */ printf("Attention le graphe contient un cycle\n"); } } void main(void) { Graph g; g = read(GRAPHE); topo(g); }