Chaînes dans un graphe Cycle dans un graphe Connexité Une chaîne dans un graphe est une suite alternée de n + 1 sommets et n arêtes : Exemple d'utilité : Est-il possible de prendre le train pour aller ◦ De Bordeaux à Rome? ◦ De Bordeaux à Oslo? ◦ De Bordeaux à Reykjavik? La notion de chaîne exprime cette idée. Un cycle est une chaîne dont les deux extrémités coïncident (s0 = sn ) On peut choisir n’importe quel sommet du cycle comme sommet de départ. Exemple : On dit alors que C relie s0 à sn ou encore que C est un chemin entre s0 à sn Remarques : Si n = 0, on obtient une chaîne sans arête C = s0. Il est souvent nécessaire de savoir si l'on peut aller d'un sommet à un autre en suivant des arêtes. C = s0,a1, s1, a2, s2 … , an, sn les extrémités d’une arête ai sont les sommets si-1 et si. Pour définir une chaîne, se donner seulement la suite des arêtes, ou seulement la suite des sommets ne suffit pas (pourquoi ?). 1 Une chaîne est élémentaire si ses sommets et ses arêtes sont distincts deux à deux sauf les sommets extrémités qui peuvent être égaux. Dans ce cas il s’agit d’un cycle élémentaire La longueur d’une chaîne ou d’un cycle est le nombre n d’arêtes qui composent la chaine ou le cycle. Une chaîne peut-être réduite à un seul sommet, elle est alors de longueur nulle. Cette chaine est aussi un cycle de longueur nulle. La connexité exprime la possibilité d'aller de n'importe quel sommet du graphe à n'importe quel autre sommet du graphe. Informellement, un graphe est connexe s'il est en un seul morceau. Connexe ◦ Un graphe G est connexe si pour tous sommets s et t de G il existe une chaîne qui relie s à t. Une composante connexe d’un graphe G est un sous ensemble maximal de sommets de G tels que deux quelconques d’entre eux soient reliés par une chaîne.. Connexe : 1 composante connexe 2 composantes connexes Non connexe Dans un graphe G, s'il existe une chaîne entre deux sommets s et t, alors il existe une chaîne simple entre s et t. La preuve est constructive. On prend une chaîne non simple et on en supprime les cycles pour construire une chaîne simple. 2 Soit C = s1, a1, s2, … , sk, ak, sk+1 la chaîne. Si C est simple, le travail est terminé. Sinon, il y a deux sommets si et sj pour lesquels i < j et si = sj [où i et j sont choisis parmi les entiers de 1 à k+1]. On écrit donc : C = s1, a1,..., si, ai,..., sj, aj,... ,sk, ak , sk+1 Vérifier s'il existe une chaîne entre un sommet s et un sommet t n'est pas forcément simple. Pour y arriver, nous allons utiliser une technique pour marquer et démarquer les sommets. ◦ Les marques laissées sur les sommets agissent en quelque sorte comme une mémoire d’un parcours effectué dans le graphe. On construit une chaîne C' plus courte en supprimant de C la partie ai,..., sj On obtient alors : C' = s1, a1,..., si, aj, ..., sk, ak, sk+1. Reste à vérifier que C' est bien une chaîne (cela vient de ce que si est bien une extrémité de l’arête aj). On observe que la chaîne C‘ ainsi obtenue est plus courte, ce qui permet de conclure en invoquant le principe d’induction (appliqué à la longueur des chaînes). Algorithme : 1. démarquer tous les sommets 2. marquer s 3. tant que t n'est pas marqué, 3.1 chercher une arête dont un sommet extrémité est marqué et l'autre ne l'est pas 3.2 si une telle arête n'existe pas, renvoyer la valeur "faux faux" faux 3.3 sinon marquer l'extrémité non encore marquée 4. renvoyer la valeur "vrai" 3 La première phase consiste à se mettre dans un état de départ adéquat afin d’assurer le bon fonctionnement de l’algorithme. L’action « renvoyer » correspond à la réponse attendu et donné par l’algorithme, l’action « renvoyer » implique que l’algorithme est arrivé à sa conclusion et s’arête. On suppose ici que la recherche d’une arête qui satisfait la condition se fait en suivant une procédure connue. On suppose aussi que l’on a une façon facile de vérifier si un sommet est marqué et de le marquer ou de le démarquer le cas échéant. s t u Resterait encore à prouver que l’algorithme fait bien le travail que l’on attend de lui. C’est-àdire: ◦ Que l’on obtient éventuellement et à chaque fois une réponse de sa part, ◦ Et que cette réponse est bien la bonne (!). Étape 1 : Étape 2 : Étape 3.1 : Étapes 3.2 et 3.3 : L’algorithme visite d’abord le voisin u de s qui se trouve au bas du graphe puis remonte vers le haut à droite. Il sélectionne ensuite voisin de u à gauche et en bas de s avant de « trouver » t. 4 Étape 1 : |S| unités de temps. Étape 2 : 1 unité de temps. Étape 3.1 : au pire, pour chercher une arête « bicolore » , on passe d(s) + 1 unité de temps par sommet s, ce qui coûte: Σs (d(s) + 1) = 2|A| + |S| = O(|A| + |S|) unités de temps. Étapes 3.2 et 3.3 : 1 unité de temps. Au pire, on recommence l'étape 3 pour chaque sommet, donc |S| fois au total. La complexité de l'algorithme est donc au pire de l'ordre de |S|(|A| + |S|) [en négligeant les étapes 1, 2, 3.2, 3.3 et un facteur 2] Rq Il existe un algorithme de complexité O(|A| + |S|). 5