// // paramètres : // // graphe = graphe orienté // s = sommet de départ // result = tableau de sommets à une distance inférieure ou égale à 2 du sommet s (result[i]=1 si distance(s,i)<=2, -1 sinon) // void distance_inf_2(tGraphe graphe, tNumeroSommet s, int result[]) { // nombre de sommets du graphe unsigned int n = grapheNbSommets(graphe); int nSuccesseur_de_s = grapheNbSuccesseursSommet(graphe,s); int nSuccesseur_de_y; tNumeroSommet x, y; tNumeroSommet tab[n]; // variable de parcours unsigned int i; /* Pour eviter des erreurs */ for(i =0; i< n; i++){ tab[n] =-1; } /* boucle principale */ for (i=0; i<nSuccesseur_de_s; i++){ // y est le nom du successeur courant x = grapheSuccesseurSommetNumero(graphe, x, i); tab[x] = 1; result[x] = 1; nSuccesseur_de_y = grapheNbSuccesseursSommet(graphe,x); for(int j =0; j< nSuccesseur_de_y; j++){ y = grapheSuccesseurSommetNumero(graphe, x, i); //Si on ne la pas deja traité if(tab[y] == -1){ tab[y] = 1; result[y] = 2; } } } }
// // paramètres : // // graphe = graphe orienté // s = sommet de départ // result = tableau de sommets accessibles depuis s (result[i]=1 si i est accessible depuis s, -1 sinon) // void parcours_largeur(tGraphe graphe, tNumeroSommet s, int result[]) { // nombre de sommets du graphe unsigned int n = grapheNbSommets(graphe); // le tableau de couleurs tCouleur tabCouleurs[n]; // la file tFileSommets file; // sommets x,y tNumeroSommet x, y; // variable de parcours unsigned int i; /* initialisation */ // colorier tous les sommets en bleu for (i=0; i<n; i++) { tabCouleurs[i] = BLEU; } // initialiser la file file = fileSommetsAlloue(); // colorier s en vert tabCouleurs[s] = VERT; // enfiler s fileSommetsEnfile(file, s); /* boucle principale */ // tant que la file n'est pas vide while (!fileSommetsEstVide(file)) { // x = tête de file x = fileSommetsDefile(file); // parcours de tous les successeurs for (i=0; i<grapheNbSuccesseursSommet(graphe,x); i++) { // y est le nom du successeur courant y = grapheSuccesseurSommetNumero(graphe, x, i); if (tabCouleurs[y] == BLEU) { // colorier y en vert et l’enfiler tabCouleurs[y] = VERT; fileSommetsEnfile(file, y); } } tabCouleurs[x] = ROUGE; } // libérer la file fileSommetsLibere(file); // tous les sommets en rouge sont accessibles for (i=0; i<n; i++) { if (tabCouleurs[i] == ROUGE) result[i] = 1; else result[i] = -1; } }
/* * Boucle principal */ void traitement_pile(tPileSommets pile, tNumeroSommet xSommet, int i[MAX_SOMMETS], tGraphe graphe, tTabCouleurs couleurs){ tNumeroSommet iSucc; tNomSommet nomSommet; tNomSommet nomSommet2; int trouver = 0; int nSucc =0; int j =0; i[xSommet] = i[xSommet] + 1; nSucc = grapheNbSuccesseursSommet(graphe, xSommet); while(i[xSommet] <= nSucc && trouver == 0){ iSucc = grapheSuccesseurSommetNumero(graphe, xSommet, j); grapheRecupNomSommet(graphe, iSucc, nomSommet); grapheRecupNomSommet(graphe, xSommet, nomSommet2); printf("sommet x %s\n", nomSommet2); printf("succ du sommet x %s\n", nomSommet); printf("sommet %d\n", i[xSommet]); printf("couleur i %d\n",couleurs[iSucc] ); printf("BLEU = %d\n", BLEU); printf("-----------------------------\n"); if(couleurs[iSucc] == BLEU){ trouver = 1; } else{ i[xSommet] = i[xSommet] +1; j++; } } if(trouver == 1){ couleurs[iSucc] = VERT; printf("empile \n"); pileSommetsEmpile(pile, iSucc); } else{ couleurs[xSommet] = ROUGE; printf("depile \n"); pileSommetsDepile(pile); } }
void parcourLarg(tGraphe graphe, tNomSommet som) { int nb_sommets; tNumeroSommet current; //tNomSommet destination; nb_sommets = grapheNbSommets(graphe); numerosParcourus = (tNumeroSommet*)malloc(nb_sommets*sizeof(tNumeroSommet)); numerosEnfiles = (tNumeroSommet*)malloc(nb_sommets*sizeof(tNumeroSommet)); current = grapheChercheSommetParNom(graphe, som); enfiler(current); while(!fileEstVide()){ int i, nb_successeurs; tNomSommet sommet; current = numerosEnfiles[enfilesIndex++]; grapheRecupNomSommet (graphe, current, sommet); printf(" %s ",sommet); if (grapheEstOriente(graphe)) { nb_successeurs = grapheNbSuccesseursSommet(graphe,current); for ( i = 0 ; i < nb_successeurs ; i++ ){ enfiler(grapheSuccesseurSommetNumero(graphe,current,i)); } } else { nb_successeurs = grapheNbVoisinsSommet(graphe,current); for ( i = 0 ; i < nb_successeurs ; i++ ){ enfiler(grapheVoisinSommetNumero(graphe,current,i)); } } } printf("\n"); free(numerosParcourus); free(numerosEnfiles); }
/* Affichage */ void grapheAffiche(tGraphe graphe) { tNomSommet nom; tNumeroSommet i, j, successeur, predecesseur; tValeurArc val; tArc arc; /* Affiche la liste des sommets et leur nom */ printf("Type de l'arbre : "); if (grapheEstOriente(graphe)) printf("orientee"); else printf("non orientee"); printf("\n\n"); printf("Nombre de sommets : %d\n\n", grapheNbSommets(graphe)); printf("Liste des sommets avec leurs numeros:\n"); for(i=0; i < grapheNbSommets(graphe);i++) { grapheRecupNomSommet(graphe, i, nom); printf("- %d : %s\n", i, nom); } printf("\n"); /* Matrice d'adjacence */ printf("Matrice d'adjacence :\n"); printf("%2s", ""); for(i=0; i < grapheNbSommets(graphe);i++) { printf("%7d", i); } printf("\n"); for(i=0; i < grapheNbSommets(graphe);i++) { printf("%3d ", i); for(j=0; j < grapheNbSommets(graphe);j++) { if (grapheExisteArcEntre(graphe,i,j)) { val = grapheRecupValeurArc(graphe,i,j); printf("%6.2f ", val);} else printf(" "); } printf("\n"); } printf("\n"); /* Affiche les voisins, successeurs, prédecesseurs */ if (grapheEstOriente(graphe)) { /* affichage des successeurs */ printf("Liste des successeurs :\n"); for(i=0; i < grapheNbSommets(graphe);i++) { grapheRecupNomSommet(graphe, i, nom); printf("%s : ", nom); for(j=0; j<grapheNbSuccesseursSommet(graphe, i); j++) { successeur = grapheSuccesseurSommetNumero(graphe, i, j); grapheRecupNomSommet(graphe, successeur, nom); printf("%s=%.2f ", nom, grapheRecupValeurArc(graphe, i, successeur)); } printf("\n"); } /* affichage des prédécesseurs */ printf("\nListe des predecesseurs :\n"); for(i=0; i < grapheNbSommets(graphe);i++) { grapheRecupNomSommet(graphe, i, nom); printf("%s : ", nom); for(j=0; j<grapheNbPredecesseursSommet(graphe, i); j++) { predecesseur = graphePredecesseurSommetNumero(graphe, i, j); grapheRecupNomSommet(graphe, predecesseur, nom); printf("%s=%.2f ", nom, grapheRecupValeurArc(graphe, predecesseur, i)); } printf("\n"); } } else { /* le graphe n'est pas orienté */ printf("Liste des voisins :\n"); for(i=0; i < grapheNbSommets(graphe);i++) { grapheRecupNomSommet(graphe, i, nom); printf("%s : ", nom); for(j=0; j<grapheNbVoisinsSommet(graphe, i); j++) { successeur = grapheVoisinSommetNumero(graphe, i, j); grapheRecupNomSommet(graphe, successeur, nom); printf("%s=%.2f ", nom, grapheRecupValeurArc(graphe, i, successeur)); } printf("\n"); } } printf("\n"); /* Affiche la liste des arcs */ printf("Liste des arcs :\n"); for(i=0; i < grapheNbArcs(graphe); i++) { arc = grapheRecupArcNumero(graphe, i); grapheRecupNomSommet(graphe, arc.orig, nom); printf("%s", nom); if (grapheEstOriente(graphe)) printf(" -> "); else printf(" -- "); grapheRecupNomSommet(graphe, arc.dest, nom); printf("%s ",nom); printf(" = %.2f\n", arc.val); } }
void graphe2visu (tGraphe graphe, char* outfile) { FILE *fic; /* le fichier .dot dan lequel on va ecrire*/ char commande[80]; /* la commande appeller par sprintf plus bas */ char dotfile[80]; /* le fichier dot pour creer le ps */ int nb_sommet, i, j, nb_successeur, ret; tNomSommet origine; tNomSommet destination; /* on va creer un fichier pour graphviz, dans le fichier "outfile".dot */ strcpy(dotfile, outfile); strcat(dotfile, ".dot"); /* on ouvre le fichier .dot en ecriture */ fic = fopen(dotfile, "w"); if (fic==NULL) halt("Ouverture du fichier %s en ecriture impossible\n", dotfile); /* on recupere le nombre de sommet du graphe*/ nb_sommet = grapheNbSommets(graphe); if (grapheEstOriente(graphe)) { fprintf(fic, "digraph {\n"); /* digraph pour oriente */ for (i=0; i<nb_sommet;i++) { /* on recupere le nb de successeur du sommet*/ nb_successeur = grapheNbSuccesseursSommet(graphe,i); for (j=0;j<nb_successeur;j++) { /* on recupere le nom du sommet i et on le stock dans la variable origine */ grapheRecupNomSommet(graphe,i,origine); /* on recupere le nom du successeur j du sommet i et on le stock dans la variable destination*/ grapheRecupNomSommet(graphe,grapheSuccesseurSommetNumero(graphe,i,j),destination); /* -> pour oriente*/ fprintf(fic, "\t%s -> %s;\n", origine, destination); } } fprintf(fic, "}"); } else { fprintf(fic, "graph {\n"); /* graph pour non oriente */ for (i=0; i<nb_sommet;i++) { /* on recupere le nb de voisin du sommet*/ nb_successeur = grapheNbVoisinsSommet(graphe,i); for (j=0;j<nb_successeur;j++) { /* on recupere le nom du sommet i et on le stock dans la variable origine */ grapheRecupNomSommet(graphe,i,origine); /* on recupere le nom du voisin j du sommet i et on le stock dans la variable destination*/ grapheRecupNomSommet(graphe,grapheVoisinSommetNumero(graphe,i,j),destination); /* -- pour non oriente*/ if (strcmp(origine, destination) < 0) fprintf(fic, "\t%s -- %s;\n", origine, destination); } } fprintf(fic, "}"); } fclose(fic); /* on stock dans commande la commande qui permet a partir d'un .dot de creer un .ps*/ sprintf(commande, "dot -Tps %s -o %s.ps", dotfile, outfile); /* on appelle la fonction stocker dans commande */ ret = system(commande); if (WEXITSTATUS(ret)) halt("La commande suivante a echoue \n%s\n", commande); }