Graphes/TP/TP2.md

3.0 KiB

TP Graphes 2 : Chemins et connexité

Le TP est prévu pour être fait en utilisant le codage des graphes à l'aide de matrices d'adjacence.


Exercice 0 : Affichage

Question : Ecrire une fonction permettant d'afficher une matrice carrée (la taille de la matrice sera donnée en argument) :

void afficherMatrice(int **m,int taille);

Question : Ecrire une fonction permettant d'afficher la matrice d'adjacence d'un graphe donné en argument :

void afficherAdjacence(graphe g);

Exercice 1 : Chemins de longueur fixe

La multiplication de matrices carrées se fait grâce à la fonction de prototype :

int** multiplicationMatriceCarre(int **a,int **b,int size);

Le code de la fonction est donné ci-dessous. Si vous le souhaitez, vous pouvez ignorer le code et faire la fonction vous-même.

int** multiplicationMatriceCarre(int **a,int **b,int size){
    int** res=calloc(size,sizeof(int*));
    int i,j,k;
  for(i=0;i<size;i++){
    res[i]=calloc(size,sizeof(int));
  }
  for(i=0;i<size;i++){
      for(j=0;j<size;j++){
        for(k=0;k<size;k++){
          res[i][j]+=a[i][k]*b[k][j];
        }
      }
  }
    return res;
}

Question : En utilisant la multiplication de matrices carrées, créez une fonction renvoyant une matrice contenant les chemins d'une longueur donnée :

int** nombreDeChemins(graphe g,int longueur);

Exercice 2 : Connexité

Un graphe (orienté) est (fortement) connexe si pour toute paire de sommet (x,y), il existe un chemin de x à y. De plus, s'il existe un chemin de x à y, alors il en existe un de longueur au plus n, où n est l'ordre du graphe.

Question : Ecrire la fonction int estConnexe(graphe g); renvoyant 1 si le graphe est connexe, et 0 sinon. Indice : vous aurez besoin d'une fonction permettant d'additionner des matrices.

Question : Testez votre fonction sur le graphe des frontières. Créez un graphe similaire ayant en plus le Royaume-Uni. Vérifiez que ce graphe n'est pas connexe.


Exercice 3 : Graphe Eulériens

Question En utilisant le théorème d'Euler, écrire une fonction décidant si un graphe a un cycle eulérien. Théorème d'Euler : Un graphe est eulérien si, et seulement si, il est connexe et tous ses sommets sont de degré pair.

Bonus : Comment adapter votre fonction pour décider si un graphe a un chemin eulérien


Exercice 4 : Distance et diamètre.

Question Ecrire une fonction int** distances(graphe g); renvoyant une matrice dont le coefficient (i,j) contient la distance entre i et j. Indice : Les sommets à distance 1 sont ceux qui sont adjacent (valeur 1 dans la matrice d'adjacence). De façon générale, un sommet x est à distance l d'un sommet y si il existe un chemin de longueur l mais aucun chemin de longueur l-1.

Question Ecrire une fonction int diametre(graphe g) retournant le diamètre du graphe passé en paramètre.