TP11 : graphes Algorithmique et projet de programmation — M1 mathématiques 13 décembre 2016 Dans ce TP, on s’intéresse aux graphes inis simples, c’est-à-dire aux couples (V , E) avec V un ensemble ini et E ⊆ V × V une relation binaire anti-ré lexive et symétrique. On nomme les éléments de V des sommets et ceux de E des arêtes. Pour représenter un graphe (V , E) de sommets v0 , . . . , vn−1 , on peut utiliser • une matrice A = (ai,j )0≤i,j≤n−1 , dite matrice d’adjacence, dé inie par : ( 1 si (vi , vj ) ∈ E ai,j = 0 sinon • ou un vecteur t = (ti )0≤i≤n−1 d’ensembles inis dé ini par : ti = {j : (vi , vj ) ∈ E} Pour représenter les ensembles inis du vecteur d’adjacence, on va utiliser une structure inspirée des listes chainées. Exercice 1. Écrire une petite bibliothèque (création, ajout, suppression, impression, etc.) portant sur les listes circulaires doublement chainées, i.e. typedef struct node_s* cdll; // circular doubly linked list struct node_s { int key; cdll left, right; }; Exercice 2. Écrire une fonction cdll* mat_to_vec (int** adj, int n) qui prend en paramètres une matrice d’adjacence d’un graphe et son nombre n de sommets, et qui retourne le vecteur d’adjacence de ce même graphe. On va implémenter l’agorithme d’Hierholzer qui détermine un circuit eulérien dans un graphe quand il existe. On rappelle qu’un circuit eulérien est un chemin du graphe partant d’un sommet v, inissant au sommet v et passant par chaque arête une et une seule fois. Exercice 3. Montrer qu’un graphe ini simple admet un circuit eulérien si et seulement si il est connexe et le degré de tous ses sommets est pair. L’algorithme d’Hierholzer fonctionne sur un graphe connecté avec sommets de degré pair comme suit : 1 • choisir un sommet v quelconque et trouver un circuit simple basé en v, i.e. un chemin de v à v utilisant une arête au plus une fois, • tant que le circuit construit n’est pas eulérien, choisir un sommet u le long du circuit ayant des arêtes adjacentes non parcourue et trouver un circuit simple basé en u n’utilisant que des arêtes alors non parcourue ; puis combiner ce circuit au circuit basé en v. Le circuit devient ultimement eulérien, et l’algorithme s’arête alors. On représentera en C un circuit d’un graphe comme la liste circulaire doublement chainée (cdll) des sommets parcourus. Exercice 4. Écrire une fonction cdll cycle_from ( int i, int n, cdll* unused , cdll rvertex); qui trouve un circuit simple basé en i ∈ {0 , . . . , n−1} dans un graphe à n sommets. Le tableau unused contient en case j les listes des arêtes restantes à emprunter depuis j : toute arête choisie doit en particulier en être retirée. On maintiendra également la liste rvertex des sommets ayant encore des arêtes adjacentes non visitées. Exercice 5. En déduire une implémentation de l’algorithme de Hierholzer : cdll euler_cycle (cdll* graph, int n); 2