On dispose d'une classe Graph permettant de gérer un graphe. On veut le doter de méthodes supplémentaires. Votre travail est de faire les implémentations nécessaires.
On veut définir une méthode has_cycle qui renvoie True si le graphe contient un cycle.
La méthode fonctionne pour un graphe non-orienté. C'est une approche utilisant un parcours en largeur – utilisation d'une file :
-1, à chaque sommet-1.0 et on le place dans la fileTrue -1, associer à V : valeur de S + 1 et placer V dans la file-1, en prendre un, le mettre dans la file et reprendre en (3)FalseCet algorithme ne fonctionne que dans un graphe non orienté.
Avant de tenter la programmation, testez avec ce graphe
True.False.On peut faire la même chose en ne travaillant que sur la matrice d'adjacence :
True, sinon renvoyer False.
On voudrait écrire une méthode connected_vertex qui pour un graphe et un sommet origine donné donne tous les sommets pouvant être atteints depuis l'origine. Exemple avec le graphe :
Depuis ce graphe g, on voudrait que g.connected_vertex('A') renvoie tous les sommets pouvant être atteint depuis 'A', soit ici ['A', 'B', 'D', 'E', 'F']. L'ordre n'a pas d'importance.
Une approche parcours en largeur est possible.
On souhaite définir une méthode color attribuant une étiquette à chaque sommet en essayant de minimiser le nombre d'étiquettes différentes et en faisant en sorte que deux sommets voisins n'aient pas la même.
Le terme “coloration” n'est qu'une image. On n'a pas besoin de colorier les sommets. L'important est de définir des classes de sommets, des familles. Sur une feuille de papier, une manière commode de le faire serait de colorier avec des feutres, d'où le nom. Cela rappelle d'ailleurs le fameux problème consistant à colorier une carte de sorte que deux pays voisins n'aient pas la même couleur.
Par exemple avec ce graphe :
Pour ce graphe g on souhaite que g.color() renvoie :
{'A':0, 'B':1, 'C':0, 'D':1, 'E':0, 'F':2, 'G':1, 'F':2}
Ce n'est pas la seule solution possible, ce n'est qu'un exemple. 3 étiquettes ont suffi pour ce graphe, donc tout autre solution ne devrait pas avoir plus de 3 étiquettes.
Voici un algorithme
Exemple d'application : Dans un week-end de conférences, on doit organiser 15 conférences. Lors de leur inscription, chaque participant a pu choisir les conférences auxquelles ils souhaite assister. On organise l'emploi du temps des conférences après les inscriptions de façon à permettre à chacun d'assister à toutes les conférences auxquelles il s'est inscrit. Si un participant s'est inscrit aux conférences A, B, C, on comprend que ces conférences ne peuvent pas avoir lieu simultanément. Ces contraintes sont exprimées dans le graphe ci-dessous.
Ce problème est un problème de compatibilité. On trouve ce problème dans de nombreux cas :
On appelle nombre chromatique le nombre minimal de couleur permettant de colorer un graphe. L'algorithme précédent ne garantit pas que l'on trouve une coloration minimale. En général, tout ce qu'on peut faire, c'est trouver un argument permettant de préciser une valeur minimale de ce nombre. Par exemple, dans le graphe ci-dessus, D-E-O forme un sous-graphe complet. D, E et O ont forcément des couleurs différentes. On doit donc utiliser au moins 3 couleurs pour ce graphe. Si on arrive à trouver une coloration en 3 couleurs, c'est une coloration minimale et le nombre chromatique est 3. Mais si je ne trouve qu'une coloration en 4 couleurs, je ne peux rien conclure, à moins de trouver une preuve qu'on ne peut pas faire mieux que 4.