La fermeture transitive

Description

ce programme resume quelque notions de base de la theorie des graphe la fermeture transitive d'un graphe l'existance d'un circuit d'un chemin dans un graphe ...etc

Source / Exemple :


#include<stdio.h>
#include<conio.h>
#include <stdlib.h>
#include <time.h>
int n;
void test(int a,int b,int t[5][5])

	{
	int t1[5][5],t2[5][5],k,i,j,l;
	if (t[a][b]!=0)
		  {
		  printf("il existe un chemin de sommet a vers b de  longueur 1\n\n\n");
		  }
  if (t[a][b]==0)
	  {
	  //transferer t dans t1
		  for (i=1;i<=n;i++)
		  for (j=1;j<=n;j++)
			 t1[i][j]=t[i][j];

	  }
		k=n-1;
	  prod:
	  if (k!=0)
	  {
			 for(i=1;i<=n;i++)
			 for(j=1;j<=n;j++)
			  t2[i][j]=0;

		  for (l=1;l<=n;l++)
		  for (j=1;j<=n;j++)
		  for (i=1;i<=n;i++)
			 t2[j][l]=t2[j][l]+t1[j][i]*t[i][l];

						//tranferer t2 dans t1

					for (i=1;i<=n;i++)
					for (j=1;j<=n;j++)
					  t1[i][j]=t2[i][j];

		  if (t1[a][b]!=0)
		  {
		  printf("il existe un chemin de sommet a vers b de  longueur %d\n\n\n",n-k+1);
		  goto fin;
		  }
		 k=k-1;
		 goto prod;
	  }
	  else
	  printf("il n'y a pas de chemin entre %d et %d\n",a,b);

 fin:
 }
								  // la procedure de chemin pour la question N°4
  //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 int chemin(int x,int y,int t[5][5])
	{
	int t1[5][5],t2[5][5],k,i,j,l,s;
		  s=0;
		  if (t[x][y]!=0)
			  s=1;

		  else
			  {
													 //transferer t dans t1
					  for (i=1;i<=n;i++)
					  for (j=1;j<=n;j++)
							t1[i][j]=t[i][j];

						k=n-1;
				 while(k!=0)
							{
								for (l=1;l<=n;l++)
								for (j=1;j<=n;j++)
								for (i=1;i<=n;i++)
									t2[j][l]=t2[j][l]+t1[j][i]*t[i][l];

												 //tranferer t2 dans t1
								for (i=1;i<=n;i++)
								for (j=1;j<=n;j++)
								 t1[i][j]=t2[i][j];

								if (t1[x][y]!=0)
								  s=1;

								k=k-1;
							}
				}
		 return s;
	}
///////////////////////////////////////*la procdure de la fermeture trasitive*//
int ferm(int t[5][5])
 {
		int m[5][5],m1[5][5],m2[5][5],m3[5][5],i,j,l,s;
																			//transferer t dans m1 etm2
		for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
		{
		m[i][j]=t[i][j];
		m2[i][j]=t[i][j];
		}

 startf:
																	 //calcul le prduit de m1=m*t
					  for (i=1;i<=n;i++)
					  for (j=1;j<=n;j++)
					  m1[i][j]=0;

		  for (l=1;l<=n;l++)
		  for (j=1;j<=n;j++)
		  for (i=1;i<=n;i++)
		  m1[j][l]=m1[j][l]+m[j][i]*t[i][l];

					//// vers le booleen
					 for (i=1;i<=n;i++)
					 for (j=1;j<=n;j++)
						 {
						 if(m1[i][j]!=0)
						 m1[i][j]=1;
						 }

					///////////////////////////////transfrer m1 dans m
					  for (i=1;i<=n;i++)
					  for (j=1;j<=n;j++)
							 m[i][j]=m1[i][j];

					 for (i=1;i<=n;i++)
					  for (j=1;j<=n;j++)
							 m3[i][j]=m2[i][j]+m[i][j];

					 //// vers le booleen
					 for (i=1;i<=n;i++)
					 for (j=1;j<=n;j++)
						 {
						 if(m1[i][j]!=0)
						 m3[i][j]=1;
						 }

s=1;
	for (i=1;i<=n;i++)
		for (j=1;j<=n;j++)
			{
			  if(m2[i][j]!=m3[i][j])
			  s=0;
			}

if (s==1)
{
	 for (i=1;i<=n;i++)
	 for (j=1;j<=n;j++)
	 t[i][j]=m2[i][j];

}
  else
  {
	 for (i=1;i<=n;i++)
	 for (j=1;j<=n;j++)
	 m1[i][j]=m2[i][j];
 //
	for (i=1;i<=n;i++)
	for (j=1;j<=n;j++)
	m2[i][j]=m1[i][j]+m[i][j];

	 /////////////////////////
	 for (i=1;i<=n;i++)
					{
						for (j=1;j<=n;j++)
							{
							if(m2[i][j]!=0)
							m2[i][j]=1;
							else
							m2[i][j]=0;
							}
					}
	 goto startf;
	}
return 0;
}
 ///////////////////////////////////////////////////////////////////////////////////////
void circuit(int t[5][5])
{
 int i,h;
 h=0;
 ferm(t);

 for(i=1;i<=n;i++)
 {
  if(t[i][i]==1)
  h=1;
 }
 if(h==0)
 printf("il n'existe pas de circuit \n\n");
 else
 printf ("il existe  aux moins un circuit dans G\n\n");
 }
 //////////////////////////////////////ensemble des successeurs//////////////////////////

void successeur(int t[5][5],int x )
 {
  int i;

	printf("l'ensemble des successeurs de %d C'est l'ensemble \nD={",x);
		  for (i=1;i<=n;i++)
		  {
		  if (t[x][i]==1)
		  printf("%d,",i);
		  }
	 printf("\b");
	printf("}\n");
}
 void warshall(int t[5][5])
 {
  int i,j,k;

  for(k=1;k<=n;k++)
	for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	 t[i][j]=t[i][j]+(t[i][k]*t[k][j]);

	for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	 {
	 if(t[i][j]!=0)
		t[i][j]=1;
	  }
    printf("*lamatrice associer à la fermeture transitive \na partir de l'algorithme de Wershall:\n\n");
	for(i=1;i<=n;i++)
	{
	for(j=1;j<=n;j++)
	 {
	 printf("     %d ",t[i][j]);
	 }
	 printf("\n\n\n");
	 }
											////////////////////////////
 }

						/*le programme principale */
void main()
{
int t[5][5],t1[5][5],m[5][5],t5[5][5],p,j,i,a,b,x,var;
	 printf("    ===========================================================\n");
	 printf("                     UNIVERSITE DE BEJAIA\n ");
	 printf("                   DEPARTEMENT D'INFORMATIQUE \n ");
	 printf("            ETUDIANT : TOUATI MOHAMED \n ");
	 printf("               MODLE DE RECHERCHE OPERATIONNELLE\n");
	 printf("    ===========================================================\n");
	 printf("                             ***bonjour***\n\n");
	  printf("TAPPEZ SUR UNE TOUCHE POUR COMANCER LES MANIPULATIONS :\n\n\n");
	  getch();
	  clrscr();
	 printf("    ===========================================================\n");
	 printf("                     UNIVERSITE DE BEJAIA\n ");
	 printf("                   DEPARTEMENT D'INFORMATIQUE \n ");
	 printf("            ETUDIANT : TOUATI MOHAMED \n ");
	 printf("               MODLE DE RECHERCHE OPERATIONNELLE\n");
	 printf("    ===========================================================\n\n");

time_t ti;
oui:
printf("introduire le nombre de sommet n  \n\n");
printf("n=");
scanf("%d",&n);
if (n>=5)
goto oui;

a:
printf(" pour avoir la matrice manualement tappez '1'  \n\n");
printf(" pour avoir la mtrice automatiquement tappez '2'  \n");
  scanf("%d",&p);
if(p!=1 && p!=2)
  {
	 goto a;
  }
if (p==1)
{
printf(" donnez maintenant les valeurs de la matrice:\n");
	for(i=1;i<=n;i++)
		{
		  for(j=1;j<=n;j++)
			  {
				ref:
				printf("X(%d,%d)=",i,j);
				scanf("%d",&t[i][j]);
				if (t[i][j]!=1&&t[i][j]!=0)
					{
					 printf("error!!!\a\n");
					printf("reffere l'introduction de la valeure de X(%d,%d)=0/1\n",i,j);
					 goto ref;
					 }
				}
		 }

}
else
{
srand((unsigned) time(&ti));
for(i=1;i<=n;i++)
	{
		 for(j=1;j<=n;j++)
			 {
			  t[i][j]=(rand() % 2);
			  printf("  %d    ",t[i][j]);
			  }
		 printf("\n\n\n");
	 }
 }
 getch();
 debvar:
 clrscr();
 //////////////////////////////////////////////////////
 //////////////////////////////////////////////////////
 /////////////////////////////debut////////////////////
 //////////////////////////////////////////////////////
 printf("                    * * * M E N U * * *\n\n");
 printf(" * AFFICHER LA MATRICE D'ADJACENCE........................(0)\n\n");
 printf(" * REINITIALISER LE GRAPHE................................(1)\n\n");
 printf(" * AFFECHER LES SOMMETS ET LES ARCS.......................(2)\n\n");
 printf(" * TESTER L'EXISTANCE D'UN CHEMIN.........................(3)\n\n");
 printf(" * AFFICHER LA MATRICE DE LA RELATION 'R'.................(4)\n\n");
 printf(" * CALCULER LA FERMETURE TRANSITIVE.......................(5)\n\n");
 printf(" * TESTER L'EXISTANCE DE CIRCUIT..........................(6)\n\n");
 printf(" * AFFICHER LES SUCCESSEURS D'UN SOMMET DONNE.............(7)\n\n");
 printf(" * ETABLIR LA FERMETURE TRANSITIVE DE 'WERSHLL'...........(8)\n\n");
 printf(" * TERMINER LE PROGRAMME..................................(9)\n");
 printf("                              CHOIX= ");
 scanf("%d",&var);
  if(var==0)
 {clrscr();
 goto var0;}
 if(var==1)
 {clrscr();
 goto oui;}
  if(var==2)
 {clrscr();
 goto var2;}
 if(var==3)
  {clrscr();
 goto var3;}
 if(var==4)
 {clrscr();
 goto var4;}
 if(var==5)
  {clrscr();
 goto var5;}
 if(var==6)
 {clrscr();
 goto var6;}
 if(var==7)
 {clrscr();
 goto var7;}
 if(var==8)
 {clrscr();
 goto var8;}
 if(var==9)
 {clrscr();
 goto var9;}
 if(var<0 ||var>9)
 {printf("la valeur choisit n'existe pas dans le menu!!\a\n");
 getch();
 clrscr();
 goto debvar;
 }
 var0:
 printf("M=\n");
		  for(i=1;i<=n;i++)
		  {
		  for(j=1;j<=n;j++)
		  {
			  printf("  %d    ",t[i][j]);
		  }
		  printf("\n\n\n");
		  }
		  getch();
 goto debvar;

 var2:
 printf(" \n l'ensemble des sommets X={ ");
  for(i=1;i<n;i++)
  printf("%d, ",i);
  printf("%d",n);
  printf("}");
 printf("\n l'ensemble des arcs G est U={");
  for(i=1;i<=n;i++)
	for(j=1;j<=n;j++)
	{ if(t[i][j]==1)
	  printf("(%d,%d)",i,j);

	}
	printf("}\n\n\n\n\n");
	getch(); //////////////////////////////////////////////var2
	goto debvar;
	var3:
	printf("introduire les deux sommets a et b \n");
	ra:
	printf("a=");
  scanf("%d",&a);
	 if (a>n ||a<=0)
	 {
	 printf("le sommet a n'existe pas!\a\n  ");
	 goto ra;
	 }
	 rb:
	 printf("b=");
  scanf("%d",&b);
	if (b>n ||b<=0)
	 {
	 printf("le sommet b n'existe pas!\a\n  ");
	 goto rb;
	 }
	test(a,b,t);
	getch();
	goto debvar;
	 clrscr();
			 var4:

	for(i=1;i<=n;i++)
		for(j=1;j<=n;j++)
		m[i][j]=chemin(i,j,t);

		 //afficage de la matrice aRb
  printf("On définie la matrice de la relation R tel que X x X--->{0,1},\n ");
  printf("                                             (x,y)|--->xRy,\n");
  printf("    xRy=1 si il existe un chemin de x vers y\n    xRy=0 si non\n\n");
  for(i=1;i<=n;i++)
		{
		for(j=1;j<=n;j++)
		{
		printf("%d       ",m[i][j]);
		}
		printf("\n\n\n");
		}
		getch();
		goto debvar;
//////////////////////////////////////////////////////////////////////////////////////////
////////////////////////question N°5//////////////////////////////
	  var5:

 clrscr();
 for(i=1;i<=n;i++)
 for(j=1;j<=n;j++)
 t1[i][j]=t[i][j];
  ferm(t1);
  printf("la matrice associée a la fermeture transitive est\n\n");
  for(i=1;i<=n;i++)
		{
		for(j=1;j<=n;j++)
		{
		printf("  %d    ",t1[i][j]);
		}
		printf("\n\n\n");
		}
  getch();
  goto debvar;
  ////////////////////////////////////
  var6:
circuit(t1);
	getch();
	 goto debvar;
	  var7:
	 printf("introduire le sommet x \n ");
	 succ:
	 printf("x=");
	 scanf("%d",&x);
			if (x<0 || x>n)
					{
					 printf("error!!!\a\n");
					printf("reffere l'introduction de la valeure de 0<=X<=%d\n\n",n);
					 goto succ;
					 }

	successeur(t,x);
		 getch();
	 goto debvar;

	var8:

					  for (i=1;i<=n;i++)
					  for (j=1;j<=n;j++)
						t5[i][j]=t[i][j];
	warshall(t5);

	getch();
	goto debvar;
	var9:
	printf("FIN DE L'APPLICATION!\n\n\n\n\n\n\n\n\n                        ****************MERCI****************\n\n\n\n\n\n\n\n\n\n\n\n");
  printf("                                   par Mr:TOUATI MOHAMED\n");
  printf("                                           et Mr:MEDJANI LARBI");
 }

Conclusion :


université de bejaia

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.