#include #include #if 0 #define n 4 #define a 5 #else #define n 11 #define a 12 #endif typedef int graphe1[n][n]; typedef int graphe2[2*a]; typedef struct maillon maillon, *liste; struct maillon{int s; liste suite;}; typedef liste graphe3[n]; /* void affg(graphe g) { int i,j; pour tout arc i-->j du graphe g printf("%d->%d ",i,j); printf("\n"); } */ void affg1(graphe1 g1) { int i,j; for(i=0;ij printf("%d->%d ",i,j); printf("\n"); } void affg2(graphe2 g2) // les arcs sont g2[0]-->g2[1], g2[2]-->g2[3], ... g2[2*a-2]-->g2[2*a-1] { int k; for(k=0; k<2*a;k=k+2) // pour k=0, 2, 4, ... 2*a-2 c'est-à-dire pour tout arc g2[k]-->g2[k+1] printf("%d->%d ",g2[k],g2[k+1]); printf("\n"); } void affg3(graphe3 g3) { int i; liste p; for(i=0;isuite) // pour tout maillon *p de la liste chaînée g3[i], des successeurs de i. printf("%d->%d ",i,p->s); printf("\n"); } /* void gxgy(graphex gx, graphey gy) // gy=gx { gy=le graphe vide d'arc tout arc de gx est ajouté à gy } */ void g1g2(graphe1 g1, graphe2 g2) { int i, j, k=0; // le graphe g2 est initialement vide d'arc, car for(i=0;ij g2[k++]=i, // i et j sont ajoutés au bout du tableau g2 g2[k++]=j; } void g2g1(graphe2 g2, graphe1 g1) { int i,j,k; for(i=0;ij est noté absent du graphe g1 for(k=0;k<2*a;k+=2) // tout arc g2[k]-->g2[k+1] de g2 g1[g2[k]][g2[k+1]]=1;// est noté présent dans g1 } void g1g3(graphe1 g1, graphe3 g3) { int i,j,k; for(k=0;ks=j; p->suite=g3[i]; g3[i]=p; } } void g3g1(graphe3 g3, graphe1 g1) { int i,j; liste p; for(i=0;isuite) g1[i][p->s]=1; } void g2g3(graphe2 g2, graphe3 g3) { int i,k; for(i=0;is=j; p->suite=g3[i]; g3[i]=p; } } void g3g2(graphe3 g3, graphe2 g2) { int i,k=0; liste p; for(i=0;isuite) g2[k++]=i, g2[k++]=p->s; } void profondeur1(graphe1 g1,int pere[n], int depart) { void parcours(int i, int p) { int j; if(pere[i]>=0) return; pere[i]=p; for(j=0;j=0) return; pere[i]=p; for(q=g3[i];q;q=q->suite) parcours(q->s,i); } int i; for(i=0;i=0) return; pere[i]=p; for(k=tete[i];k!=-1;k=suite[k]) parcours(g2[2*k+1],i); } int i; tete_suite(g2,tete); for(i=0;ifi;) for(i=f[fi++],j=0;jfi;) for(k=tete[i=f[fi++]];k>=0;k=suite[k]) if(pere[j=g2[2*k+1]]<0) pere[f[fj++]=j]=i; } void largeur3(graphe3 g3, int pere[n], int depart) { int fi=0, fj=0, i, j, f[n]; liste p; for(i=0;ifi;) for(p=g3[i=f[fi++]];p;p=p->suite) if(pere[j=p->s]<0) pere[f[fj++]=j]=i; } void retourne1(graphe1 g1) { int i,j,x; for(i=0;isuite, j=p->s, p->s=i, p->suite=g3[j], g3[j]=p; } int nbcfc1(graphe1 g1, int cfc[n]) //nombre de composantes fortement connexes { int fin[n], h=0, nbcfc=0; void parcours1(int i) { if(cfc[i]) return; cfc[i]=-1; int j; for(j=0;j=0) return; cfc[i]=nbcfc; int j; for(j=0;j=0;k=suite[k]) parcours1(g2[2*k+1]); fin[h++]=i; } void parcours2(int i) { if(cfc[i]!=-1) return; cfc[i]=nbcfc; int k; for(k=tete[i];k>=0;k=suite[k]) parcours2(g2[2*k+1]); } tete_suite(g2,tete); int i; for(i=0;isuite) parcours1(p->s); fin[h++]=i; } void parcours2(int i) { if(cfc[i]>=0) return; cfc[i]=nbcfc; liste p; for(p=g3[i];p;p=p->suite) parcours2(p->s); } int i; for(i=0;i