Notions fondamentales de la Théorie des Graphes. Définitions : Graphe : Un graphe est un ensemble de nœuds (ou sommets) qui sont reliés entre eux par des arcs. Un graphe est représenté par un couple de deux ensembles G = (X;U). Où X : l'ensemble des nœuds (ou sommets) U : l'ensemble des arêtes (graphe non orienté) ou arcs (orienté). Nœud (Sommet) : Un nœud est un élément de base d’un graphe, il peut être un objet (une ville, un poste, un nombre, …), un concept, une connaissance, une idée. Arc, arête : Un arc relie deux nœuds entre eux, il est représenté par un couple (x ; y) où x et y sont des nœuds. Un arc peut être orienté, c'est-à-dire que l'ordre de x et de y est important dans le couple (x ; y), donc (x ; y) ≠ (y ; x). Graphe Orienté ou Digraphe Un arc peut être non orienté (arête) et dans ce cas, l'ordre de x et de y dans le couple (x ; y) n'a aucune importante, donc (x ; y) = (y ; x). Graphe Non-Orienté. REMARQUE : Un arc non orienté peut toujours être transformé en une situation où l'on n'a que des arcs orientés. EXEMPLE : Soit le graphe suivant : Déterminez l'ensemble des nœuds et l'ensemble des arcs. Boucle : Une boucle est un arc dont l'extrémité initiale est égale à son extrémité finale. Par exemple, (x ; x) est une boucle. x Adjacence : Deux sommets x et y sont adjacents si il existe l'arc (x ; y) dans U. Les sommets x et y sont alors dits voisins Pour un arc u = (x ; y) on dit que: x est adjacent à y et y est adjacent à x, x et y sont adjacents à u et u est adjacent à x et y. U1 Al Tu EXEMPLE : Al : Algérie ; Ma : Maroc ; Tu : Tunisie ; Lb : Libbie ; U6 U2 U3 U4 Lb Ma U5 M r Mr : Mauritanie. Incidence : Une arête est incidente à un sommet x si x est l'une de ses extrémités. EXEMPLE : Les arêtes incidentes à d sont : (d ; a), (d ; b), (d ; e), (d ; h), (d ; g). Degré : Demi-degré extérieur : est le nombre d'arcs adjacents qui en partent. On le note d+(x) : l’ensemble des arcs de G sortants du nœud x, d+(x) = | {u U | u = (x ; y) où y X} | : y est un successeur de x. Demi-degré intérieur : est le nombre d'arcs adjacents qui y arrivent. On le note d-(x) : l’ensemble des arcs de G entrant du nœud x, d-(x) = | {u U | u = (y ; x) où y X} | : y est un prédécesseur de x. Degré d'un nœud x : est le nombre d'arcs adjacents à x. Il est noté d(x). d(x) = d+(x) + d-(x). d(x) = | {u U | u = (x ; y) ou u = (y ; x) où y X}|. EXEMPLE : Successeurs : d+(x) = 3, Prédécesseurs : d-(x) = 2, Degré : d(x) = 5. PROPRIETES : 1. Lemme des poignées de mains : La somme des degrés des sommets d'un graphe est égale à 2 fois son nombre d'arêtes. Une arête e=(x ; y) du graphe est comptée exactement 2 fois dans la somme des degrés : une fois dans d(x) et une fois dans d(y) 2. Pour un graphe simple d'ordre n, le degré d'un sommet est un entier compris entre 0 et n-1. Un sommet de degré 0 est dit isolé : il n'est relié à aucun autre sommet. Chemin et chaîne Dans un graphe il est naturel de vouloir se déplacer de sommet en sommet en suivant les arcs (les arêtes). Chaîne : Une chaîne de x à y est une séquence d’arcs où : Deux arcs qui se suivent sont adjacent ; x est une extrémité du premier arc, y est une extrémité du dernier arc. Chemin : Un chemin de x à y est une chaîne dans laquelle les arcs sont orientés et tels que: x est l'extrémité initiale du premier arc, ² y est l'extrémité terminale du dernier arc, l'extrémité terminale d'un arc est l'extrémité initiale de l'arc qui le suit dans la séquence. tous les voisins suivants d’un sommet dans un chemin (orienté) sont ses descendants tous les voisins précédents d’un sommet dans un chemin (orienté) sont ses ancêtres La longueur du chemin ou chaîne correspond au nombre d’arcs ou d'arêtes parcourues EXEMPLE : ch1 = ((A; C), (C;E)) est un chemin de A à E de longueur 2 ch2 = ((A;C),(C;F),(F;A),(A;C),(C;E)) est un chemin de A à E de longueur 5. ch3 = ((A;C),(C;F),(F;D),(D;C),(C;E)) est un chemin de A à E de longueur 5. ch4 = ((A; B), (B; D), (D;E)) est une chaîne de A à E de longueur 2. ch5 = ((A;B),(B;D),(D;C),(C;A),(A;B),(B;D),(D;E)) est une chaîne de A à E de longueur 7. ch6 = ((A;B),(B;D),(D;C),(C;F),(F;D),(D;E)) est une chaîne de A à E de longueur 6. Chemin simple, chaîne simple : Un chemin simple (une chaîne simple) est un chemin (une chaîne) qui ne contient pas plusieurs fois le même arc. EXEMPLE : ch1 et ch3 sont des chemins simples mais pas ch2. ch4 et ch6 sont des chaînes simples mais pas ch5. Chemin élémentaire, chaîne élémentaire : Un chemin élémentaire (une chaîne élémentaire) est un chemin (une chaîne) qui ne passe pas plus d'une fois par un nœud. EXEMPLE : ch1 est un chemin élémentaire mais pas ch2, ni ch3. ch4 est un chemin élémentaire mais pas ch5, ni ch6. Circuit, cycle Circuit : Un circuit contenant un nœud x est un chemin de x à x un chemin qui revient à son point de départ. Cycle : Un cycle contenant un nœud x est une chaîne de x à x une chaîne qui revient à son point de départ. Un circuit (un cycle) est élémentaire si le chemin (la chaîne) associé(e) est élémentaire. EXEMPLE : REMARQUE : Les termes de chemin et de circuit s'emploient en propre pour les graphes orientés. Pour les graphes non orientés, on parle de chaîne et de cycle. Cependant la définition formelle est exactement la même dans les 2 cas, seule change la structure (graphe orienté ou non) sur laquelle ils sont définis. Circuit, chemin Hamiltonien : Un circuit/chemin est Hamiltonien s’il est élémentaire et passe par tous les sommets du graphe. Cycle, chaîne Hamiltonien Un cycle/chaîne est Hamiltonien s’il est élémentaire et passe par tous les sommets du graphe. Circuit, chemin Eulérien Un circuit/chemin est eulérien s’il est simple et passe par tous les arcs du graphe. Cycle, chaîne Eulérien Un cycle/chaîne est eulérien s’il est simple et passe par toutes les arêtes du graphe. Représentations des graphes : Représentation par dictionnaire : On peut définir entièrement un graphe en donnant pour chaque nœud l’ensemble de ses successeurs ou de ses prédécesseurs. Précédent d’un nœud : On dit que le nœud y est le précédent du nœud x si (x ; y) U. Précédent prédécesseur antécédent Suivant d’un nœud : On dit que le nœud y est le suivant du nœud x si (x ; y) U. Suivant successeur Représentation matricielle : Matrice d’incidence nœud-arc : Un graphe peut être représenté par une matrice n x m (n = |X| et m = |U|), dite d'incidence, pouvant contenir uniquement les valeurs 0, 1, -1. Chaque ligne de la matrice est associée à un nœud et chaque colonne à un arc. Ainsi, une case indique la relation qu'il existe entre un nœud et un arc. 0 signifie que le nœud et l'arc ne sont pas adjacents, 1 signifie que le nœud est l'extrémité initiale de l'arc, -1 signifie que le nœud est l'extrémité terminale de l'arc. EXEMPLE : n = 5, m = 8 M = (5x8) a b c d 1 1 1 0 0 2 -1 0 -1 1 3 0 -1 1 0 4 0 0 0 -1 5 0 0 0 0 e 0 0 -1 1 0 f 0 0 0 1 -1 g 0 0 -1 0 1 h 0 0 0 -1 1 REMARQUE : Chaque colonne contient une seule fois ‘-1’ et une seule fois ‘+1’ (graphe orienté). Seulement 2m cases de la matrice sont non nulles sur mn cases. Les boucles ne peuvent être représentées. Cette représentation occupe beaucoup de place en mémoire. De plus, son utilisation apporte rarement de bons résultats au niveau des algorithmes. Notamment, pour parcourir le graphe, son emploi est difficile. Par contre, pour quelques problèmes comme le flot de coût minimum, cette matrice a une signification directe importante et peut donc s'avérer utile. Matrice d’adjacence nœud-nœud : Un graphe peut être représenté par une matrice n x n (n = |X|), dite d'adjacence, pouvant contenir uniquement les valeurs 0, 1. Chaque ligne et chaque colonne de la matrice représente un nœud. Ainsi, une case indique la relation qu'il existe entre deux nœuds. 0 signifie que les deux nœuds ne sont pas reliés par un arc, 1 signifie que les deux nœuds sont reliés par un arc orienté. EXEMPLE : n = 5 M = (5x5) 1 2 3 1 0 1 0 2 0 0 0 3 0 1 0 4 0 0 1 5 0 0 1 4 0 1 0 0 1 5 0 0 0 1 0 Connexité d’un graphe : Lors de la conception d'un réseau de communication notamment, il peut être intéressant de savoir si la configuration choisie permet une communication de n'importe quel point à n'importe quel autre. Un moyen de le vérifier est de représenter le réseau sous la forme d'un graphe et de vérifier qu'il est fortement connexe. Pour cela, l'algorithme suivant est proposé. Il détermine la composante fortement connexe d'un graphe contenant un point donné. Ensuite, pour le problème énoncé, il suffit de choisir un point au hasard, d'exécuter l'algorithme et de vérifier que la composante fortement connexe trouvée est bien le graphe en entier. Un algorithme permettant de trouver toutes les composantes fortement connexes est également proposé. Connexité, forte connexité - On définit la connexité par une relation entre deux nœuds de la manière suivante : x et y ont une relation de connexité une chaîne entre x et y ou bien x = y (sommet isolé). - On définit la forte connexité par une relation entre deux nœuds de la manière suivante. x et y ont une relation de forte connexité ( un chemin de x à y et un chemin de y à x) (circuit) ou bien x = y (sommet isolé). Graphe connexe, fortement connexe - Un graphe est dit connexe si tous ses nœuds ont deux à deux la relation de connexité. - Un graphe est dit fortement connexe si tous ses nœuds ont deux à deux la relation de forte connexité. EXEMPLES : Graphe non connexe : Graphes connexes mais non fortement connexes : Graphe fortement connexe : Composante connexe, fortement connexe On appelle composante connexe un ensemble de nœuds qui ont deux à deux la relation de connexité. De plus, tout nœud en dehors de la composante n'a pas de relation de connexité avec aucun des éléments de la composante. On appelle composante fortement connexe un ensemble de nœuds qui ont deux à deux la relation de forte connexité. De plus, tout nœud en dehors de la composante n'a pas de relation de forte connexité avec aucun des éléments de la composante. Dans l'exemple précédent du graphe non connexe, {A, B, C} est une composante fortement connexe du graphe et {D, E} est une composante connexe. Graphe réduit On appelle graphe réduit du graphe G le graphe G' pour lequel chaque nœud est associé à une composante fortement connexe de G. De plus, un arc relie un nœud x' à un nœud y' dans le graphe G' s'il existe un arc qui relie x à y dans G où x appartient à la composante fortement connexe de G associée à x' et où y appartient à la composante fortement connexe de G associée à y'. EXEMPLE Ce graphe G n'est pas fortement connexe, car on ne peut pas trouver de chemin de A à D par exemple. Par contre, on identifie deux composantes fortement connexes A' = {A,B,C} et B' = {D,E}. Le graphe réduit du graphe G' est: Algorithmes de connexité : Recherche d'une composante fortement connexe PRINCIPE : Pour la recherche d’une composante fortement connexe d'un graphe G contenant un sommet ‘a’. On parcourt le graphe à partir du point ‘a’ dans le sens direct (i.e. en suivant les flèches des arcs) et de créer un ensemble des nœuds parcourus D(a). La même chose est effectuée dans le sens indirect (i.e. en suivant les flèches des arcs en sens inverse) et de créer un deuxième ensemble des nœuds parcourus A(a). Le premier ensemble regroupe les nœuds accessibles à partir de ‘a’ et le deuxième ensemble regroupe les nœuds qui peuvent atteindre ‘a’. L'intersection de ces deux ensembles donne les nœuds qui à la fois peuvent atteindre ‘a’ et sont accessibles à partir de ‘a’. Cette intersection est donc la composante fortement connexe qui contient ‘a’. ALG&EORITHME Titre : ComposanteFortementConnexe ; Entrées : G = (X;U) : un graphe, a : un sommet ; Sortie : C : un sous-ensemble de sommets ; Variables intermédiaires: X1 et X2 : 2 sous-ensembles de sommets ; examiné() : une fonction ; x : un nœud ; Début X1 {a}; pour tout x X faire examiné(x) faux; Tant que x X1 | non examiné(x) faire examiné(x) vrai; Pour tout u = (x ; y) U | y X1 faire X1 X1 {y}; Fin tant que; X2 {a}; pour tout x X1 faire examiné(x) faux; Tant que x X2 | non examiné(x) faire examiné(x) vrai; pour tout u = (y ; x) U | y X2 faire X2 X2 {y}; Fin tant que; C X1 X2; retourner X’ Fin Recherche de toutes les composantes fortement connexes PRINCIPE : Pour trouver toutes les composantes fortement connexes d'un graphe, il suffit de choisir au hasard un nœud et de déterminer, grâce à l'algorithme précédent, la composante fortement connexe qui le contient. On obtient alors une première composante fortement connexe X1. Ensuite, parmi les nœuds qui ne font pas partie de X1, on en prend un au hasard pour déterminer la composante fortement connexe qui le contient. On obtient X2. On recommence ainsi jusqu'à ce que tous les nœuds appartiennent à une composante fortement connexe. ALGORITHME Titre : ComposantesFortementConnexes ; Entrées : G = (X;U) :; un graphe ; Sortie : C = {C1,...,Cn} : un ensemble de composantes fortement connexes ; Variables intermédiaires : X' : un sous-ensemble de sommets ; i : un entier ; x : un nœud ; Début X' X; i 1; Tant que X' ≠ faire choisir x dans X'; Ci ComposanteFortementConnexe(G,x); X' X' - Ci; i i + 1; Fin tant que; Fin EXEMPLES : x0 x1 x2 x4 x3 x6 x5 - a = x2 D(a) = {x2, x4, x6, x5} A(a) = {x2, x0, x1, x5, x3, x4, x6} C1 = D(a) A(a) = {x2, x4, x6, x5} - a = x0 C2 = {x0} - a = x1 C3 = {x1} - a = x3 C4 = {x3}