Théorie et algorithmique des graphes Guillaume Moreau Ecole Centrale de Nantes EI1 - eLOGRA, mai 2006
2
Table des matières 1 Eléments de théorie des graphes 1.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . 1.2 Graphes . . . . . . . . . . . . . . . . . . . . . . . . . 1.2.1 Définitions . . . . . . . . . . . . . . . . . . . 1.2.2 Voisins - Degrés . . . . . . . . . . . . . . . . 1.2.3 Sous-graphes, graphes partiels . . . . . . . . . 1.2.4 Graphes non-orientés . . . . . . . . . . . . . . 1.3 Chemins, chaînes, cycles . . . . . . . . . . . . . . . . 1.4 Composantes fortement connexes - fermeture transitive 1.4.1 Composantes fortement connexes . . . . . . . 1.4.2 Fermeture transitive . . . . . . . . . . . . . . 1.4.3 Graphes fortement connexes . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
. . . . . . . . . . .
5 5 8 8 8 9 9 10 13 13 13 14
2 Ensembles particuliers dans les graphes 2.1 Nombre de stabilité . . . . . . . . . . . . . . . . 2.2 Nombre d’absorption . . . . . . . . . . . . . . . 2.3 Noyau - fonctions de Grundy . . . . . . . . . . . 2.3.1 Définitions . . . . . . . . . . . . . . . . 2.3.2 Exemple de calcul de fonction de Grundy 2.4 Nombre chromatique . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
15 15 16 16 16 17 17
3 Familles de graphes possédant des propriétés particulières 3.1 Graphes planaires . . . . . . . . . . . . . . . . . . . . . 3.2 Graphes hamiltoniens et eulériens . . . . . . . . . . . . 3.2.1 Graphes hamiltoniens . . . . . . . . . . . . . . . 3.2.2 Graphes eulériens . . . . . . . . . . . . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . .
19 19 20 20 21
4 Algorithmique des graphes 4.1 Représentation en mémoire . . . 4.1.1 Matrice d’adjacence . . 4.1.2 Tableaux d’arcs . . . . . 4.1.3 Tableaux de successeurs 4.1.4 Listes chaînées . . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
23 23 23 24 24 24
3
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . .
. . . . .
. . . . . .
. . . . .
. . . . . .
. . . . .
. . . . .
TABLE DES MATIÈRES
4 4.2 4.3
4.4
4.5
5
Parcours de graphes . . . . . . . . . . . . . . . . 4.2.1 Parcours des arbres . . . . . . . . . . . . Algorithmes de plus court chemin . . . . . . . . 4.3.1 Algorithme de Ford-Bellman . . . . . . . 4.3.2 Algorithme de Moore ou de Dijkstra . . . 4.3.3 Algorithmes de Bellmann . . . . . . . . Problème du flot maximal . . . . . . . . . . . . . 4.4.1 Définitions . . . . . . . . . . . . . . . . 4.4.2 Résolution du problème de flot maximal . 4.4.3 Algorithme de Ford-Fulkerson et exemple Flot maximal à coût minimal . . . . . . . . . . . 4.5.1 Définitions . . . . . . . . . . . . . . . . 4.5.2 Algorithme de Roy . . . . . . . . . . . . 4.5.3 Exemple . . . . . . . . . . . . . . . . .
Démonstrations
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
. . . . . . . . . . . . . .
25 25 26 26 27 28 31 31 32 34 38 38 38 39 43
Chapitre 1
Eléments de théorie des graphes 1.1 Introduction Les graphes constituent une des façons les plus naturelles de représenter bon nombre de problèmes de la vie courante comme de celle d’un ingénieur. Ils sont aussi représentatifs des résultats les plus fondamentaux de l’algorithmique. Prenons un exemple simple : nous devons nous déplacer de Nantes à Marseille en utilisant la route. Dans un premier temps, on ne prend en compte que quelques grandes villes comme le montre la figure 1.1. Les chiffres sont bien sûr assez loin de la réalité. Comme il n’existe pas sur ce graphe de route directe entre Nantes et Marseille, la première question qu’on peut se poser est bien sûr celle de l’existence d’un itinéraire entre Nantes et Marseille. On introduit ici la notion de fermeture transitive d’un graphe qui sera étudiée en 1.4.2. 500
Paris
350
Strasbourg
Nantes
350
800
800
Bordeaux
450
Marseille
Figure 1.1: Calculer un itinéraire de Nantes à Marseille
5
CHAPITRE 1. ELÉMENTS DE THÉORIE DES GRAPHES
6
Intuitivement, on trouve assez facilement que sur ce graphe, le chemin le plus court entre Nantes et Marseille ne passe naturellement pas par Strasbourg. Ici, le chemin le plus court passe par Bordeaux et fait 800 kilomètres, comme le met en évidence la figure 1.2. Le problème est résoluble manuellement et intuitivement sur un petit nombre de villes et de routes. Pour construire les navigateurs GPS embarqués dans les voitures, ou pour calculer les itinéraires comme sur le site http://www.viamichelin.com en prenant en compte les quelques dizaines de milliers de communes de France, cette approche n’est évidemment plus tenable. On entre dans les algorithmes dits de plus courts chemins que l’on étudiera au chapitre 4 de ce document. 500
Paris
350
Strasbourg
Nantes
350
800
800
Bordeaux
450
Marseille
Figure 1.2: Le chemin le plus court de Nantes à Marseille
On peut rendre ce problème un peu plus complexe en tenant compte de la nature des routes qui relient les différentes de villes. Il va de soi qu’on roulera en général plus vite sur une autoroute que sur une petite route de campagne. Encore que ceci peut s’avérer faux au moment des départs en vacances... On introduira donc aussi les problèmes de flots dans les graphes. Il existe encore un autre type de problème que nous n’avons pas abordé. Il ne fait pas partie des problèmes de graphes a priori mais peut s’exprimer aussi sous forme de graphe. C’est un des problèmes fondamentaux de l’algorithmique théorique, il est usuellement utilisé en théorie de la complexité pour introduire la classe des problèmes NP-complets. On l’appelle le problème du voyageur de commerce : il s’agit, toujours dans le même graphe, de déterminer l’itinéraire idéal d’un voyageur de commerce qui doit passer une et une seule fois par chaque ville, tout en minimisant le nombre de kilomètres parcourus. On montre qu’il n’existe
1.1. INTRODUCTION
7
pas d’algorithme en temps polynomial1 pour résoudre le problème. D’autres types de problèmes utilisent les graphes, en informatique comme dans d’autres disciplines des sciences de l’ingénieur. Par exemple, si on considère une carte de France comme celle de la figure 1.3 coloriée de façon à ce que deux départements adjacents aient une couleur différente, quel est le nombre de couleurs minimal à utiliser ? On montrera dans la section 3.1 consacrée aux graphes planaires qu’il faut au minimum 4 couleurs.
Figure 1.3: Colorier une carte de France
Le dernier exemple de cette introduction concerne la gestion de projet. Dans un projet, un certain nombre de tâches peuvent s’effectuer en même temps que d’autres tandis qu’au contraire, il est indispensable que certaines tâches aient été complétées avant que d’autres ne commencent. Cette fois encore, ces dépendances entre tâches peuvent exprimées sous forme de graphes. Cette approche est valable pour une recette de cuisine comme pour un planning de PEI mais aussi pour la programmation parallèle : en effet, pour calculer une moyenne générale, on a besoin que toutes les moyennes aient été calculées, mais a contrario, pour calculer un produit matriciel certaines parties peuvent se dérouler en parallèle : dans l’expression (cij )1≤i,j≤n =
n X
aik bkj
(1.1)
k=1
le calcul de cij est indépendant de celui de ci′ j ′ ; ils peuvent donc être calculés 1 c’est-à-dire que le temps d’exécution du programme ne peut pas être une fonction polynomiale du nombre de sommets du graphe
CHAPITRE 1. ELÉMENTS DE THÉORIE DES GRAPHES
8
indépendamment les uns des autres. Par contre, le calcul d’un cij nécessite que les calculs de tous les aik bkj aient été effectués pour tous les valeurs de k. On appelle ces graphes des graphes de dépendance.
1.2 Graphes 1.2.1 Définitions Définition 1.2.1 Un graphe G = (X, U ) est le couple constitué d’un ensemble dénombrable de sommets X et d’une famille U d’éléments de X 2 appelés arcs. Dans ce cours, nous n’aborderons que les cas où X est fini. On représente les sommets par des points et les arcs correspondant à un couple de sommets (x, y) par une ligne joignant x à y, portant une flèche de x vers y. On dit alors que x est l’origine de l’arc, tandis que y est son extrémité. Un exemple de graphe est représenté figure 1.4. B
A
E
D
C
F
Figure 1.4: Exemple de graphe
S’il existe deux arcs reliant les mêmes sommets, on parle de graphes multiples ou multigraphes comme celui représenté sur la figure 1.5. Dans ce cours, nous nous intéresserons essentiellement aux graphes simples et souvent sans boucles.
1.2.2 Voisins - Degrés Soient un graphe G = (X, u) et un couple (x, y) ∈ U . y est alors appelé un successeur de x, et x un prédécesseur de y. On note : • Γ+ (x) l’ensemble des successeurs de x • Γ− (y) l’ensemble des prédécesseurs de y Γ(x) = Γ+ (x) ∪ Γ− (x) représente les voisins de x, ou encore les sommets adjacents à x. Dans le graphe de la figure précédente, Γ+ (A) = {E, D, B} et Γ+ (A) = 0.
1.2. GRAPHES
9
B
A
E
D
C
F
Figure 1.5: Exemple de multigraphe
Remarque : (X, Γ+ ) suffit à définir complètement le graphe... Γ+ = ∪x∈X Γ+ (x) Le demi-degré extérieur d’un sommet x, noté d+ (x), est le nombre d’arcs issus de x, c’est-à-dire que d+ (x) = |Γ+ (x)|. De la même façon, on définit le demidegré intérieur, noté d− (x), comme étant le nombre d’arcs incidents à x, c’està-dire que d− (x) = |Γ− (x)|. Le degré d’un sommet est alors la somme de ses demi-degrés intérieur et extérieur. On dit qu’un graphe est complet si et seulement si ∀x, y ∈ X alors (x, y) ∈ U , c’est-à-dire si et seulement si tous les sommets sont reliés deux à deux (dans les deux sens). Dans le cas d’un graphe complet à n sommets, tous les demi-degrés intérieurs et extérieurs sont égaux à n − 1.
1.2.3 Sous-graphes, graphes partiels Définition 1.2.2 On appelle sous-graphe de G = (X, U ) le graphe G′ = (X ′ , UX ′ ) engendré par un ensemble de sommets X ′ ⊂ X où UX ′ représente les arcs de U ayant leur origine et leur extrémité dans X ′ . Définition 1.2.3 De la même manière on appelle graphe partiel de G = (X, U ) engendré par U ′ , le graphe G′ = (X, U ′ ) où U ′ ⊂ U , c’est-à-dire qu’on conserve tous les sommets mais qu’on supprime certains arcs. Les deux graphes de la figure 1.6 représentent respectivement le graphe partiel de l’exemple de la figure 1.4 engendré par les sommets {A, D, E, F } et le sousgraphe de ce même exemple dans lequel on a supprimé les arcs (E, D) et (D, E) et (E, F ).
1.2.4 Graphes non-orientés Pour étudier certaines propriétés d’un graphe, on n’a pas toujours besoin de faire référence à l’orientation, par exemple si on veut seulement savoir si deux sommets
CHAPITRE 1. ELÉMENTS DE THÉORIE DES GRAPHES
10 A
B
A
E
D
E
C
D
F
F
Figure 1.6: Exemple de sous-graphe et de graphe partiel
sont reliés ou non. Dans ce cas, on considère des arêtes (x, y) et non plus des arcs (x, y). Les notions de voisins et de degrés subsistent bien entendu. La figure 1.7 présente un exemple de graphe non-orienté. Théorème 1.2.1 Soit G = (X, E) un graphe non-orienté. Le nombre de sommets de degré impair est pair. Démonstration B
A
E
D
C
F
Figure 1.7: Exemple de graphe non orienté
Définition 1.2.4 G1 = (X1 , U1 ) et G2 = (X2 , U2 ) sont dits isomorphes si et seulement si il existe une bijection f : X1 −→ X2 telle que (x, y) ∈ U1 ⇐⇒ (f (x), f (y)) ∈ U2 . Le problème de décider si deux graphes sont isomorphes est un problème algorithmiquement difficile.
1.3 Chemins, chaînes, cycles Définition 1.3.1 On appelle chemin d’un graphe G = (X, U ) toute suite d’arcs µ = (u1 , ..., up ) vérifiant ∀i < p, l’extrémité de ui est l’origine de ui+1 . Si, en plus, l’extrémité de up est égale à l’origine de u1 , µ est un circuit.
1.3. CHEMINS, CHAÎNES, CYCLES
11
Dans le graphe de la figure 1.8, ((A, E), (E, D)) est un chemin et (E, F ), (F, D)(D, E) est un circuit. Naturellement, (E, F ), (F, D)(D, E) est aussi un chemin. Dans les graphes non-orientés, on définit de manière analogue les chaînes et les cycles. B
A
E
D
C
F
Figure 1.8: Exemple de chemin et de circuit
Le nombre d’arcs constitue la longueur de la chaîne ou du chemin. Si le chemin passe une seule fois par chaque arc, il est dit simple, s’il passe une seule fois par chaque sommet, il est dit élémentaire. Définition 1.3.2 G = (X, U ) est connexe si et seulement si ∀x, y ∈ X il existe une chaîne de x à y. Propriété 1.3.0.1 La relation R définie par xRy si et seulement si il existe une chaîne de x à y est : • réflexive • symétrique • transitive Démonstration C’est donc une relation d’équivalence dont les classes sont appelées les composantes connexes de G. Définition 1.3.3 G = (X, U ) est dit fortement connexe si et seulement si ∀x, y ∈ X il existe un chemin de x à y et un chemin de y à x. Propriété 1.3.0.2 La relation R′ définie par xR′ y si et seulement si il existe un chemin de x à y et un chemin de y à x est : • réflexive • symétrique
CHAPITRE 1. ELÉMENTS DE THÉORIE DES GRAPHES
12 • transitive Démonstration
C’est donc une relation d’équivalence dont les classes sont appelées les composantes fortement connexes de G. La figure 1.9 propose un exemple de graphe sur lequel sont représentées ses composantes fortement connexes. Sur ce graphe, il n’y a par contre qu’une seule composante connexe, composée de tous les sommets. Propriété 1.3.0.3 Un graphe fortement connexe est connexe, mais la réciproque est fausse (voir figure 1.9).
B A C
D
Figure 1.9: Exemple de graphe connexe mais pas fortement connexe
Définition 1.3.4 G = (X, U ) est un graphe k-connexe si et seulement si ∀A ⊂ X avec |A| < k, le sous-graphe engendré par X \ A est connexe. La connectivité de G est alors le plus grand k tel que G soit k-connexe, noté K(G). On peut voir la k-connectivité comme le nombre minimum de sommets qu’il faut enlever pour disconnecter le graphe. On remarque que K(G) ≤ minx∈X |Γ(x)| = δ. En effet, si on enlève les δ voisins du x qui réalise δ, x n’est plus connecté au reste du graphe. Théorème 1.3.1 (Menger) G est k-connexe si et seulement si ∀(x, y) ∈ X 2 il existe k chaînes élémentaires disjointes 2 à 2 intérieurement (sommets) qui relient x et y. Corollaire 1.3.0.1 Si G k-connexe, x ∈ X, A ⊂ X avec |A| ≥ k, alors il existe k chaînes élémentaires disjointes 2 à 2 de x à A.
1.4. COMPOSANTES FORTEMENT CONNEXES - FERMETURE TRANSITIVE13
1.4 Composantes fortement connexes - fermeture transitive 1.4.1 Composantes fortement connexes Soit G = (X, U ) un graphe. L’algorithme suivant calcule la composante fortement connexe associée au sommet x0 ∈ X. marquer le Répéter marquer marquer jusqu’à ce
sommet x0 avec ⊕ et ⊖ avec ⊕ tout successeur non marqué ⊕ d’un sommet ⊕ avec ⊖ tout prédécesseur non marqué ⊖ d’un sommet ⊖ qu’il n’y ait plus de marquage possible
Les sommets marqués ⊕ et ⊖ forment la composante fortement connexe de x0 . On peut trouver toutes les composantes fortement connexes en réappliquant l’algorithme à tous les sommets n’appartenant pas encore à une composante fortement connexe.
1.4.2 Fermeture transitive Définition 1.4.1 La fermeture transitive du graphe G = (X, U ) est le graphe τ (G) = (X, τ (U )) où (x, y) ∈ τ (U ) si et seulement si il existe un chemin de x vers y dans G. Si G est fortement connexe, sa fermeture transitive est le graphe complet.
Figure 1.10: Exemple de graphe avec sa fermeture transitive
Définition 1.4.2 Deux graphes G1 et G2 sont dits τ -équivalents si et seulement si ils ont même fermeture transitive. On vérifie facilement que la relation de τ -équivalence est une relation d’équivalence.
14
CHAPITRE 1. ELÉMENTS DE THÉORIE DES GRAPHES
Définition 1.4.3 On dit que G = (X, U ) est τ -minimal si et seulement si ∀u ∈ U , τ (G) 6= τ (G \ {u}). Pour un graphe donné, il n’existe pas a priori de graphe τ -minimal unique. Théorème 1.4.1 Si G est un graphe sans circuits, alors le graphe τ -minimal est unique.
1.4.3 Graphes fortement connexes Lorsque qu’un graphe G est fortement connexe, la matrice d’adjacence de sa fermeture transitive ne comporte que des 1, en dehors de la diagonale. Théorème 1.4.2 G = (X, U ) fortement connexe ⇐⇒ ∀A ⊂ X, A 6= 0 et A 6= X, Γ+ (A) 6= A. Démonstration
Chapitre 2
Ensembles particuliers dans les graphes 2.1 Nombre de stabilité Définition 2.1.1 Soit G = (X, U ) un graphe non orienté. Un sous-ensemble S ⊂ X est dit stable si et seulement si 2 sommets T distincts de S ne sont jamais reliés (adjacents), c’est-à-dire si ∀x ∈ S, Γ(x) S = 0.
Figure 2.1: Exemple de stables dans un graphe Soit S la famille des ensembles stables de G. On a évidemment 0 ∈ S et pour tout S ∈ S avec A ⊂ S, alors A ∈ S. Définition 2.1.2 S0 est un stable maximal si et seulement si ∀S1 ∈ S et S1 6= S0 alors S0 6 ⊂S1 . Définition 2.1.3 On appelle nombre de stabilité de G = (X, U ), l’entier défini par α(G) = maxS∈S |S|. Un ensemble stable S ⊂ X qui vérifie |S| = α(G) sera dit stable maximum. Il n’y a pas forcément unicité... 15
16
CHAPITRE 2. ENSEMBLES PARTICULIERS DANS LES GRAPHES
Les ensembles stables trouvent leur application dans le problème des huit reines. Il s’agit de placer huit reines sur un échiquier sans qu’elles puissent être deux à deux en prise (même rangée, même colonne ou même diagonale). On construit alors un graphe à 64 sommets correspondant aux 64 cases de l’échiquier et on relie les cases qui se trouvent sur la même ligne, la même colonne ou la même diagonale. Le problème des huit reines se ramène alors à l’existence d’un stable à 8 sommets. Celui-ci n’est d’ailleurs pas unique. Il n’existe pas d’algorithme polynomial pour résoudre les problèmes de construction d’ensemble stable (le nombre d’étapes ne peut pas être borné par O(np )).
2.2 Nombre d’absorption Définition 2.2.1 Soit un graphe GT= (X, U ). Un ensemble A ⊂ X est absorbant si et seulement si ∀x ∈ / A, Γ+ (x) A 6= 0. On appelle A la famille des ensembles absorbants de A. Si A ∈ A et A ⊂ A′ , alors A′ ∈ A. Symétriquement à la notion de stable maximal et maximum, on peut définir un absorbant minimal et un absorbant minimum (non unique). Le nombre d’absorption, noté β(G) est bien sûr le cardinal du plus petit absorbant.
2.3 Noyau - fonctions de Grundy 2.3.1 Définitions Définition 2.3.1 Soit un graphe G = (X, U ). Un ensemble A ⊂ X est un noyau si il est à la fois stable et absorbant. Il existe des graphes sans noyaux, ainsi que des graphes à plusieurs noyaux. Théorème 2.3.1 Un noyau est un stable maximal et un absorbant minimal. Théorème 2.3.2 Un graphe simple, sans circuits, admet un noyau. Ce noyau est unique. Définition 2.3.2 Soit un graphe G = (X, U ) un graphe simple sans boucles. Une fonction f : X −→ N est une fonction de Grundy si et seulement si pour tout sommet x, g(x) est le plus petit entier positif ou nul qui n’apparaît pas dans {g(y), y ∈ Γ+ (x)}. Là encore, il n’y a pas forcément existence ou unicité. Si G admet une fonction de Grundy, il admet un noyau dont les sommets sont les 0 de la fonction de Grundy.
2.4. NOMBRE CHROMATIQUE
x1 x2 x3 x4 x5 x6 x7 x8
x1 0 1 0 0 0 1 0 0
x2 0 0 0 0 0 0 0 0
x3 1 1 0 0 0 1 0 0
17 x4 0 1 1 0 0 0 0 0
x5 0 1 1 1 0 0 0 0
x6 0 1 0 0 0 0 0 0
x7 0 1 0 1 1 0 0 0
x8 0 1 0 0 1 0 1 0
2.3.2 Exemple de calcul de fonction de Grundy On cherche à calculer la fonction de Grundy du graphe défini par la matrice d’adjacence suivante : On commence par choisir g(x8 ), x8 est le seul sommet qui n’ait pas de successeur. il n’y a donc pas de contraintes sur g(x8 ). On lui donne alors la valeur 0. De la même façon, x7 a un seul successeur, x8 . Pour construire la fonction de Grundy, on construit le tableau suivant qui contient les successeurs de chacun des sommets et la valeur de la fonction de Grundy pour ceux-ci et la valeur de la fonction de Grundy de chacun des sommets. Dès que la valeur de la fonction de Grundy est définie pour tous les successeurs d’un sommet, on peut définir celle du sommet considéré. x1 x2 x3 x4 x5 x6 x7 x8
Γ(xi ) x3 x1 , x3 , x4 , x5 , x6 , x7 , x8 x4 , x5 x5 , x7 x7 , x8 x4 , x3 x8
g(Γ(xi )) 1 0, 1, 2 0, 2 2, 1 0, 1 1, 0 0
g(xi ) 0 3 1 0 2 2 1 0
Table 2.1: Calcul de la fonction de Grundy
2.4 Nombre chromatique Définition 2.4.1 Une k-coloration des sommets est une partition en k stables (S1 , ..., Sk ) de l’ensemble X des sommets (à un stable correspond une couleur). Définition 2.4.2 Le nombre chromatique de G = (X, U ) est le plus petit nombre
18
CHAPITRE 2. ENSEMBLES PARTICULIERS DANS LES GRAPHES
de couleurs nécessaire pour colorier G de sorte que 2 sommets adjacents soient de couleur différente. On le note χ(G). Le problème le plus courant est celui dit des 4 couleurs: peut-on colorier toute carte de géographie avec 4 couleurs seulement de sorte que deux régions de la carte qui ont une frontière commune soient de couleur différente ? chaque région est représentée par un sommet, les arcs rendant compte de l’existence d’une frontière commune. On a alors un graphe planaire (les arêtes ne se coupent pas), et la réponse est oui. Théorème 2.4.1 G planaire =⇒ χ(G) ≤ 4
Chapitre 3
Familles de graphes possédant des propriétés particulières 3.1 Graphes planaires Définition 3.1.1 Un graphe est planaire s’il est possible de le représenter sur un plan sans que deux de ses arcs ne se rencontrent en dehors de leurs extrémités.
Figure 3.1: Exemple de graphes planaires
Définition 3.1.2 On appelle face toute région du plan limitée par des arêtes telle que deux points arbitraires peuvent être reliés par un trait continu ne rencontrant ni sommet ni arêtes. On appelle alors frontière de la face l’ensemble des arêtes incidentes à celle-ci. Deux faces sont adjacentes si et seulement si elles ont une arête commune. Il y a toujours une face illimitée... Théorème 3.1.1 (formule d’Euler) G planaire connexe possédant n sommets, m arcs et f faces. Alors f = m − n + 2. On rappelle qu’un graphe planaire est 4-colorable. 19
20CHAPITRE 3. FAMILLES DE GRAPHES POSSÉDANT DES PROPRIÉTÉS PARTICULIÈRES
3.2 Graphes hamiltoniens et eulériens 3.2.1 Graphes hamiltoniens Définition 3.2.1 Soit G = (X, U ) un graphe simple, connexe, sans boucles à n sommets. On appelle cycle hamiltonien de G un cycle élémentaire à n sommets (passant une et une seule fois par chaque sommet). Définition 3.2.2 Un graphe qui admet au moins un cycle hamiltonien est appelé graphe hamiltonien. Le graphe complet est hamiltonien. Théorème 3.2.1 Si G est hamiltonien, G est 2-connexe. La réciproque est fausse. Il est algorithmiquement difficile de déterminer un cycle hamiltonien dans un graphe. On dispose par contre d’un certain nombre de conditions suffisantes. Théorème 3.2.2 (Dirac) Soit G = (X, U ) un graphe à n sommets. Si ∀x ∈ X d(x) ≥ n2 , alors G admet un cycle hamiltonien. C’est un cas particulier du théorème suivant. Théorème 3.2.3 (Ore) Soit G = (X, U ) un graphe à n sommets. Si ∀x, y ∈ X tels que (x, y) ∈ / U , d(x) + d(y) ≥ n, alors G est hamiltonien. Ce sont deux corollaires d’un théorème plus général, le théorème de BondyChùatal. Définition 3.2.3 Soit G un graphe à n sommets, k ≤ n un entier, on appelle kfermeture de G le plus petit graphe H à n sommets contenant G tel que si x et y ne sont pas adjacents dans H, dH (x) + dH (y) < k. On obtient cette k-fermeture en reliant récursivement les paires de sommets dont la somme des degrés est supérieure ou égale à k. Théorème 3.2.4 (Bondy-Chùatal) Soit G = (X, U ) un graphe à n sommets, G la n-fermeture de G. G est hamiltonien si et seulement si G est hamiltonien. On peut définir la notion de chaîne hamiltonienne dans un graphe non-orienté.
3.2. GRAPHES HAMILTONIENS ET EULÉRIENS
21
3.2.2 Graphes eulériens Définition 3.2.4 On appelle cycle (resp. chaîne) eulérien un cycle (resp. chaîne) qui passe par toutes les arêtes une et une seule fois. Définition 3.2.5 On appelle graphe eulérien, un graphe qui admet au moins un cycle eulérien. Ce cycle n’est pas forcément élémentaire. L’exemple courant est celui dit des «7 ponts du Königsberg» représenté figure 3.2. La question est de déterminer si un piéton peut faire une promenade en traversant une et une seule fois tous les ponts. Ce problème revient à déterminer si il existe un cycle eulérien dans le graphe dont les sommets sont les îlots et les arcs les ponts. a
b c
d
Figure 3.2: Le problème des 7 ponts du Königsberg
Théorème 3.2.5 Un multigraphe connexe G admet un cycle eulérien si et seulement si ses sommets sont de degré pair. On peut donc répondre par la négative au problème des 7 ponts du Königsberg.
22CHAPITRE 3. FAMILLES DE GRAPHES POSSÉDANT DES PROPRIÉTÉS PARTICULIÈRES
Chapitre 4
Algorithmique des graphes L’objectif de ce chapitre est d’introduire l’algorithmique des graphes, c’est-à-dire les principaux algorithmes que l’on utilise avec es graphes en pratique : le plus court chemin, les flots dans les graphes... On commencera par aborder les problèmes de représentation des graphes en mémoire.
4.1 Représentation en mémoire 4.1.1 Matrice d’adjacence Soit un graphe G = (X, U ), composé de n sommets x1 , ..., xn . Ces sommets vont nous servir à composer une matrice booléenne carrée A = (aij )1≤i,j≤n définie par 1 si (xi , xj ) ∈ U ∀1 ≤ i, j ≤ n, aij = (4.1) 0 sinon
B
A
E
D F
Figure 4.1: Exemple de graphe
23
C
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
24
Dans le graphe de la figure 4.1, la matrice d’adjacence s’écrit donc ainsi : 0 1 0 1 1 0 0 0 1 0 0 0 0 1 0 1 0 0 A= (4.2) 0 0 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0
Si le graphe considéré est non-orienté (ou symétrique), on se contentera d’une matrice triangulaire supérieure. On remarque par ailleurs que la complexité spatiale de cette représentation est en O(n2 ).
4.1.2 Tableaux d’arcs Une alternative à cette représentation lorsque le nombre de sommets est important par rapport au nombre d’arcs consiste à créer deux vecteurs contenant chacun l’origine et l’extrémité des arcs. Ainsi la matrice précédente se réécrirait ainsi : A A A B C C D E E F TA = (4.3) B D E C B D F D F D La complexité spatiale est cette fois en O(m) où m est le nombre d’arcs. A moins de choisir une convention d’ordre, cette représentation n’est pas unique...
4.1.3 Tableaux de successeurs Il s’agit cette fois de construire deux tableaux : • Le premier tableau contient successivement les successeurs du premier sommet, du second sommet... • Le second tableau contient la place dans la liste ci-dessus du premier successeur de chaque sommet. T1 =
B D E C B D F T2 =
D F
1 4 5 7 8 10
D
(4.4) (4.5)
La complexité spatiale de cette représentation est alors de O(n + m).
4.1.4 Listes chaînées Les représentations précédentes sont faciles à mettre en œuvre mais sont mal adaptées aux transformations élémentaires des graphes comme ajouter ou supprimer des sommets et des arcs. On utilise souvent des listes chaînées de pointeurs associées à chaque sommet.
4.2. PARCOURS DE GRAPHES
25
4.2 Parcours de graphes La plupart des algortithmes de graphes utilisent des notions de parcours de graphes c’est-à-dire qu’ils vont effectuer un traitement sur l’ensemble des sommets ou des arcs d’un graphe. Evidemment dans un certain nombre de cas, l’ordre de parcours des sommets ou des arcs n’est pas innocent sur le résultat. Les algorithmes de parcours dépendront aussi naturellement de la structure de données adoptée. Dans les paragraphes qui suivent, nous nous intéresserons d’abord au parcours des arbres que nous généraliserons ensuite aux algorithmes de parcours d’abres.
4.2.1 Parcours des arbres Il existe deux idées principales pour le parcours des sommets d’un arbre : le parcours en largeur d’abord (breadth-first)et le parcours en profondeur d’abord (depthfirst). Dans le cas du parcours en largeur d’abord, le principe est de visiter les sommets dans l’ordre de gauche à droite puis de haut en bas comme le montre la figure 4.2 ; les sommets sont visités dans l’ordre suivant : A, B, C, D, E, F, G, H, I. A
B
E
F
C
D
G
H
I
Figure 4.2: Parcours en largeur d’abord
Inversement, dans le parcours en profondeur d’abord, on visite la racine, puis son premier fils, puis le fils de ce fils etc. La visite est terminée lorsqu’on a visité tous les successeurs d’un sommet. La figure 4.3 illustre ce mécanisme. A
B
E
F
C
G
D
H
Figure 4.3: Parcours en largeur d’abord
I
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
26
4.3 Algorithmes de plus court chemin Les algorithmes de plus court chemin ont un objectif assez explicite : étant donnée une fonction de coût (une distance pour commencer) associé à chaque arc, déterminer le plus court chemin entre deux sommets. Etant donné un graphe G = (X, U ), on associe à chaque arc (x, y) ∈ U une fonction de coût c(x, y) à valeurs réelles. Le problème de plus court chemin entre deux sommets a et b de X consiste donc à déterminer le chemin C = (x1 , ..., xk ) avec x1 = a et xk = b qui minimise la somme des c(xi , xi+1 ) pour 0 ≤ i < k. Il existe trois algorithmes à vocation assez générale, même si ce domaine fait toujours l’objet de recherches actives dans la communauté informatique. En effet, la complexité des algorithmes les rend peu utilisables si l’on s’intéresse à des calculs de plus courts chemins prenant en compte l’ensemble des routes françaises pour déterminer le meilleur chemin entre Landivisiau et Aubagne !
4.3.1 Algorithme de Ford-Bellman L’algorithme, qui calcule l’ensemble des plus courts chemins d’un sommet s au reste du graphe, comprend une étape d’initialisation et une boucle. La première étape d’initialisation établit un ensemble S = {s} des sommets déjà traités, une fonction de distance π et un ensemble A du meilleur prédécesseur pour venir de l’origine. S = {s}, π(s) = 0, A(s) = ǫ TantQue ∃x ∈ / S avec Γ−1 (x) ⊂ S Faire π(x) = miny∈Γ−1 (x) [π(x) + c(x, y)] Soit y˜ un sommet tel que π(x) = π(˜ y ) + c(˜ y , x) A(x) = y˜ et S = S ∪ {x} finTantQue
2 2
4
-2
2
3
3
-1
5
7
2
3
1
6
2
4
5
3 2
Figure 4.4: Exemple de graphe Nous allons calculer le plus court chemin entre 1 et 7. Le tableau 4.1 représente les différentes itérations de l’algorithme de Ford-Bellman.
4.3. ALGORITHMES DE PLUS COURT CHEMIN ǫ 1 0 0 0 0 0 0 0
27
1 2
2 3
2 4
3 5
2,5 6
5 7
3 3 3 3 3 3
1 1 1 1 1
5 5 5 5
3 3 3
5 5
7
Table 4.1: Tableau des itérations de l’algorithme Une fois l’algorithme arrivé à son terme, on retrouve le chemin optimal dans A en partant de la fin. Le sommet 7 a pour meilleur prédécesseur 5, qui a luimême comme prédécesseur 3... Le chemin optimal est donc le chemin 1-2-3-5-7 de longueur 7.
4.3.2 Algorithme de Moore ou de Dijkstra L’algorithme suivant dû à Moore (1957), a été redémontré par Dijkstra en 1959. Il est basé sur une hypothèse restrictive par rapport à l’algorithme précédent : la fonction de coût est positive. π(s) = 0, ∀x 6= s, π(s, x) = c(s, x) si l’arc (s, x) existe et +∞ sinon P = {s}, T = X − {s}, A(s) = ǫ TantQue T 6= 0 Faire Soit x0 ∈ T tel que π(x0 ) = minx∈T π(x) T = T − {x0 } P = P ∪ {x0 } PourTout x ∈ T Faire Si π(x) > π(x0 ) + c(x0 , x) Alors π(x) = π(x0 ) + c(x0 , x) A(x) = x0 FinSi FinPour finTantQue
Nous nous intéressons en guise d’exemple au graphe de la figure 4.5 où nous cherchons le chemin de longueur minimale de x1 à x6 . Le tableau 4.2 représente l’étape d’initialisation de l’algorithme. A la première itération, on sélectionne la valeur la moins élevée (le 3 associé à x2 ici) et on exécute le contenu de l’algorithme. Cela nous mène au second
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
28
2 6
4 3
3
1
1
6
1
3
2
6
6
3 5
5
Figure 4.5: Exemple de graphe A init.
ǫ x1 0
x1 x2 3
x1 x3 6
x4 +∞
x1 x5 3
x6 +∞
Table 4.2: Initialisation de l’algorithme de Dijkstra tableau 4.3 où seule la valeur temporaire du plus court de chemin menant à x4 a été modifiée : en passant par x2 , on peut rejoindre x4 avec un coût de 9. A init.
ǫ x1 0 0
x1 x2 3 3
x1 x3 6 6
x2 x4 +∞ 9
x1 x5 3 3
x6 +∞ +∞
Table 4.3: Première itération de l’algorithme de Disjkstra Le tableau 4.4 présente les autres itérations de l’algorithme.
4.3.3 Algorithmes de Bellmann On s’intéresse maintenant à des algorithmes un petit peu moins restrictifs : plutôt de considérer des graphes à fonction de coût positives, on considère des graphes sans circuits absorbants. Un circuit absorbant est un circuit dont le coût total est négatif. Dès lors, n’importe quel chemin empruntant ce circuit une infinité de fois aura un coût infiniment petit. On présente tout d’abord la version standard de l’algorithme de Bellman. π 1 (s) = 0
4.3. ALGORITHMES DE PLUS COURT CHEMIN A init.
ǫ x1 0 0 0 0 0
x1 x2 3 3 3 3 3
x5 x3 6 6 5 5 5
x3 x4 +∞ 9 9 6 6
x1 x5 3 3 3 3 3
29 x5 ,x4 x6 +∞ +∞ 8 8 7
Table 4.4: Autres étapes de l’algorithme de Disjkstra π 1 (x) = c(s, x), ∀x 6= s Pour m = 1 à n − 2 Faire π m+1 (x) = minx6=s [π m (x), miny6=x [π m (y) + c(y, x)]] FinPour A la fin de l’algorithme, π m−1 (x) contient la valeur du chemin optimal de s à x. 2 6
4 -3
3
1
1
1
3
6
-2
6
6
3
5
5
Figure 4.6: Exemple de graphe
L’application de l’algorithme sur le graphe de la figure 4.6 se traduit dans le tableau 4.5. La validité de l’algorithme se montre de la façon suivante : on veut montrer que m π (x) est la valeur du chemin optimal de s à x comportant au plus m arcs. On va chercher à montrer (récurrence) que cette propriété reste vraie pour π m+1 (x). On considère donc un chemin de valeur minimale de s à x comportant au plus m + 1 arcs : • s’il ne contient pas plus de m arcs, sa valeur est bien π m (x) ;
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
30
π1 π2 π3 π4 π5
x1 0 0 0 0 0
x2 3 3 3 3 3
x3 6 0 0 0 0
x4 +∞ 7 1 1 1
x5 3 3 3 3 3
x6 +∞ 8 8 2 2
Table 4.5: Fonctionnement de l’algorithme de Bellman
• s’il en contient m + 1, sa valeur est π m (xk ) + c(xk , x) qui est bien égale à miny6=x [π m (y) + c(y, x)]. Donc on a bien π
m+1
m m (x) = min π (x), min [π (y) + c(y, x)] y6=x
(4.6)
qui est la valeur du chemin optimal de s à x comportant au plus m + 1 arcs. Si l’on cherche tous les plus courts chemins entre deux quelconques des sommets du graphe, on aboutit à des algorithmes en O(n4 ). L’algorithme matriciel développé dans ce paragraphe est une reprise de l’algorithme de Roy-Warshall développé pour la détermination de la fermeture transitive. Il s’initialise ainsi : valeur de l’arc s’il existe (0) Πij = 0 si i = j (4.7) +∞ sinon L’algorithme est alors le suivant :
Pour m de 1 à n Faire Pour i de 1 à n Faire Pour j de 1 à n Faire (m) (m−1) (m−1) (m−1) Πij = min{Πij , Πim + Πmj } FinPour FinPour FinPour
(m)
Πij représente la longueur du chemin optimal de i à j dont les sommets intermédiaires appartiennent à {1, ..., m}. Nous disposons ainsi d’un algorithme en O(n3 ) qui donne la longueur des chemins optimaux entre deux sommets quelconques du graphe. L’application de l’algorithme sur le graphe de la figure 4.6 se traduit dans les matrices suivantes.
4.4. PROBLÈME DU FLOT MAXIMAL
31
2 4
1
1
4
1 1
2
1
3
5 3
Figure 4.7: Exemple de graphe
0 1 2 +∞ +∞ +∞ 0 1 4 +∞ A = +∞ +∞ 0 1 3 +∞ +∞ +∞ 0 1 +∞ +∞ +∞ +∞ 0 0 1 2 3 5 +∞ 0 1 2 4 2 A = +∞ +∞ 0 1 2 +∞ +∞ +∞ 0 1 +∞ +∞ +∞ +∞ 0 0 1 2 3 5 +∞ 0 1 2 3 3 +∞ +∞ 0 1 2 A = +∞ +∞ +∞ 0 1 +∞ +∞ +∞ +∞ 0
(4.8)
(4.9)
(4.10)
4.4 Problème du flot maximal 4.4.1 Définitions On s’intéresse maintenant à faire circuler des quantités dans un graphe et à maximiser la quantité circulant entre 2 ou plusieurs arcs de ce graphe. Les applications sont immédiates : il peut s’agir de transporter le maximum de monde entre deux points de l’espace en utilisant plusieurs routes mais aussi d’acheminer des fluides via des canalisations1 ou des informations dans un réseau. Le paragraphe suivant s’intéressera au même problème mais en visant à minimiser le coût de ce transport. 1 La cas des canalisations est particulier puisqu’en plus d’avoir une capacité maximale, les canalisations peuvent nécessiter une capacité minimale, par exemple une pression de gaz minimale.
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
32
Définition 4.4.1 Soit un graphe G = (X, U ). On appelle capacité cij associée à l’arc (i, j) un réel positif ou nul représentant la quantité maximale pouvant circuler sur un arc. On appelle flot xij sur l’arc (i, j) le réel représentant la quantité circulant réellement sur l’arc, en vérifiant la contrainte 0 ≤ xij ≤ cij . On appelle flot sur G l’ensemble des flots associés à chaque arc du graphe G. Pour être valide (on dira admissible), le flot dans un graphe doit vérifier une loi de conservation simple définie par analogie avec la loi de Kirchhoff en électricité : tout flot entrant dans un nœud doit en ressortir. Elle est valable en tout nœud d’un graphe sauf dans deux nœuds particuliers s et t qu’on appellera respectivement source et puits du graphe. Au niveau de la source, il y a création de flot, tandis qu’au niveau du puits il y a absorption. Sur les autres nœuds i, la loi de conservation s’écrit ainsi : X X xij = xik (4.11) k∈Γ+ (i)
j∈Γ− (i)
On représente un graphe avec le flot et la capacité associés comme sur la figure 4.8. 1
3 2[ 3]
1 [1]
s
] [1
0 [1]
3] 0
1[
1 [2]
2[ 2]
t
1[
2
2]
4 2 [2]
Figure 4.8: Représentation d’un flot dans un graphe
Pour vérifier la loi de conservation de façon générale, on va ajouter un arc de retour fictif entre t et s et on appellera valeur du flot la quantité circulant sur l’arc (t, s), comme le montre la figure 4.9. Dès lors, on peut définir le problème de flot maximal comme étant la maximisation de xts sous les contraintes de respect des capacités et de la loi de conservation. On remarquera qu’il s’agit d’une forme particulière de programme linéaire.
4.4.2 Résolution du problème de flot maximal Définition 4.4.2 On définit une chaîne augmentante u de s à t pour un flot admissible donné comme une chaîne de s à t respectant les contraintes suivantes : • xij < cij pour tout arc dirigé de s vers t
4.4. PROBLÈME DU FLOT MAXIMAL 1
3 2[ 3]
1 [1]
s
] [1
0 [1]
3] 0
1[
1 [2]
33
2[ 2]
t
1[
2
2]
4 2 [2]
3
Figure 4.9: Représentation d’un flot dans un graphe avec un arc de retour fictif
• xij > 0 pour tout arc dirigé de t vers s La chaîne µ définie sur la figure 4.10 est une chaîne augmentante de l’exemple de graphe précédent. On appelle µ+ l’ensemble des arcs de µ dans le sens de s vers t, µ− ceux qui sont dans l’autre sens. 1
3
3]
1 [1]
1[
1 [2]
s
t
1[
2]
4
Figure 4.10: Exemple de chaîne augmentante
Le flot peut alors être augmenté du flot circulant sur la chaîne augmentante ; on notera qu’en tenant compte du sens des arcs, la loi de conversation se vérifie sur l’ensemble des arcs de la chaîne. L’augmentation α du flot correspondante est alors du minimum des capacités résiduelles (la capacité de l’arc moins le flot circulant déjà) pour les arcs de s vers t et le minimum des flots circulant effectivement pour les arcs de t vers s. α = min min (cij − xij ), min xij (4.12) (i,j)∈µ+
(i,j)∈µ−
Pour augmenter le flot, on ajoute α au flux des arcs de µ+ et on retranche α au flux des arcs de µ− .
34
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
Définition 4.4.3 On dit que le flot est complet lorsque tout chemin de s à t comporte au moins un arc saturé ((i, j) est saturé lorsque xij = cij ). Définition 4.4.4 Une coupe associée à un graphe G = (X, U ) est une partition de X en deux ensembles P S et T telle que s ∈ S et t ∈ T . On appelle capacité de la coupe c(S, T ) = i∈S,j∈T cij . Théorème 4.4.1 Un flot x de s à t est maximal s’il n’existe pas de chaîne augmentante de s à t. On en déduit en corollaire : Propriété 4.4.2.1 Soit un graphe G = (X, u). Quelle que soit la coupe (S, T ), quel que soit le flot admissible x, alors la valeur du flot x est inférieure ou égale à la capacité de la coupe (S, T ). Théorème 4.4.2 (Ford-Fulkerson) La valeur du flot maximal est égal à la capacité de la coupe de capacité minimale. On en déduit l’algorithme de recherche du flot maximal : il consiste à exhiber une chaîne augmentante et à augmenter le flot de la valeur de la chaîne augmentante tant qu’il existe des chaînes augmentantes.
4.4.3 Algorithme de Ford-Fulkerson et exemple Soit x un flot admissible, marquer + le sommet s Répéter Si i est marqué et j non marqué Alors Si (i, j) est un arc non saturé Alors marquer j avec + FinSi Si (j, i) est un arc tel que xij > 0 Alors marquer j avec FinSi FinSi Jusqu’à ce qu’on ne puisse plus marquer de sommets Si t est marqué Alors il existe une chaîne augmentante de s à t augmenter le flot et recommencer Sinon le flot est maximal FinSi
4.4. PROBLÈME DU FLOT MAXIMAL
A
35
D 5 [20] [1 0]
s
1
5] 5 [1
B
[2 0]
E
35 [35] 30 [
20
10
15
5] [3
t 30 [30]
20 [25] 0 [5
40 ]
]
1
0] 0 [2
C
30
0] [6
F 20 [20] 80
Figure 4.11: Flot initial pour l’algorithme de Ford-Fulkerson
+s
+A
A
D 5 [20] 0] [1
s
-D
15
] [ 15
B 35 [35] 30 [
+C
[2 0]
E
t 30 [30]
20 [25] 0 [5
40 ]
20
10
15
+
5] [3
]
+s 1
0] 0 [2
C
+B
30
0] [6
F 20 [20]
Figure 4.12: Marquage pour l’algorithme de Ford-Fulkerson
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
36
Faisons maintenant fonctionner l’algorithme sur un exemple, celui du graphe de la figure 4.11. On notera que ce graphe comporte un flot initial non nul afin de réduire le nombre d’itérations de l’algorithme. Après marquage, le graphe devient celui de la figure 4.12. A partir des marquages, on retrouve la chaîne augmentante de la figure 4.13. Elle nous permet d’augmenter le flot de 5, ce qui donne le nouveau flot représenté figure 4.14. A
D 5 [20]
15
5] [3
s
15
[ 15
]
B
t 0 [5
]
30
0] [6
F
Figure 4.13: Chaîne augmentante
A
D 10 [20] [1 0]
s
10
] [ 15
B 35 [35] 30 [
20
10
20
5] [3
E 5 [5
t 30 [30]
20 [25]
40 ]
[2 0]
]
1
0] 0 [2
C
35
0] [6
F 20 [20] 85
Figure 4.14: Nouveau flot après augmentation de 5
Une nouvelle procédure de marquage aboutit au graphe de la figure 4.15. Le sommet t n’est pas marqué, donc l’algorithme est terminé et le flot est maximal.
4.4. PROBLÈME DU FLOT MAXIMAL
37
La ligne verte sépare les deux ensembles de la coupe de capacité minimale. +A
+s A
D 10 [20] 20
10 0] [1
20
+
5] [3
10
-D
s
] [ 15
+B
B
E
35 [35] 30 [
t 30 [30]
20 [25] 5 [5
40 ]
[2 0]
+s
]
1
0] 0 [2
35
C
0] [6
F 20 [20] 85
Figure 4.15: Fin de l’algorithme La complexité de l’algorithme se détermine difficilement : la procédure de marquage nécessite deux examens et est donc en O(m). Le nombre d’itérations dépend quand à lui largement de la valeur du flot et de la chaîne augmentante choisie, d’où l’intérêt de ne pas prendre un flot nul au départ. Si on considère l’exemple de la figure 4.16 qu’on augmente systématiquement en passant par la branche centrale (dans le bon sens pour les itérations impaires et dans l’autre sens pour les itérations paires), le nombre d’itérations est alors de 100000 alors qu’en deux itérations mieux choisies, le flot aurait été maximal.
[1 00 00 0]
[1 00 00 0] 1
0]
1 0]
0]
1
t
00 00 [1
[1 00 00 0]
s 1
00 00 [1
00 00 [1
0
[1 00 00 0]
[1 00 00 0]
[1 00 00 0]
0] 00 00 [1
0
1
t
2
0 [100000]
0] 00 00 [1
s 0
0
2
1 [100000]
0] 00 00 [1
t
1 0
0
0 [100000]
s
1
1
1
2
Figure 4.16: Mauvais choix des chaînes augmentantes
Théorème 4.4.3 Si chaque augmentation de flot est faite suivant une chaîne augmentante de longueur minimale, alors le flot maximal est obtenu après moins de
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
38 mn 2
itérations, soit une complexité totale en O(m2 n).
4.5 Flot maximal à coût minimal 4.5.1 Définitions Nous nous intéressons maintenant au même problème de détermination d’un flot maximal sauf que nous allons ajouter pour être plus réalistes un coût unitaire sur chacun des arcs. Il s’agira donc de déterminer le flot maximal à coût minimal. On considère toujours un graphe G = (X, U ) comportant une source s et un puits p associant à chaque arc (i, j) ∈ U une capacité cij et un flot 0 ≤ xij ≤ cij vérifiant en outre les contraintes de la loi de conservation. On ajoute alors à chaque arc (i, j) ∈ U un coût unitaire dij . Le problème du flot maximal à coût minimalPconsiste donc à parcourir tous les flots maximaux et à trouver celui qui minimise (i,j)∈U xij dij . Définition 4.5.1 On définit le graphe d’écart G = (X, U e ) associé à G = (X, U ) vérifiant (i, j) ∈ U e si et seulement si : • (i, j) ∈ U et xij < cij (1) • (j, i) ∈ U et xij > 0 (2) Alors la capacité et le coût de (i, j) ∈ U e seront respectivement de • cij − xij et +dij dans le cas (1) • xij et −dij dans le cas (2)
4.5.2 Algorithme de Roy L’algorithme que nous allons décrire est dû à Roy, il consiste à partir d’un flot nul (donc de coût minimal) à augmenter le flot progressivement en conservant la propriété de coût minimal. D’autres algorithmes (Bennington par exemple) partent d’un flot maximal dont ils vont chercher à minimiser le coût. x0 = (0, ..., 0), k = 0 Construire le graphe d’écart Gek Tantque il existe un chemin de s à t dans Gek k = k+1 Soit µk le plus court chemin de s à t Soit c la plus petite capacité des arcs de µk Calculer un nouveau flot xk+1 xk+1 (i, j) = xk (i, j) + c si (i, j) ∈ µk xk+1 (i, j) = xk (i, j) − c si (j, i) ∈ µk xk+1 (i, j) = xk (i, j) sinon
4.5. FLOT MAXIMAL À COÛT MINIMAL
39
on obtient un nouveau flot augmenté de c FinTantQue
Propriété 4.5.2.1 A chaque étape k de l’algorithme, le flot xk est de coût minimal.
4.5.3 Exemple On considère le graphe de la figure 4.17. [3] (2) a (2) [5]
s
[4] (3) (1 )
[3] (2) b
(4)
[4] (1) e
[2] (
c
[3]
3)
[5] (2)
t
[1] (5)
[3]
d
f
[4]
( 3)
Figure 4.17: Exemple et premier graphe d’écart
Compte tenu de la définition vue plus haut, le premier graphe d’écart (construit à flot nul) est le graphe lui-même. On commence donc par cherche le plus court chemin entre s et t. On considère donc le chemin (s, b, e, t) dont la capacité minimale est 3. On augmente alors le flot de 3 et on construit le second graphe d’écart de la figure 4.18 où les nouveaux arcs et les modifications sont portées en rouge. a
[3] (2)
d [3 ]
(2) ] 5 [
[3] (-3) s
[1] (3) (1 )
e [2] (
c
3)
[5] (2)
[1] (1)
[1] (5)
[3]
)
[3] (-1)
[3] (-2) b
(4
f
Figure 4.18: Second graphe d’écart
[4]
( 3)
t
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
40
Le plus court chemin dans ce second graphe d’écart est le chemin (s, c, f, t), sa capacité minimale est de 3. On peut augmenter le flot de 3 et construire le troisième graphe d’écart de la figure 4.19 où les nouvelles modifications sont portées en bleu. Le plus court chemin est cette fois le chemin (s, a, d, t) et on peut encore augmenter le flot de 3, ce qui nous mène au quatrième graphe d’écart où les modifications sont portées en vert. Le plus court chemin est alors (s, b, f, t), on peut augmenter le flot de 1, ce qui donne le cinquième graphe d’écart de la figure 4.21 où les modifications sont portées en mauve. a
[3] (2)
d [3 ]
(2) [5]
[3] (-3) s
[1] (3) (-1 )
e [2] (
c
3)
[2] (2)
f
t
[1] (1)
[1] (5)
[3 ]
)
[3] (-1)
[3] (-2) b
(4
[1]
( 3)
[3] (-3)
[3] (-2)
Figure 4.19: Troisième graphe d’écart
[3] (-2)
a
[3] (-2)
d
(2) ] 2 [
[3] (-3) s
[1] (3) (-1 )
e [2] (
c
3)
[2] (2)
)
[1] (1)
[1] (5)
[3 ]
(-4
[3] (-1)
[3] (-2) b
[3]
f
[3] (-2)
Figure 4.20: Quatrième graphe d’écart
[1]
( 3)
[3] (-3)
t
4.5. FLOT MAXIMAL À COÛT MINIMAL
[3] (-2)
a
[3] (-2)
41
d
[3]
(2) ] 2 [
[4] (-3) (-1 )
[1] (-3) [1] (
c
3)
[2] (2)
e
f
[3] (-2)
Figure 4.21: Cinquième graphe d’écart
t
[1] (1)
[1] (5)
[3 ]
b
)
[3] (-1)
[3] (-2) s
(-4
[4]
(-3
)
42
CHAPITRE 4. ALGORITHMIQUE DES GRAPHES
Chapitre 5
Démonstrations Démonstration du théorème 1.2.1 Soit a ∈ U une arête de G. Alors, ou a est une boucle autour d’un sommet x de G et intervient pour 2 dans le degré de x, ou a = (x, y) intervient pour 1 dans le degré de x et pour 1 dans le degré de y. On a donc X
d(x) = 2|U |
(5.1)
x∈X
˜ le sous-ensemble de X d(x) est donc un nombre pair. Si on appelle X ˜ ont un degré impair, alors tel que les x ∈ X P
x∈X
X
x∈X
d(x) = 2|X| =
X
˜ x∈X
d(x) +
X
d(x)
(5.2)
˜ x∈X−X
Le membre de gauche de l’équation P est pair, le second terme du nombre de droite est pair aussi, donc le nombre x∈X˜ d(x) est pair, ce qui est alors néces˜ sairement le cas de |X|. Démonstration de la propriété 1.3.0.1 R est évidemment réflexive. Soit (ui )1≤i≤n une chaine de U reliant x à y. Alors la suite des (u′i ) définie par u′i = un−i est aussi une chaine de U et constitue bien une chaine de y à x. R est donc bien symétrique. Enfin, si xRy et yRz, c’est bien qu’il existe deux suites de U menant respectivement de x à y et de y à z. La concaténation de ces deux suites fournit une chaine évidente entre x et z, d’où la transitivité de R. R est donc bien une relation d’équivalence. Démonstration de la propriété 1.3.0.2 R′ est évidemment réflexive et symétrique. Enfin, si xR′ y et yR′ z, c’est bien qu’il existe deux suites de U menant respectivement de x à y et de y à z (ainsi que de y à x et de z à y). La concaténation de ces deux suites fournit un chemin évident entre x et z (resp. entre z et x), d’où la transitivité de R′ . R′ est donc bien une relation d’équivalence. 43
44
CHAPITRE 5. DÉMONSTRATIONS
Démonstration du théorème 1.4.2 =⇒ S’il existe A 6= 0 et A 6= X tel que Γ+ (A) = A et un y 6 ∈A, alors il n’y aura pas de chemin jusqu’à y. ⇐= Soient x et y donnés, on construit A0 = {x} et la suite des Ai par la relation de récurrence suivante : Ai = Ai−1 ∪ Γ+ (Ai−1 ). X étant fini, il existe un i tel que y ∈ Ai , ce qui implique qu’il existe un chemin entre x et y.