1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
| #include <cstdlib>
#include <iostream>
#define N 5
/* ce programme calcule la compante connexe du sommet d'un graphe.
le graphe est stocké en utilisant la représentation version
dictionnaire il sera stocké dans un tableau de dimension N*N.
N étant le nombre de sommet du graphe.*/
int comp();
int lecture(void); //fonction de lecture du graphe
int affi(void); //fonction d'affichage du graphe
int x[N][N], //tableau des sommets
result[N+1],
rp[N], //tableau de la composante connexe positive
rn[N], //tableau de la composante connexe negative
pos,neg, //indice de fin des tableaux X+ et X-
verif[N+1], //tableau pour verifier tout le graphe
ajout, //position d'ajout dans le tableau des résultats
k,i,j, //indice de recherche dans le tableau des résultats
a; //sommet dont on cherche la composante connexe
using namespace std;
int main(int argc, char *argv[])
{
printf("\n\ttapez les sommets tel qu'il existe un arc sortant du point");
lecture();
int e=1;
{
printf("\n\n\ttapez le num du sommet dont on cherche la composante connexe: ");
scanf("%i",&a);
a--;
//calcul de X+ tous les sommets x tel qu'il existe un chemin de x vers a
comp();
pos=k;
printf("\n\tpos = %i\n",pos);
printf("\n\n les sommets ayant une chaine de a vres sont:\n");
for(i=0;i<k;i++){
rp[i]=result[i];
printf(" %i.",rp[i]+1);
}
printf("\n\ttapez les sommets tel qu'il existe un arc entrant vers le point");
lecture();
//calcul de X- tous les sommets x tel qu'il existe un chemin de x vers a
comp();
neg=k;
printf("\n\tneg = %i\n",neg);
printf("\n\n les sommets ayant une chaine de a vres sont:\n");
for(i=0;i<k;i++){
rn[i]=result[i];
printf(" %i.",rn[i]+1);
}
e++;
printf("\n\n");printf("\n\n");
// -------------------------on réalise l'intersection entre les deux tableaux
result[0]=a;
k=1;
for(i=0;i<pos;i++){
a=1;
for(j=0;(j<neg)&&(a);j++){
if(rp[i]==rn[j]){
a=0;
result[k]=rp[i];
k++;
}
}
}
affi();
}
system("PAUSE");
return EXIT_SUCCESS;
}
//--------------------------pour lire le graphe
int lecture()
{
int i,j,p;
for(j=0;j<N;j++)for(i=0;i<N;i++)x[i][j]=0;
printf("\n");
for(i=0;i<N;i++)
{
printf("\n\ntapez pour le point: %i (pour finir tapez -1)\n\n",i+1);
do {
scanf("\n%i",&p);
if(p!=-1){
x[i][p-1]=1;
}
}while(p!=-1);
}
return 0;
}
//----------------------------------------------pour afficher le résultat
int affi(void)
{
printf("\n\n le résultat est:\n");
for(i=0;i<k;i++)printf("__%i__",result[i]+1);
return 0;
}
//calcule la composante connexe pur le point a entré à l'écran
int comp()
{
//initialisation des paramètres
k=0;
ajout=1;
for(i=0;i<N;i++)result[i]=0;
for(i=0;i<N;i++)verif[i]=1;
result[0]=a;
verif[a]=0;
while(k!=ajout)
{
for(i=0;i<N;i++)
{
if((x[result[k]][i])&&(verif[i]))
{
result[ajout]=i;
ajout++;
}
}
verif[result[k]]=0;
k++;
}
return 1;
} |
Partager