Graphes et algorithmes Licence 2 — Informatique Denis Robilliard Denis Robilliard Graphes et algorithmes 1 / 82 Sommaire général 1 2 3 4 5 6 Introduction Représentation informatique Préparation aux TPs Notions élémentaires Exploration d’un graphe Parcours et Connexité () 8 Graphes particuliers Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration 7 Graphes et algorithmes 2 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 3 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 4 / 82 Avertissement Théorie des graphes = aspects mathématiques et formels des graphes. En pratique, on s’attachera ici surtout aux algorithmes sur les graphes. Compétences à acquérir : I I I I I savoir employer le vocabulaire et reconnaître les concepts de base de la théorie des graphes, savoir reconnaître les cas d’applications des algorithmes essentiels sur les graphes, savoir les coder en C++, savoir exécuter sur papier ces algorithmes dans le cas de graphes simples, savoir utiliser la méthodologie de développement piloté par les tests lorsque les tests sont fournis. () Graphes et algorithmes 5 / 82 Origines En 1736, le mathématicien Euler s’intéresse au problème des “ponts de Königsberg”: Peut-on faire une promenade qui passe une et une seule fois par chacun des ponts de Königsberg et revient à son point de départ? A B C D () Graphes et algorithmes 6 / 82 Origines Il modélise le problème avec: des “ronds” : les sommets ou noeuds (vertex/ices or nodes) : des “traits” : les arcs (orientés) ou arêtes (non orientées) ([directed] edges, links): x0 A B C x1 x2 D Figure: À gauche, graphe non orienté modélisant le problème des ponts de Königsberg, à droite exemple de graphe orienté. () Graphes et algorithmes 6 / 82 Motivations Depuis, les graphes sont utilisés comme outil de modélisation dans une grande variété de problèmes: Génie logiciel: architecture des applications, représentation des structures de données, graphe d’héritage entre classes dans les langages à objets... Problèmes de routage et de distribution: logistique, distribution d’électricité, d’eau... Diagrammes divers: circuits électriques, organisations hiérarchiques... Résolution de problèmes par une succession de décisions (arc = décision). () Graphes et algorithmes 7 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 8 / 82 Matrice d’adjacence Les sommets origines des arcs indicent les lignes de la matrice, les sommets destinations indicent les colonnes; Interprétation booléenne: un 1 ou un 0 à l’emplacement (i , j ) de la matrice correspond respectivement à la présence ou l’absence d’un arc entre les sommets i et j (voir exemple ci-dessous); Interprétation “matrice aux arcs”: on place en (i , j ) le nom de l’arc, rien s’il n’y a pas d’arc; Interprétation pour les graphes valués: on place en (i , j ) la valeur associée à chaque arc. On utilise une convention adéquate pour l’absence d’arc. x1 x1 x2 x3 x3 x2 x1 0 1 0 x2 1 0 1 x3 1 0 1 ← destination ↑ origine () Graphes et algorithmes 9 / 82 Matrice d’adjacence – Complexité en mémoire Complexité en mémoire = espace mémoire utilisé, exprimé en fonction d’une mesure de la taille du problème I Exemple: trier un tableau de N données par le tri à bulles, est de complexité en mémoire : N+1 (une variable supplémentaire pour échanger). Ici la complexité mémoire de la représentation en matrice d’adjacence d’un graphe d’ordre N est: N 2 . () Graphes et algorithmes 10 / 82 Matrice d’incidence Chaque ligne de la matrice est associée à un sommet et indique les arcs sortants et entrants dans ce sommet; Chaque colonne est indicée par un arc; À l’emplacement (i , j ) de la matrice on trouve 1 ou -1 pour un arc j respectivement sortant ou entrant dans le sommet i; Note: on ne peut pas représenter un arc bouclant sur un sommet dans cette convention. x1 u1 x2 () u2 u4 u3 x1 x2 x3 u1 -1 1 0 u2 1 -1 0 u3 1 0 -1 u4 0 -1 1 x3 Graphes et algorithmes 11 / 82 Matrice d’incidence – Complexité en mémoire La complexité en mémoire de la représentation en matrice d’incidence d’un graphe d’ordre N et de taille M (arcs/arêtes) est: N*M. Cette représentation peut être intéressante dans le cas particulier où M est petit devant N (plutôt rare). () Graphes et algorithmes 12 / 82 Liste d’adjacence Elle associe à chaque sommet la liste de ses successeurs. La complexité en mémoire d’une telle représentation d’un graphe d’ordre N et de taille M est de l’ordre de N+M (info des sommets + info des successeurs). C’est souvent bien plus petit que la matrice d’adjacence en N*N, mais l’accès aux données est a priori moins rapide (parcours de liste, au lieu d’un accès calculé). Plusieurs représentations sont possibles pour la liste de successeurs : tableau, ensemble, liste chaînée... Voici un exemple utilisant deux tableaux: Un tableau S indicé par les sommets et un tableau D de destinations d’arcs; Une entrée i du tableau S "pointe" à un endroit de D par un indice, on trouve successivement à cet endroit les sommets destinations de tous les arcs issus du sommet i; Cette séquence de sommets destinations s’arrête à l’endroit "pointé" par l’entrée i + 1 du tableau S (il faut donc une entrée supplémentaire dans le tableau S pour indiquer la fin des destinations du dernier sommet.) Cette représentation indicée permet de déplacer facilement la liste en mémoire (copie), ce qui ne serait pas le cas avec des pointeurs. () Graphes et algorithmes 13 / 82 x1 u1 u2 x2 u4 u3 x3 ind. Tab. S 1 1 3 2 5 3 5 4 Tab. D ind. 2 1 3 2 3 1 3 4 5 arcs u2 u3 u1 u4 Notes: La cellule grisée dans le tableau de pointeurs doit être allouée; Par contre la cellule hachurée de la liste de destinations n’a pas besoin d’être allouée; les indices et les arcs sont des commentaires et ne font pas partie explicitement de la représentation. La complexité mémoire d’un graphe d’ordre N et de taille M est ici exactement : (N+1)+M. () Graphes et algorithmes 14 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 15 / 82 Préparation aux TPs – Méthodologie Objectif: implanter les algos de base de traitement de graphes en suivant la méthodologie “Développement piloté par les tests” sont fournis ici : un fichier d’ébauches (stubs) et des fichiers de tests. l’objectif est de compléter l’ébauche pour passer les tests. graphe.hpp: stubs code fn1 code fn1+fn2 inclusion fichier test .h inclusion runtest .cc compilation: make test exécutable: runtest () Graphes et algorithmes ./runtest 16 / 82 Préparation aux TPs – Méthodologie, Compléments C++ un makefile est fourni pour simplifier la compilation: make test1; ./runtest le TP utilisera les types C++ vector, map, set, et pair ; donc inclure <vector>, <map>, <set>, et <utility> (pour pair) vous utiliserez une version de C++ au moins ISO 2011 (-std=c++11 pour le compilateur g++). # include < vector > # include < algorithm > vector <int > v(1 , 12) ; // tableau 1 élé ment init . à 12 v. push_back (3) ; // ajoute 3 en fin : v = [12 , 3] auto it = find (v. begin () ,v. end () , 12) ; // recherche d ’élé ment if ( it != v. end () ) // alors it ‘‘ pointe ’’ sur l ’élé ment cout << * it << endl ; // sort 12 // utilisation comme une pile if (! v. empty () ) // non vide ? cout << v. back () << endl ; // sort le dernier : 3 v. pop_back () ; // retire le dernier cout << v. back () << endl ; // sort 12 () Graphes et algorithmes 17 / 82 Préparation aux TPs – Compléments C++ # include < utility > # include <map > # include <set > pair <int ,int > p; p = pair <int ,int >{0 ,1}; cout << p. first << ", " << p. second << endl ; map < string , float > m; m [" PI "] = 3.14159; // cr ée une entr ée dans la map cout << m [" PI "] << " ou bien " << m. at (" PI ") << endl ; for ( auto x: m) // parcours des paires { cl é , valeur } de m cout << x. first << " = " << x. second << endl ; // sort PI = 3.14159 set <int > s; s. insert (1) ; s. insert (2) ; for ( auto x: s) cout << x << endl ; // sort 1 et 2 cout << (s. find (1) != s. end () ) << ", " << (s. find (45) != s. end () ) << endl ; // sort 1, 0 (1 dans s ? vrai ; 45 dans s ? faux ) () Graphes et algorithmes 18 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 19 / 82 Notions non orientées Un graphe G = (X , U ) est composé: d’un ensemble X = {x1 , x2 , . . . , xn } de sommets ou noeuds; d’un ensemble U = {u1 , u2 , . . . , um } et tel que U ⊂ X × X dont les éléments sont appelés arêtes: I une arête u = {xi , xj } est une paire non ordonnée de sommets; I u = {x , x } est dite incidente aux sommets x et x , qui sont ses extrémités; i j i j I on appelle boucle une arête u = {x , x }; i i on parle de multigraphe s’il existe plusieurs arêtes entre deux sommets; un graphe est simple s’il n’est pas un multi-graphe et s’il n’y a pas de boucles. x1 x3 x2 () A B C x4 D un multigraphe un graphe simple Graphes et algorithmes 20 / 82 Notions orientées Dans un graphe orienté, un sommet xi peut être en relation avec un sommet xj sans que la réciproque soit vraie. On note toujours G = (X , U ) mais: les éléments de U sont appelés arcs et sont des couples ordonnés, représentés par des flêches. On a: (xi , xj ) 6= (xj , xi ): soit un arc u = (xi , xj ), alors xi est l’extrémité initale ou origine de l’arc et xj est l’extrémité finale ou destination; un p-graphe ne contient jamais plus de p arcs entre 2 sommets (xi , xj ); la densité d’un 1-graphe est le rapport m/n2 du nombre réel d’arcs sur le nombre maximal possible. x1 x2 x1 x3 un 2-graphe orienté () x2 x3 un 1-graphe orienté Graphes et algorithmes 21 / 82 Notions orientées – 2 soit un arc u = (xi , xj ), alors xi est prédécesseur de xj , et xj est successeur de xi ; on notera Γ(xi ) l’ensemble des successeurs de xi et Γ−1 (xi ) l’ensemble de ses prédécesseurs; si on considère Γ comme une application, alors la donnée de (X , Γ) suffit à caractériser complètement le graphe: on l’utilisera dans la représentation en liste d’adjacence. x1 x3 x2 Γ(x1 ) = {x2 , x3 }, Γ(x2 ) = {x1 }, Γ(x3 ) = {x2 , x3 } () Graphes et algorithmes 22 / 82 Notion de degré ordre d’un graphe = cardinal de X (noté aussi |X |); taille d’un graphe = |U |; Deux sommets sont adjacents s’ils sont joints par un arc/arête; Deux arcs/arêtes sont adjacents s’ils ont une extrémité commune; d + (xi ) est le demi-degré extérieur de xi : nombre d’arcs sortants de xi (égal à |Γ(xi )| pour un 1-graphe); d − (xi ) est le demi-degré intérieur de xi : nombre d’arcs entrants dans xi (égal à |Γ−1 (xi )| pour un 1-graphe); d (xi ) = d + (xi ) + d − (xi ) est le degré de xi ; dans le cas d’un graphe non orienté, c’est le nombre d’arêtes incidentes à xi (note: une boucle augmente de deux le degré). () Graphes et algorithmes 23 / 82 Autres définitions Ḡ = (X , Ū ) est le graphe complémentaire de G = (X , U ); G = (X , Up ) avec Up ⊂ U est un graphe partiel de G = (X , U ); G = (Xs , Us ) avec Xs ⊂ X et Us = {(x , y ) ∈ U ∩ Xs × Xs } est un graphe sous-graphe de G = (X , U ); graphe complet = ∀xi , xj ∈ X , (xi , xj ) 6∈ U ⇒ (xj , xi ) ∈ U; clique : ensemble des sommets d’un sous-graphe non orienté complet; stable : ensemble de sommets non adjacents deux à deux, ∀x , y ∈ X , (x , y ) 6∈ U et (y , x ) 6∈ U; graphe valué : on associe une valeur à chaque arc/arête (ex: distance kilométrique pour un graphe représentant une carte routière) () Graphes et algorithmes 24 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 25 / 82 Exploration d’un graphe x0 x1 x2 x3 x4 x5 x6 x7 x8 On considère dans la suite qu’on veut explorer un graphe en partant d’un sommet donné, et en suivant les arcs/arêtes. L’idée est de mémoriser les sommets déjà vus pour éviter de les visiter à nouveau et de boucler dans le graphe (voir aussi plus loin dans le cours: on évite les cycles / circuits, donc on parcours le graphe comme un ensemble d’arbres / arborescences). Les deux explorations de base sont: I I Exploration en profondeur d’abord Exploration en largeur d’abord () Graphes et algorithmes 26 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 () x1 x2 x3 x4 x5 x6 x7 x8 Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 ordre de parcours: x0 , x1 , x2 , x4 , x5 , x6 , x3 , x7 , x8 . () Graphes et algorithmes 27 / 82 Parcours en profondeur d’abord Principe: I I I c’est une approche récursive; on traite un noeud puis récursivement, on traite successivement chacun des successeurs non encore traité; les successeurs sont donc examinés dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 le parcours dessine un ensemble d’arbres: une forêt. () Graphes et algorithmes 27 / 82 Parcours en profondeur algo PP(G) vecteurs état , pere , date_deb , date_fin ; // dimension = nb sommets ParcoursProfondeur ( Graphe G) { pour tout v ∈ sommet (G) faire é tat (v) ← INCONNU pere (v) ← NULL entier temps ← 0 pour tout v ∈ sommet (G) faire si é tat (v) = INCONNU alors VisiterParcoursProfondeur (v , temps ) retourner père , date_deb , date_fin } VisiterParcoursProfondeur ( sommet v , entier & temps ) { date_deb (v) ← ( temps ← temps + 1) é tat (v) ← EN_COURS pour tout w ∈ Successeurs (v) faire si é tat (w) = INCONNU alors pere (w) ← v VisiterParcoursProfondeur (w , temps ) é tat (v) ← FAIT date_fin (v) ← ( temps ← temps + 1) } () Graphes et algorithmes 28 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x0 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = 0/ () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x1 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x2 ,x4 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x4 ,x5 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x5 ,x7 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x7 ,x6 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x6 ,x8 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x8 ,x3 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = {x3 } () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 File = 0/ () Graphes et algorithmes 29 / 82 Parcours en largeur d’abord Principe: I I I c’est une approche itérative qui utilise une file (FIFO "First In First Out"); on traite un noeud puis ses successeurs non encore traités sont mis en bout de file; les successeurs sont donc mis dans la file dans un certain ordre: nous considérons que les sommets sont toujours numérotés, et que l’ordre est l’ordre croissant des numéros; x0 x1 x2 x3 x4 x5 x6 x7 x8 Ordre de parcours = x0 , x1 , x2 , x4 , x5 , x7 , x6 , x8 , x3 . () Graphes et algorithmes 29 / 82 Parcours en largeur algo PL(G) vecteurs état , pere , date ; // dimension = nb sommets ParcoursLargeur ( Graphe G) { pour tout v ∈ sommet (G) faire é tat (v) ← INCONNU pere (v) ← NULL entier temps ← 0 pour tout v ∈ sommet (G) faire si é tat (v) = INCONNU alors VisiterParcoursLargeur (v , temps ) retourner père , date } VisiterParcoursLargeur ( sommet v , entier & temps ) { é tat (v) = EN_COURS File F = {v} tant que F non vide faire courant ← F.dé filer () date ( courant ) ← ( temps ← temps + 1) é tat ( courant ) ← FAIT pour tout w ∈ Successeurs ( courant ) faire si é tat (w) = INCONNU alors é tat (w) = EN_COURS pere (w) ← courant F. enfiler (w) } () Graphes et algorithmes 30 / 82 Note sur le parcours en profondeur Le parcours en profondeur peut aussi être implanté par un algo similaire à celui du parcours en largeur, où la file FIFO est simplement remplacée par une pile LIFO "Last In First Out". En fait l’appel récursif de l’algo profondeur vu plus haut utilise implicitement une pile : la pile de retour d’appels de fonctions (call stack ). () Graphes et algorithmes 31 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 32 / 82 Parcours x1 x2 x3 x4 x5 x6 x7 x8 Une chaîne est une séquence d’arêtes où chacune a une extrémité commune avec la précédente: {x8 , x5 }{x5 , x4 }{x4 , x7 }{x7 , x5 }{x5 , x4 } Un cycle est une chaîne où les arêtes sont distinctes et la dernière arête est incidente avec la première: {x8 , x5 }{x5 , x7 }{x7 , x8 } Un chemin est une chaîne orientée: (x8 , x5 )(x5 , x6 )(x6 , x3 )(x3 , x5 ) Un circuit est un cycle orienté: (x5 , x6 )(x6 , x3 )(x3 , x5 ) Plus généralement, on appelle parcours soit une chaîne, soit un cycle, soit un chemin, soit un circuit. () Graphes et algorithmes 33 / 82 Parcours particuliers, connexité Un parcours est dit: élémentaire : tous ses sommets sont distincts simple : tous ses arcs/arêtes sont distincts hamiltonien : il traverse une et une seule fois tous les sommets du graphe eulérien : il passe une et une seule fois par tous les arcs/arêtes du graphe Un graphe est dit: connexe si quelque soient 2 sommets x et y, alors il existe une chaîne entre x et y (visuellement, il est "en un seul morceau"). On appelle composante connexe (CC) un sous-ensemble maximal de sommets tel qu’il existe une chaîne entre 2 quelconques d’entre eux (on ne peut pas lui ajouter un sommet sans perdre la connexité). Note : un graphe connexe comporte une et une seule CC. () Graphes et algorithmes 34 / 82 Algorithme de vérification de la connexité Soit G = {X , U } non orienté Choisir un sommet quelconque x ∈ X Appliquer un algorithme de parcours/exploration : soit en profondeur d’abord, soit en largeur d’abord, à partir de x, en comptant le nombre N de sommets explorés. Le graphe G = {X , U } est connexe si et seulement si N = Card (X ). () Graphes et algorithmes 35 / 82 Forte connexité, CFC Un graphe est dit: fortement connexe si quelque soient 2 sommets x et y, alors il existe une chemin (donc orienté) entre x et y. Formellement, soit G = (X , U ), ∀x , y ∈ X , alors ∃x →∗G y et y →∗G x (où →∗G indique un chemin quelconque dans G). On appelle composante fortement connexe (CFC) un sous-ensemble maximal de sommets tel qu’il existe une chemin entre 2 quelconques d’entre eux (on ne peut pas lui ajouter un sommet sans perdre la forte connexité). Note : un graphe fortement connexe comporte une et une seule CFC. () Graphes et algorithmes 36 / 82 Algorithme naïf de recherche de CFC tant qu ’ il y a un sommet non attribu é à une CFC marquer ce sommet avec + et tant qu ’ il y a un sommet dont le pr édé cesseur est marqu é + marquer ce sommet + tant qu ’ il y a un sommet dont le successeur est marqu é marquer ce sommet attribuer tous les sommets marqu és + et - à la mê me nouvelle CFC retirer du graphe les sommets de cette CFC nettoyer les marques + ou - des sommets restants () Graphes et algorithmes 37 / 82 Algorithme de Tarjan sur les CFC L’algorithme de Tarjan est un parcours en profondeur d’abord, qui utilise une mémorisation de la date de 1er accès à un sommet, puis à ses successeurs pour identifier les CFCs. entr ée: graphe G = (X , U); sortie : affichage CFCs index := 0 // var globale ! S := pile vide // var globale ! pour tout sommet x dans X si (x. index non dé fini ) alors chercheCFC (x) finsi finpour () Graphes et algorithmes 38 / 82 Algorithme de Tarjan sur les CFC fonction chercheCFC (x) x. index := index x. dateMin := index index := index + 1 S. empiler (x) x. estDansPile := vrai pour chaque (x , y) arc dans U // les successeurs de x si (y. index non dé fini ) alors // 1è re visite chercheCFC (y) // ré cursion du parcours profondeur x. dateMin := min (x. dateMin , y. dateMin ) sinon si (y. estDansPile ) alors // dans la CFC de x x. dateMin := min (x. dateMin , y. index ) finsi finpour si (x. dateMin = x. index ) alors // c ’ est une nlle CFC faire w := S.dé piler () w. estDansPile := faux ajoute w à la CFC courante tant que (w != x) finsi sortir CFC courante () Graphes et algorithmes 39 / 82 Exemple algo Tarjan {0} x1 x1 x2 {0} x2 x3 {0} x4 x5 x4 x6 {3} {6} x5 x7 x8 {3} x6 x7 {7} x8 {3} x3 Figure: Graphe à gauche, et représentation du parcours du graphe par l’algo. de Tarjan à doite les valeurs finale de DateMin sont entre accolades; les arcs en gras correspondent aux nouveaux noeuds inserés sur la pile; les arcs fins correspondent au cas où le noeud exploré est déjà dans la pile; les arcs pointillés au cas où l’index du noeud exploré est déjà défini, mais le sommet n’est plus dans la pile. () Graphes et algorithmes 40 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 41 / 82 Graphes particuliers Graphe planaire (orienté ou pas) : peut être dessiné sur un plan (ou une sphère) sans croisement d’arcs. Tous les graphes d’ordre ≤ 4 sont planaires. Un graphe est planaire si il ne fait pas apparaître : I I 5 sommets, tous reliés 2 à 2 par une chaîne (pentagramme) 2 groupes de 3 sommets, tels que chaque sommet d’un groupe est connecté par une chaîne à chaque sommet de l’autre groupe (problème des 3 clients et des 3 fournisseurs). x1 x5 x2 x4 x3 x1 x4 x2 x5 x3 x6 Figure: Motifs “interdits” (impossibles) dans un graphe planaire. () Graphes et algorithmes 42 / 82 Graphes Particuliers – 2 Graphe simple orienté sans circuit : ses sommets peuvent être partitionnés en niveaux, tels que tout sommet de niveau N+1 a au moins un prédécesseur au niveau N (avec N≥ 0), et aucun aux niveaux ≥ N. x2 x4 x5 x1 x3 Niveau 0 Niveau 1 x6 Niveau 2 Niveau 3 Idée d’algorithme : poser N = 0, chercher tous les sommets sans prédécesseurs, les affecter au niveau N et les retirer du graphe, puis recommencer jusqu’à épuisement des sommets. () Graphes et algorithmes 43 / 82 Graphes Particuliers – 3 Un arbre est un graphe non orienté, connexe, sans cycle. Un arbre à N sommets contient (N-1) arêtes. Une forêt est un graphe non orienté, sans cycle (pas forcément connexe). Chaque composante connexe d’une forêt est un arbre. Figure: Forêt à 3 CC. x4 x2 x5 x6 x1 x7 x8 x9 x3 () Graphes et algorithmes 44 / 82 Graphes Particuliers – 4 Une arborescence est un graphe orienté où chaque sommet a un seul prédécesseur, sauf le sommet racine de l’arborescence. Pour chaque sommet il existe un seul chemin de la racine a ce sommet. Note : on emploie souvent aussi le terme “arbre” dans le cas orienté (donc arborescence)... C’est notamment le cas en anglais: oriented tree. Une arborescence est donc un graphe orienté sans circuit et connexe. Soit une arborescence A de racine r, un sommet x et un autre sommet y sur le chemin de r à x : I I I I I I y est un ancêtre de x et x un descendant; ∗ ∗ si 6 ∃ z , y → z → x alors y est le père de x et x un fils de y; deux noeuds de même père sont frères; un noeud sans fils est une feuille; le nombre d’arcs sur le chemin de r à x est la profondeur de x; la plus grande profondeur existante dans A est la hauteur de A; () Graphes et algorithmes 45 / 82 Graphes Particuliers – 5 Un graphe est eulérien s’il possède un cycle eulérien. I I un graphe est eulérien si tous ses sommets sont de degré pair; un graphe possède un parcours eulérien, non cyclique, si il possède exactement 2 sommets de degré impair. Ce parcours relie ces 2 sommets. Un isthme est un arc/arête telle que sa suppression coupe une composante (fortement) connexe en deux. Un point d’articulation est sommet dont la suppression (avec les arc/arêtes adjacents) coupe une composante (fortement) connexe en deux. Un graphe est hamiltonien s’il possède un cycle hamiltonien. I Un graphe hamiltonien ne possède ni isthme, ni point d’articulation. () Graphes et algorithmes 46 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 47 / 82 Énumération des circuits hamiltoniens (CH) On va construire un arbre de choix sur les arcs (et non pas les sommets comme dans les algos de parcours vu précédemment). À chaque noeud de l’arbre de choix, un arc du graphe est soit conservé pour le CH, soit éliminé. I Cas où l’on conserve l’arc a = (i , j ) : on “contracte” l’arc en fusionnant les I I I 2 sommets en un seul, d’étiquette “i,j” par exemple. Puisqu’on cherche un CH, on supprime tous les arcs sortant de i (un seul arc peut sortir de i, c’est a) et tous ceux entrant en j (même raisonnement). Si dans la construction de l’arbre de choix on arrive sur une feuille (plus d’arcs à choisir) et qu’on accède à cette feuille en contractant une boucle, alors les étiquettes des branches de l’arbre de choix menant à cette feuille forment un CH (si le dernier arc n’est pas une boucle cette branche est un échec). Cas où l’on supprime l’arc a = (i , j ) : si le graphe devient non connexe, alors terminer cette branche qui est un échec. Si on atteint un feuille, c’est aussi un échec. () Graphes et algorithmes 48 / 82 Énumération d’arbres couvrants (graphes non orientés) Soit un graphe G, on veut un arbre couvrant qui soit un graphe partiel du graphe de départ, c’est à dire qui connecte tous les noeuds de en utilisant uniquement des arêtes de G et qui soit sans cycle. On va construire un arbre de choix sur les arcs. À chaque noeud de l’arbre de choix, une arête du graphe est soit conservée pour l’arbre couvrant résultat, soit éliminée. I Cas où l’on conserve l’arête a = (i , j ) : a ne doit pas être une boucle, I I alors on “contracte” a en fusionnant les 2 sommets en un seul, d’étiquette “i,j” par exemple; sinon la branche est un échec. Quand tous les sommets sont fusionnés, on est sur une feuille de l’arbre de choix (même s’il reste des arêtes), l’étiquette de la branche qui mène à cette feuille donne les arêtes de l’arbre couvrant résultat. Cas où l’on supprime l’arête a = (i , j ) : si le graphe devient non connexe, alors terminer cette branche qui est un échec. () Graphes et algorithmes 49 / 82 Arbre couvrant de poids minimum Pour certains problèmes de construction de réseau de distribution, on souhaite connecter tous les points d’un graphe valué, de telle sorte que le coûts des arcs utilisés soit minimum. La liste des arcs utilisés correspond forcément à un arbre (si il y a un cycle, on peut supprimer un arc sans changer la connexité, et le coût est moindre) : on parle d’arbre couvrant de poids minimum. Par exemple dans le cas d’un réseau d’acheminement électrique, le coût est approximativement proportionnel à la longueur des lignes et on doit connecter tous les sommets du réseau (domiciles, entreprises, ...) : on cherche un arbre couvrant de poids minimum (minimum spanning tree). Les 2 algorithmes les plus simples sont Kruskal, qui construit un arbre couvrant minimal ou une forêt couvrante minimale si le graphe n’est pas connexe, et Prim, qui doit être itéré sur chaque composante connexe lorsque le graphe ne l’est pas. () Graphes et algorithmes 50 / 82 Algorithme de Kruskal Kruskal (G) // G : graphe L ← {} // liste d ’ ensemble de sommets , fusionn és ou pas pour tout sommet s de G faire L ← L ∪ {{ v }} fin pour trier les arcs de G par longueur croissante { a0 , . . . , am−1 } i ← 0 // indice prochain arc examin é Arbre ← {} tant que | Arbre | < n - 1 faire soit ai = (u , v ) // prochaine plus courte ar ê te trouver Lu ∈ L tel que u ∈ Lu // ensemble de sommets avec u trouver Lv ∈ L tel que v ∈ Lv // idem pour v si Lu 6= Lv alors // u et v pas dans mê me fusion => pas de cycle Arbre ← Arbre ∪ { ai } retirer Lu et Lv de L // fusion é tape 1 ajouter { Lu ∪ Lv } dans L // fusion é tape 2 fin si i ← i +1 fin tant que retourner Arbre fin () Graphes et algorithmes 51 / 82 Algorithme de Prim Principe : I I On part d’un arbre résultat initial A réduit à un seul sommet s quelconque du graphe de départ G; tant que A contient moins de (n − 1) arêtes avec n le nombre de sommets de G: F () ajouter une arête à A en connectant A au plus proche (au sens des longueurs d’arcs) sommet "libre" (pas dans A, et ne créant pas un cycle avec A). Graphes et algorithmes 52 / 82 Algorithme de Prim – Exemple a 7 8 b 5 c 7 5 9 15 d e 9 6 8 f 11 g Algorithme de Prim – Exemple a 7 8 b 5 c 7 5 9 15 d e 9 6 8 f () Graphes et algorithmes 11 g 53 / 82 Algorithme de Prim – Exemple a 7 8 b 5 c 7 5 9 15 d e 9 6 8 f () Graphes et algorithmes 11 g 53 / 82 Algorithme de Prim – Exemple a 7 8 b 5 c 7 5 9 15 d e 9 6 8 f () Graphes et algorithmes 11 g 53 / 82 Algorithme de Prim – Exemple a 7 8 b 5 c 7 5 9 15 d e 9 6 8 f () Graphes et algorithmes 11 g 53 / 82 Algorithme de Prim – Exemple a 7 8 b 5 c 7 5 9 15 d e 9 6 8 f () Graphes et algorithmes 11 g 53 / 82 Algorithme de Prim – Exemple a 7 8 b 5 c 7 5 9 15 d e 9 6 8 f () Graphes et algorithmes 11 g 53 / 82 Graphes PERT PERT : Program Evaluation and Review Technique Technique de suivi de projet modélisé en graphe But: éviter les retards, déteminer les tâches critiques Origines : 1957, programme américain Polaris; 1968, J.O. de Grenoble Principe : I I certaines tâches doivent attendre la complétion d’autres tâches : on ne peut pas bâtir le toit d’une maison sans les murs, certaines tâches peuvent s’exécuter en parallèle : le cablage éléctrique peut se faire en parallèle de la pose des fenêtres. Une tâche courte en parallèle d’une tâche longue peut démarrer + ou tard, on définit: I I I I date de départ au + tôt et au + tard date de fin au + tôt et au + tard la marge est la différence (départ au + tard) - (départ au + tôt) (ou calculée identiquement sur les dates de fin) = décalage permis sans retarder tout une tâche critique a une marge nulle () Graphes et algorithmes 54 / 82 Graphes PERT – Exemple (1) Exemple : Tâche A B C D E F G Prédec. Temps 4 5 5 6 5 4 5 ∅ ∅ A A B, C D E D A Init F Fin C B G E () Graphes et algorithmes 55 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti ? ? ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? ? ? ? ? ? ? 4 F ? ? ? ? ? () ? ? ? ? 5 B ? ? ? 0 ? 6 D ? ? 4 E ? ? ? 5 G ? 0 Fin 0 ? ? ? ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti ? 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? ? ? ? ? ? ? 4 F ? ? ? ? ? () ? ? ? ? 5 B ? ? ? 0 ? 6 D ? 4 4 E ? ? ? 5 G ? 0 Fin 0 ? ? ? ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti ? 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? ? ? ? ? 5 ? 4 F ? ? ? ? ? () ? ? ? ? 5 B ? ? ? 0 0 6 D ? 4 4 E ? ? ? 5 G ? 0 Fin 0 ? ? ? ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti ? 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? ? ? ? ? 5 ? 4 F ? 9 ? ? ? () ? ? ? 4 5 B ? ? ? 0 0 6 D ? 4 4 E ? ? ? 5 G ? 0 Fin 0 ? ? ? ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? ? ? ? ? 5 ? 4 F ? 9 ? ? ? () ? ? ? 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? ? ? 5 G ? 0 Fin 0 ? ? ? ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F ? ? ? ? ? ? 9 ? 9 5 ? () ? ? ? 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? 13 ? 5 G ? 0 Fin 0 ? ? ? ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F ? ? ? ? ? ? 9 14 9 5 ? () 10 ? ? 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? 13 ? 5 G ? 0 Fin 0 ? ? ? ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F ? ? ? ? ? 13 9 14 9 5 ? () 10 ? ? 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? 13 ? 5 G ? 0 Fin 0 ? ? 18 ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F ? ? 18 ? ? 13 9 14 9 5 ? () 10 ? ? 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? 13 ? 5 G ? 0 Fin 0 18 ? 18 ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F ? ? 18 ? 18 13 9 14 9 5 ? () 10 ? ? 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? 13 ? 5 G ? 0 Fin 0 18 18 18 ? ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F ? ? 18 ? 18 13 9 14 9 5 ? () 10 ? ? 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? 13 13 5 G 0 0 Fin 0 18 18 18 18 ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F 4 18 18 ? 18 13 9 14 9 5 ? () 10 ? 14 4 5 B ? 10 ? 0 0 6 D ? 4 4 E ? 13 13 5 G 0 0 Fin 0 18 18 18 18 ? Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? ? 0 ? ? 5 C ? ? 4 F 4 18 18 ? 18 13 9 14 9 5 9 () 10 ? 14 4 5 B ? 10 ? 0 0 6 D ? 4 4 E 0 13 13 5 G 0 0 Fin 0 18 18 18 18 13 Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? 8 0 ? ? 5 C ? ? 4 F 4 18 18 ? 18 13 9 14 9 5 9 () 10 14 14 4 5 B ? 10 ? 0 0 6 D 4 4 4 E 0 13 13 5 G 0 0 Fin 0 18 18 18 18 13 Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? 8 0 4 ? 5 C 0 ? 4 F 4 18 18 9 18 13 9 14 9 5 9 () 10 14 14 4 5 B ? 10 ? 0 0 6 D 4 4 4 E 0 13 13 5 G 0 0 Fin 0 18 18 18 18 13 Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 ? 0 0 0 Init 0 4 A ? 8 0 4 4 5 C 0 9 4 F 4 18 18 9 18 13 9 14 9 5 9 () 10 14 14 4 5 B 4 10 ? 0 0 6 D 4 4 4 E 0 13 13 5 G 0 0 Fin 0 18 18 18 18 13 Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 0 0 0 0 Init 0 4 A 0 8 0 4 4 5 C 0 9 4 F 4 18 18 9 18 13 9 14 9 5 9 () 10 14 14 4 5 B 4 10 4 0 0 6 D 4 4 4 E 0 13 13 5 G 0 0 Fin 0 18 18 18 18 13 Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 0 0 0 0 Init 0 4 A 0 8 0 4 4 5 C 0 9 4 F 4 18 18 9 18 13 9 14 9 5 9 () 10 14 14 4 5 B 4 10 4 0 0 6 D 4 4 4 E 0 13 13 5 G 0 0 Fin 0 18 18 18 18 13 Graphes et algorithmes 56 / 82 Graphes PERT – Exemple (2) Diagramme “activité sur les noeuds” départ +tôt durée fin +tôt Tâche (ou Activité) départ +tard marge fin +tard départ+tôti = maxj ∈pred (i ) (départ+tôtj +duréej ) fin+tardi = minj ∈succ (i ) (fin+tardj -duréej ) margei = fin+tardi – fin+tôti 4 0 0 0 0 0 Init 0 4 A 0 8 0 4 4 10 5 C 0 9 18 18 9 18 13 9 14 9 5 9 4 F 4 14 14 4 5 B 4 10 4 0 0 6 D 4 4 4 E 0 13 13 5 G 0 0 Fin 0 18 18 18 18 13 chemin critique: chemin avec marge nulle (il peut y en avoir plusieurs) () Graphes et algorithmes 56 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 57 / 82 Plus courts chemins Soit un graphe valué, c’est à dire qu’on associe à chaque arc/arête une valeur, appelée longueur ou coût. Soit un chemin (x1 , x2 )(x2 , x3 ) . . . (xn−1 , xn ), la longueur du chemin est égale à l (x1 , x2 ) + l (x2 , x3 ) + . . . + l (xn−1 , xn ) où l (xi , xj ) est la longueur de l’arc (xi , xj ). La recherche d’un plus court chemin entre les sommet x et y est la recherche d’un chemin de longueur minimale entre ces 2 sommets (il peut y avoir plusieurs chemins minimaux de mêmes coûts). Applications : transport (navigation GPS), planification (coûts/temps d’investissements...) Principe d’optimalité : tout sous-chemin d’un chemin minimal est lui même minimal (utilisé dans certains algos). Un circuit absorbant est un circuit de longueur < 0. En présence d’un circuit absorbant, il n’y a plus de notion de plus court chemin : en effet chaque tour de circuit diminuerait sa longueur, la faisant tendre vers −∞ () Graphes et algorithmes 58 / 82 Plus courts chemins– Dijkstra–Moore L’algorithme de Dijkstra–Moore est très efficace mais utilisable seulement si les longueurs d’arcs sont ≥ 0. Les sommets sont modélisés par des entiers positifs consécutifs (ex : [0, n-1]) algo DM ( graphe (G ,l) , entier d , entier t) // l : fonct . longueur ; d : sommet dé part ; t: sommet terminal dist : tableau numerique // dist [i] = + courte distance connue entre dep et i pred : tableau numerique // pred [i] = predecesseur de i sur + court chemin connu marq : tableau booleen // marq (i) = vrai si déjà trait é ( donc à ignorer ) pour i dans les indices de sommets faire dist [i] = ∞ // c.à.d. injoignable ( pour l ’ instant ) pred [i] = ∅ // pas encore trouv é marq [i] = faux // pas trait é fin pour (... suite page suivante ...) () Graphes et algorithmes 59 / 82 Plus courts chemins– Dijkstra–Moore (2) dist [d] = 0 marq [d] = vrai courant = d tant que marq [t] == faux faire pour chaque successeur s de courant faire si marq [s] == faux et dist [s] > dist [ courant ] + l( courant ,s) alors dist [s] = dist [ courant ] + l( courant ,s) prec [s] = courant ; fin si fin pour trouver le sommet n tel que : marq [n] = faux dist [n] est minimale fin trouver courant = n marq [ courant ] = vrai fin tant que retourner dist et pred fin () Graphes et algorithmes 60 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 o d 1 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 o d 1 o d 5 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o o d 1 3 o d 5 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o o d 1 3 o d 5 o x2 7 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o o d 1 3 o d 5 o x2 7 o x2 16 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o o x2 7 o x2 16 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o 3 o x2 7 o x2 16 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o 3 o x2 7 x3 6 o o x2 16 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o 3 o x2 7 x3 6 o o x2 16 x3 9 o o 61 / 82 Illustration Dijkstra–Moore d 2 x1 x3 5 3 5 d 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o 3 o x2 7 x3 6 o 3 o x2 16 x3 9 o o 61 / 82 Illustration Dijkstra–Moore d 2 x1 5 3 d x3 5 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o 3 o x2 7 x3 6 o 3 o x2 16 x3 9 x4 8 o o o 61 / 82 Illustration Dijkstra–Moore d 2 x1 5 3 d x3 5 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o 3 o x2 7 x3 6 o 3 o x2 16 x3 9 x4 8 o o 3 o 61 / 82 Illustration Dijkstra–Moore d 2 x1 5 3 d x3 5 1 1 x1 t 2 3 15 1 x2 2 x2 6 x4 x3 plus court chemin : remonter les prédecesseurs d ← x2 ← x1 ← x3 ← x4 ← t longueur = 8 x4 t () Graphes et algorithmes prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq prec dist marq ∅ 0 3 o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o ∅ ∞ o d 3 x2 2 o 3 o d 1 3 o d 5 x1 4 o 3 o x2 7 x3 6 o 3 o x2 16 x3 9 x4 8 o o 3 o 61 / 82 Plus courts chemins– Bellman–Ford L’algorithme de Bellman–Ford est moins efficace que celui de Dijkstra–Moore, en temps d’exécution, mais il est utilisable quand les longueurs d’arcs peuvent être négatives (et peut détecter un circuit absorbant). Les sommets sont modélisés par des entiers positifs consécutifs (ex : [0, n-1]) algo BF ( graphe (G ,l) , entier d) // l : fonct . longueur ; d : sommet dé part dist : tableau numerique // dist [i] : + courte distance connue entre dep et i pred : tableau numerique // pred [i] : predecesseur de i sur + court chemin connu pour i dans les indices de sommets faire if i == d dist [i] ← 0 else dist [i] ← ∞ // c.à.d. injoignable ( pour l ’ instant ) pred [i] ← ∅ // pas encore trouv é fin pour entier cpt ← 0 // compteur de boucles bool é en fini ← faux // vrai si calcul termin é (... suite page suivante ...) () Graphes et algorithmes 62 / 82 Plus courts chemins– Bellman–Ford (2) répé ter fini ← vrai pour tout sommet j 6= d pour tout sommet i ∈ pr édé cesseurs (j) si dist [j] > dist [i] + l(i ,j) alors dist [j] ← dist [i] + l(i ,j) pred (j) ← i fini ← faux // modification à propager cpt ← cpt +1 // tous les sommets ont propag é jusqu ’à fini = VRAI ou cpt > n -1 // tous sommets si cpt > n -1 alors signaler circuit absorbant sinon retourner dist et pred () Graphes et algorithmes 63 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S T 1 2 6 B 1) Initialisation 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ 1 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S T 1 2 6 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 2 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 3 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S T 1 2 6 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 4 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 5 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 6 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 B 10 7 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 8 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 C 11 9 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 10 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S T 1 2 6 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 11 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o 12 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o 13 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o C 3 14 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o C 3 3 o 15 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o C 3 3 o B 7 16 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o C 3 3 o B 7 17 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o C 3 3 o B 7 18 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o C 3 3 o B 7 D 9 19 () Graphes et algorithmes 64 / 82 Plus courts chemins– Bellman–Ford (3) 3 A C 4 4 −4 9 S S 1 6 T 2 B 4 D plus court chemin : remonter les prédecesseurs S←A←C←B←D←T longueur = 9 A B C D T prec dist prec dist prec dist prec dist prec dist prec dist ∅ 0 ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ ∅ ∞ S 4 S 6 A 7 BC 8 10 CD 10 11 3 o 3 o C 3 3 o 3 o 3 o B 7 D 9 3 o 3 o 20 () Graphes et algorithmes 64 / 82 Plus courts chemins– Floyd–Warshall L’algorithme de Floyd–Warshall calcule la plus courte distance pour chaque paire de sommet. Il est basé sur une forme matricielle proche de la matrice d’adjacence. Le principe est vu en cours d’Algèbre Linéaire, il est très proche de celui de Bellman–Ford : seul l’algorithme est donné ici. Les sommets sont modélisés par des entiers positifs consécutifs (ex : [0, n-1]) algo FW ( graphe ( MG )) // MG : matrice d ’ adjacence du graphe , contenant longueur arcs dist : tableau 2D numerique // dist [i ][ j] : + courte distance connue entre i et j pred : tableau 2D numerique // pred [i ][ j] : pred . de j sur + court chemin connu depuis i pour i dans les indices de sommets faire pour j dans les indices de sommets faire si i = j alors dist [i ][ j] ← 0 dist [i ][ j] ← MG [i ][ j] // lg arc (∞ si pas d ’ arc ) si dist [i ][ j] != ∞ pred [i ][ j] ← i // meilleur pred é cesseur connu de i à j sinon pred [i ][ j] ← ∅ // pas encore connu fin pour fin pour (... suite page suivante ...) () Graphes et algorithmes 65 / 82 Plus courts chemins– Floyd–Warshall (2) pour k dans les indices de sommets faire pour i dans les indices de sommets faire pour j dans les indices de sommets faire si dist [i ][ k] + dist [k ][ j] < dist [i ][ j] alors dist [i ][ j] = dist [i ][ k] + dist [k ][ j] pred [i ][ j] = pred [k ][ j] finsi finpour finpour finpour fin () Graphes et algorithmes 66 / 82 Plus courts chemins – Bilan Complexité en temps de calcul au pire des cas Dijkstra–Moore est en O (n2 ) Bellman-Ford et Floyd-Warshall sont en O (n3 ) Bilan Si on veut un plus court chemin entre toutes les paires de sommets quelconques, alors utiliser Floyd-Warshall. Si on n’a qu’un seul point de départ, et des arcs de longueur négative, alors utiliser Bellman-Ford Dans les autres cas (arcs positifs ou nul, et point de départ unique) utiliser Dijkstra–Moore qui est plus efficace. () Graphes et algorithmes 67 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 68 / 82 Réseaux et Flots Un réseau de transport est un graphe G = (X , U ) connexe, sans boucle, asymétrique avec une entrée s, la source,et une sortie t, le puits, tous deux dans X , et tel que chaque arc ui ∈ U, avec i ∈ [0, m − 1] est associé à une capacité ci (quantité transportée maximale pouvant circuler sur l’arc). Un flot est un vecteur ligne f = (f0 , f1 , . . . , fm−1 ) tel que : I I I I chaque composante fi représente le flot (quantité effective circulant) sur l’arc i; toutes les composantes de f sont ≥ 0 le flot est censé arriver par le sommet s et disparaître par t en tout sommet x, avec x 6∈ {s, t }, la loi de conservation de Kirchhoff est vérifiée : fi = fj ∑ ∑ i ∈arcs entrants de x j ∈arcs sortants de x (pour chaque sommet le flot entrant est égal au flot sortant). Un flot est admissible si ∀i ∈ [0, m − 1], fi ≤ ci (sur chaque arc le flot est au maximum égal à la capacité). Note: un flot nul (~0) est toujours admissible. () Graphes et algorithmes 69 / 82 Graphe résiduel (ou graphe d’écart) On définit le graphe ou réseau résiduel (ou d’écart) Gf = (X , Uf ) associé à: I un réseau G = (X , U ) de capacité c (x ,y ) sur l’arc (x , y ) I un flot admissible donné f , noté f (x ,y ) sur l’arc (x , y ) pour tout arc (x , y ) de G, on trouve dans Gf I un arc (x , y ) de capacité c (x , y ) = c f (x ,y ) − f(x ,y ) I un arc opposé (y , x ) de capacité c (y , x ) = f f (x ,y ) Note: par définition d’un flot admissible, on a c(x ,y ) > f(x ,y ) et donc cf (x , y ) ≥ 0 pour tout arc(x , y ). Pour simplifier on ne note pas les arcs de capacité nulle quand on représente le graphe résiduel. On va chercher un chemin de la source au puits sur le graphe résiduel : ce chemin d’incrémentation servira à modifier le flot courant pour le maximiser. () Graphes et algorithmes 70 / 82 Illustration du graphe résiduel B 10/0 s B t 5/5 5 10 5/5 s 5 t 5 10 10/5 10/10 5 C C graphe initial: capacité / flot graphe résiduel: capacité résiduelle arcs même sens, sens opposé Rappel: à chaque arc (x , y ) associé à c(x ,y ) et f(x ,y ) du réseau de départ on associe dans le graphe résiduel (arcs nuls non dessinés): • un arc de même sens (x , y ) de capacité résiduelle: c(x ,y ) − f(x ,y ) • un arc opposé (y , x ) de capacité résiduelle: f(x ,y ) () Graphes et algorithmes 71 / 82 Algo de Ford–Fulkerson / Edmonds–Karp Principe : I I Partir d’un flot admissible f existant (ou nul par défaut) sur le réseau G = (X , U ) Itérer : F Ford–Fulkerson Edmonds–Karp F F F → → Construire Gf (ou du moins être capable de donner la capacité résiduelle cf (x , y ) pour chque arc (x , y )) Trouver un chemin d’incrémentation p de s à t dans Gf , tel que cf (x , y ) > 0 pour tout arc (x , y ) de ce chemin p Trouver un plus court chemin d’incrémentation p en nombre d’arcs de s à t dans Gf , tel que cf (x , y ) > 0 pour tout arc (x , y ) de ce chemin p Si pas de chemin, alors terminé trouver la valeur cf (p) = Min{cf (x , y )|(x , y ) ∈ p} (minimum des capacités résiduelles sur le chemin) pour tout arc (x , y ) ∈ p changer le flot correspondant du réseau G: si (x , y ) ∈ U alors f(x ,y ) = f(x ,y ) + cf (p) (incrément si arc dans le même sens dans G et Gf ) si (y , x ) ∈ U alors f(x ,y ) = f(x ,y ) − cf (p) (décrément si arc en sens inverse dans G et Gf ) la variante Ford–Fulkerson est plus efficace en temps de calcul mais ne donne de résultats garantis que pour des flots et capacités entières. () Graphes et algorithmes 72 / 82 Illustration algo de Ford–Fulkerson / Edmonds–Karp B B 10/0 s 5/5 t 10 s 10/5 10 5/5 10/10 5 5 t 5 5 C C graphe initial: capacité / flot graphe résiduel: chemin en traits pleins, cf (chemin) = 5 = min{10, 5, 5} B 10/5 (+5) 5/5 5/0 (−5) s t 10/10 (+5) 10/10 C graphe modifié: capacité / flot (modification) () Graphes et algorithmes 73 / 82 Sommaire 1 Introduction 2 Représentation informatique 3 Préparation aux TPs 4 Notions élémentaires 5 Exploration d’un graphe 6 Parcours et Connexité 7 Graphes particuliers 8 Algorithmes sur les graphes particuliers 9 Plus courts chemins 10 Flot maximal 11 Coloration () Graphes et algorithmes 74 / 82 Coloration Soit G={X,U} un graphe non orienté, une coloration de G est une affectation de couleurs (ou d’entiers, de manière équivalente) aux sommets de G de telle sorte que 2 sommets adjacents n’aient pas la même couleur (le même entier). Une k -coloration est une coloration de G avec k couleurs: une k -coloration est donc une partition de G en k stables distincts. a c b e d f g Figure: Exemple de 3-coloration. () Graphes et algorithmes 75 / 82 Coloration – Applications Coloriage automatique d’une carte géographique, d’un diagramme. Téléphonie mobile : chaque sommet modélise un émetteur, qui doit avoir une fréquence (couleur) différente des émetteurs adjacents pour éviter les interférences. Emploi du temps : chaque sommet représente un cours, il y a une arête entre cours I I I de même promotion de même professeur devant utiliser la même salle Les couleurs sont les créneaux horaires (mieux représentés par des entiers). Propagation de contraintes: exemple jeu de Sudoku, chaque sommet représente une case et est adjacent aux cases de la même ligne, même colonne et même bloc. () Graphes et algorithmes 76 / 82 Coloration – Nombre et indice chromatique Nombre chromatique Le plus petit entier k tel qu’un graphe G soit k -colorable est appelé nombre chromatique, noté γ(G) (c’est le nombre minimal de couleurs pour ne pas avoir de conflits). Soit α(G) la taille du plus grand stable de G=(X,U), appelée nombre de stabilité de G, on a: (X ) α(G) ∗ γ(G) ≥ Card (X ) ⇒ γ(G) ≥ Card α(G) Théorème de Appel et Haken (1977): Tout graphe planaire est 4-colorable (démontré par énumération sur ordinateur). Indice chromatique On peut aussi colorier les arêtes d’un graphe, afin que deux arêtes adjacentes soient de couleur différentes. Le plus petit nombre de couleurs le permettant est appelé indice chromatique du graphe. L’indice chromatique est bien sûr toujours supérieur ou égal au degré maximum du graphe. () Graphes et algorithmes 77 / 82 Graphe bi-parti Définition un graphe bi-parti est un graphe G = (X , U ) dont on peut partitionner les sommets en 2 sous-ensembles X1 et X2 avec X1 ∪ X2 = X et X1 ∩ X2 = 0/ , et tel que ∀(i , j ) ∈ U, i ∈ X1 ⇒ j ∈ X2 et i ∈ X2 ⇒ j ∈ X1 . Un graphe bi-parti complet est noté Kr ,s avec r = |X1 |, s = |X2 |. Un graphe bi-parti est 2-coloriable un graphe bi-parti ne contient aucun cycle avec un nombre impair d’arêtes/arcs. l’indice chromatique d’un graphe bi-parti est égal au maximum des degrés des sommets. () Graphes et algorithmes 78 / 82 Couplage Définition un couplage d’un graphe simple est un sous-ensemble d’arêtes sans extrémité commune 2 à 2. Un sommet du graphe est saturé par un couplage s’il est l’extrémité d’une arête du couplage, sinon il est insaturé. un couplage est parfait si tous les sommets sont saturés. un couplage est maximal s’il n’existe pas de couplage saturant un plus grand nombre de sommet. un couplage parfait est toujours maximal. un problème d’affectation est la recherche d’un couplage maximal dans un graphe bi-parti. () Graphes et algorithmes 79 / 82 Recherche de couplage maximal soit un couplage C, une chaîne est dite alternée relativement à C si elle emprunte alternativement une arête de C et une arête de U-C (son complémentaire). Une chaîne alternée peut être de longueur 1 (1 seule arête). Une chaîne alternée améliorante (CAA) relie 2 sommets non saturés par C. un transfert échange le rôle des arêtes d’une chaîne alternée améliorante : celles de la CAA déjà dans C sont exclues de C, celle de la CAA pas déjà dans C sont ajoutées à C. Le cardinal du couplage (nombre de sommets saturés) est augmenté de 1 par un transfert. Th: un couplage est maximal s’il n’existe pas de chaîne alternée améliorante. () Graphes et algorithmes 80 / 82 Recherche de couplage maximal : algorithme Principe d’un algo de recherche de couplage maximal : on choisit un sommet insaturé on construit une arborescence à partir de ce sommet: * à un niveau N de profondeur impaire, on ajoute un sommet adjacent au niveau N-1 par une arête hors du couplage; * à un niveau N pair, on ajoute un sommet adjacent au niveau N-1 par une arête dans le couplage; on arête une branche quand on atteint un sommet insaturé à un niveau impair. () Graphes et algorithmes 81 / 82 Références Graphes et algorithmes, M.Gondran, M. Minou, Lavoisier éd. Graphes et hypergraphes, C. Berge, Gauthiers-Villars éd. Initiation à la théorie des graphes, C. Roux, Ellipses éd. () Graphes et algorithmes 82 / 82