Beruflich Dokumente
Kultur Dokumente
Remark 1 Dans un arbre, une feuille est un sommet de degré 1. Les composantes connexes
d’une forêt sont donc des arbres.
Theorem 1 Soit G un graphe non orienté à n sommets. Les propiétés suivantes sont équiv-
alentes :
1. G est un arbre
2. deux sommets quelconques de G sont joints par une chaîne et une seule
4. G est connexe et si on supprime une arête, le graphe obtenu n’est plus connexe
On rencontre également des arbres particuliers dans lesquels un sommet est distingué et les
arcs son orientés de ce sommet vers les autres :
De…nition 2 Une arborescence est un graphe orienté muni d’un sommet particulier r
appelé racine tel que
– le graphe obtenu en oubliant l’orientation est un arbre
– tout sommet di¤érent de r peut être atteint par un chemin partant de r
1
Remark 2 Un arbre étant connexe, on peut déterminer si un graphe G est connexe en
essayant de construire un arbre couvrant pour G. Pour cela, on peut faire un parcours en
profondeur ou en largeur du graphe (voir TD).
De…nition 4 Soit G un graphe valué non orienté connexe. Un arbre couvrant de poids
minimal est un arbre couvrant dont le poids est le plus petit possible parmi les arbres couvrants
de G.
Formulation du problème
Soit G = (S; A) un graphe connexe de n sommets et m arêtes. On suppose que G est valué
par une fonction de valuation V positive.
Un arbre couvrant T = (S; T ) est un graphe partiel de G qui a la propriété d’un arbre (
ç-à-d sans cycle). On a donc jT j = n 1: Le poids de T est
X
v (T ) = lij :
(xi ;xj )2T
2
Il est clair que le graphe partiel cherché est sans cycle (si on enlève une arête a un cycle d’un
graphe connexe, le graphe reste connexe), c’est donc un arbre : le problème se ramène donc
au Problème de l’arbre recouvrant de poids minimal : étant donné un graphe non
orienté connexe G dont les arêtes sont valuées par des nombres positifs (poids), déterminer
un arbre qui soit un graphe partiel de G (arbre recouvrant G) de poids total minimum.
Algorithme de Kruskal
L’algorithme de Kruskal suppose que les n arêtes a1 ; a2 ; : : : ; an du graphe G sont numérotées
par ordre croissant de poids.
Le principe consiste à construire un sous-graphe en ajoutant des arêtes une par une. A
chaque étape, on cherche l’arête de plus petite valuation parmi celles que l’on n’a pas déjà
explorées. Si elle ne crée pas de cycle, on l’ajoute au sous-graphe, sinon on la laisse de côté.
On termine dès que l’on a sélectionné (n 1) arêtes ou qu’il ne reste plus d’arêtes ne créant
pas de cycles.
3
Preuve de l’algorithme : A peut s’obtenir en enlevant successivement a G des arêtes
faisant partie d’un cycle, donc A est connexe; comme A ne comporte pas de cycle, c’est un
arbre.
Soit B un arbre recouvrant de G : à chaque arête a de A, on peut associer une et une seule
arête b de B reliant les deux composantes connexes de A privé de l’arête a. Mais l’arête b
n’a
pu être éliminée par l’algorithme de Kruskal que si elle etait de poids supérieur ou egal
à a (puisqu’elle ne crée pas de cycle dans A privé de a): le passage de A à B ne peut
qu’augmenter
le poids total, et par conséquent A est de poids minimal.
( A noter que si toutes les arêtes sont de poids di¤érents, la solution est unique; il ne peut y
avoir plusieurs solutions que si, parmi des arêtes de même poids, un choix d’élimination se
propose.)
Complexité : la boucle POUR de l’algorithme est exécutée jAj fois; le test permettant de
savoir si une arête crée ou non un cycle dans A peut se faire en moins de jSj opérations (le
nombre d’arêtes de l’arbre A étant jSj 1). La complexité est donc de l’ordre de jAj jSj
(le tri des arêtes, qui peut se faire en jAj log A opérations, est négligeable).
Algorithme de Prim
Principe : On construit un sous-graphe en ajoutant arêtes et sommets les uns après les autres.
A chaque étape, on cherche l’arête sortante de plus petite valuation. Une arête est sortante
4
si elle joint un sommet du sous-graphe à un sommet qui n’est pas dans le sous-graphe. On
termine dès que l’on a sélectionné (n 1) arêtes.
L’algorithme de Prim se base sur la caractérisation des arbres comme des graphes connexes
minimaux au sens de l’inclusion : on ne peut enlever une arête à un arbre sans le déconnecter
(cf caractérisation des arbres). L’idée de l’algorithme est de maintenir un sous-graphe partiel
connexe, en connectant à nouveau sommet à chaque étape. L’algorithme de Prim va ainsi
faire grossir un arbre jusqu’à ce qu’il couvre tous les sommets du graphe. Si à une étape
un ensemble U de sommets sont connectés entre eux, pour choisir le prochain sommet à
connecter, l’algorithme part d’une constatation simple : dans un arbre couvrant, il existe
nécessairement une arête qui relie l’un des sommets de U avec un sommet en dehors de U .
Pour construire un arbre couvrant de poids minimum (M ST ), il su¢ t de choisir parmi ces
arêtes sortantes celle de poids le plus faible.
Pour détecter les arêtes sortantes, nous pouvons marquer au fur et à mesure de l’algorithme
les sommets déjà connectés. Une arête sortante relie alors nécessairement un sommet marqué
et un sommet non marqué. L’algorithme de Prim apparaît ainsi comme une adaptation de
l’algorithme de recherche pour le problème du M ST . Reste une question : de quel sommet
partir ? Eh bien le choix du sommet initial n’a pas d’importance... tout sommet doit de
toute manière être relié aux autres dans l’arbre …nal.
Algorithme : Algorithme de Prim (arbre couvrant de poids minimal)
Prim(G(S,A,v))
fonction T = prim(G)
5
poids = poids total de l’arbre couvrant (initialisé à 0)
marquer le sommet 1
tant que il reste des sommets non-marqués faire
fx; yg = arête de coût minimal joignant un sommet marqué x et un sommet non-marqué y
marquer le sommet y et ajouter l’arête fx; yg à T
poids = poids +V (x; y)
…n faire
De…nition 5 (Cocycle) Dans un graphe G = (S; A), le cocycle d’un ensemble de sommets
U est l’ensemble des arêtes (u; v) telles que u 2 U et v 2 V nU .
Remark 3 Les algorithmes de Prim et de Kruskal sont tous deux des algorithmes gloutons.
Le premier consiste à choisir arbitrairement un sommet et à faire croître un arbre à partir de
ce sommet. Le second consiste à faire croître une forêt jusqu’à couverture complète. Chaque
augmentation se fait de la manière la plus économique possible.
Proof. Remarquons tout d’abord que l’algorithme de Prim retourne un arbre couvrant.
En e¤et, lorsque l’algorithme s’arrête, il ne reste plus de sommet non marqué adjacent à
un sommet marqué. Le graphe G étant connexe, tous les sommets sont donc marqués.
Le marquage d’un sommet allant de paire avec l’ajout de l’une de ses arêtes incidentes
le connectant à un sommet déjà marqué, le graphe T = (S; F ) est connexe et comporte
exactement (jSj 1) arêtes : c’est un arbre couvrant. Il nous reste à établir que T est
de poids minimum. Pour cela nous allons montrer par induction qu’à chaque étape, si F
est l’ensemble des arêtes sélectionnées, alors il existe un arbre couvrant de poids minimum
comportant les arêtes de F . Initialement F est vide : la propriété est évidemment véri…ée
Considérons une étape où un ensemble U de sommets sont marqués et un ensemble F d’arêtes
ont été sélectionnées, et suppososns qu’il existe un arbre couvrant de poids minimum T
comportant les arêtes de F . L’étape suivante consiste au marquage d’un sommet y et à
l’ajout à F de l’arête e = (x; y). Il nous faut montrer qu’il existe un M ST comportant les
arêtes de F 0 = F [ feg. Si l’arête e appartient à T , nous en avons terminé. Sinon ajoutons
e aux arêtes de T . Les caractérisations des arbres montrent que nous créons alors un cycle.
Ce cycle parcours à la fois des sommets de U (parmi eux x) et des sommets en dehors de
U (parmi eux y). Il existe donc nécessairement au moins une arête e0 = (x0 ; y 0 ) du cycle,
di¤érente de e, telle que x0 soit marqué et y 0 soit non marqué. Le graphe T ’ obtenu en
retirant cette arête redevient un arbre couvrant pour G. De plus il est optimal. En e¤et
6
l’arête e0 est une arête sortante pour U : par construction e est donc de poids inférieur ou
égal.
Example 1 Nous allons appliquer l’algorithme de Prim au même problème que précédem-
ment. Partons par exemple du sommet A. A…n de visualiser le déroulement de l’algorithme,
nous représenterons les arêtes de l’arbre couvrant par des arêtes doubles, les arêtes sortantes
par des arêtes simples et les autres arêtes en pointillé.
La première étape consiste à choisir l’arête partant de A de valuation minimale : c’est l’arête
(A; B). On l’intègre donc à l’arbre couvrant puis on cherche l’arête de valuation minimale
parmi les arêtes qui sortent du sous-ensemble de sommets fA; Bg. On continue le procédé
jusqu’à avoir les (n 1) arêtes.
7
Problèmes de ‡ots
Réseaux de transport
De…nition 6 Un graphe fortement connexe (il existe un chemin joignant deux sommets
quelconque), sans boucle et ayant plus d’un sommet, est appelé un réseau.
On appelle noeud d’un réseau un sommet qui a plus de deux arcs incidents. Les autres
sommets sont appelés antinoeuds.
On appelle branche tout chemin pour lequel seuls les premiers et derniers sommets sont des
noeuds.
1. sans circuit
1
2. muni d’une source : un sommet s 2 S tel que d (s) = 0 ( ou encore (s) = ;)
c : A ! ]0; +1[
8
5. il existe au moins un chemin de s vers p.
9
1. 8 a 2 A, '(a) c(a) ( il ne dépasse pas la capacité des arcs)
2. 8x 2 S; x 6= s; x 6= p
X X
' (a) = ' (a) ( loi des noeuds de Kirchho¤)
a2Ax a2A+
x
‡ot entrant en x ‡ot entrant en x
En d’autres termes, ce qui rentre égale ce qui sort. On appelle alors valeur du ‡ot f la
quantité X X
'x = ' (a) = ' (a) :
a2Ax a2A+
x
Example 3 On indique sur chaque arc la valeur du ‡ot à côté de la capacité. Le graphe
ci-dessous représente un ‡ot dans le réseau de transport de l’exemple 5.1.
On véri…e qu’en chaque sommet, la somme des ‡ots des arcs entrants est égale à la somme
des ‡ots des arcs sortants. La valeur du ‡ot est, de façon équivalente, le ‡ot sortant de s ou
le ‡ot entrant de p. Ici, 'x = 2.
Objectif : optimiser le parcours global du réseau en tenant compte des contraintes données
par les capacités limitées de chaque partie du réseau.
10
Si l’on considère le graphe partiel engendré par les arcs non saturés par le ‡ot et si le ‡ot
n’est pas complet, il existe nécessairement un chemin allant de l’entrée à la sortie. On
peut alors dé…nir un nouveau ‡ot pour le réseau en augmentant de 1 le ‡ot de chacun des
arcs constituant le chemin ; la valeur du ‡ot est alors également augmentée de 1: On peut
donc progressivement augmenter la valeur d’un ‡ot incomplet jusqu’à ce qu’il soit complet.
En tenant compte des di¤érences entre les capacités et la valeur du ‡ot sur les arcs de ;
on peut connaitre d’avance l’augmentation possible du ‡ot. cependant, le ‡ot complet ainsi
obtenu n’est pas en général, le ‡ot maximal.
Amélioration du ‡ot
Soit ' un ‡ot complet. On va utiliser une procédure itérative pour identi…er et marquer tous
les sommets du graphe où il est possible de faire une unité de ‡ot supplémentaire.
On dé…nit un processus d’étiquetage de certains sommets du graphe. En x1 ; on place une
étiquette [+] : Soit x un sommet déja marqué :
-) on marque avec une étiquette (+x) tout successeur y non maqué de x pour lequel le ‡ot
n’est pas à son maximum
(x; y) 2 A et ' (x; y) < c (x; y) :
-) on marque avec une étiquette ( x) tout prédécesseur y non maqué de x pour lequel le
‡ot n’est pas nul
(x; y) 2 A et ' (x; y) > 0:
L’étiquette a pour rôle de donner le nom d’un prédécesseur ou d’un successeur d’un sommet
donné en indiquant si le ‡ot peut être augmenté dans le sens du parcours ( étiquette (+x) )
ou diminué s’il est dans le sens contraire ( étiquette ( x) ).
Si l’on parvient jusqu’au marquage du sommet xn avec cette procédure, c’est qu’il existe
une chaîne de x1 à xn dont tous les sommets sont marqués avec l’indice du sommet
précédent au signe près. Notons que l’on est pas obligé de marquer tous les sommets ( tous
les successeurs ou prédécesseurs d’un sommet donné); l’objectif étant simplement d’élaborer
une chaîne marquée de x1 à xn :
Soit alors
8
< '0 (a) = ' (a) si a2
=
0
' (a) = ' (a) + 1 si a 2 et si a est orienté dans le sens de
: 0
' (a) = ' (a) 1 si a 2 et si a est orienté dans le sens contraire de :
On véri…e aisément que '0 est encore un ‡ot. Comme '0xn = 'xn + 1; la valeur du ‡ot ' est
supérieure, donc meilleure que celle de ':
On peut alors systématiser l’idée précédente en introduisant la notion de graphe d’écart ou
réseau résiduel.
Le réseau résiduel indique le long de quels arcs on peut augmenter ou diminuer le ‡ot.
L’intérêt du graphe d’écart apparaît dans le théorème suivant.
11
Theorem 4 Soit ' un ‡ot de G ( de x1 à xn ) et G b (') le réseau résiduel associé à ': Une
condition nécessaire et su¢ sante pour que le ‡ot ' soit maximal est qu’il n’existe pas de
chemin de x1 à xn dans G b (') :
: Ford et Fulkerson
(a) - Itération k = 0
-Partir d’un ‡ot initial '0 (compatible avec les contraintes de capacité), par exemple '0 =
(0; 0; ; 0) :
(b) - A l’itération k; soit 'k le ‡ot courant.
-Rechercher un chemin k de x1 à xn dans le graphe d’écart G b 'k :
k k
(c) - Soit " la capacité résiduelle du chemin (minimum des capacités résiduelles des arcs
du chemin)
-Dé…nir le ‡ot 'k+1 par :
'k+1
a = 'ka + "k si a 2 et si a est orienté dans le sens de
k+1 k k
'a = 'a " si a 2 et si a est orienté dans le sens contraire de :
Remark 5 Par dé…nition du graphe d’écart, les ‡ots 'k sont tous compatibles avec les ca-
pacités. Par ailleurs, "k est positif à chaque itération et par suite, l’algorithme produit une
séquence de ‡ots compatibles de valeurs strictement croissantes.
D’autre part, le principe consiste à rechercher une chaîne joignant x1 à xn : Il est évident que
le choix d’une telle chaîne n’est pas unique.
12
Chemin augmentant / Chaîne augmentante
Idée : (1) Considérons une nouvelle fois le réseau de transport de l’exemple 5.1.1. On
commence par y faire passer le ‡ot nul, puis on remarque que pour chaque arc u du chemin
s; a; b; p, on a :
f (u) < c(u):
On a donc
On peut donc augmenter la valeur du ‡ot sur chaque arc de ce chemin. On peut ensuite
faire la même chose avec le chemin s; b; p, on obtient alors le ‡ot suivant :
Il n’y a plus de tel chemin et nous avons trouvé un ‡ot de valeur 2. Peut-on cependant
encore améliorer le ‡ot ?
13
(2) La réponse est oui, comme le prouve le ‡ot suivant, de valeur 3 :
A…n de trouver ce type d’amélioration, il su¢ t de rechercher ce qu’on va appeler une chaîne
augmentante, c’est-à-dire une chaîne de s vers p telle que les arcs pris dans le bon sens
peuvent être augmentés et les arcs pris à l’envers peuvent être diminués. Dans l’exemple
ci-dessus, c’est le cas de la chaîne s; b; a; p puisque les arcs (s; b) et (a; p) n’étaient pas saturés
et l’arc (a; b), pris à l’envers, avait une valeur positive.
14
5: (le ‡ot obtenu à cette étape est un ‡ot complet)
6: tantque il existe une chaîne augmentante de s à p faire
7: augmenter le ‡ot
8: …n tantque
9: (le ‡ot obtenu à cette étape est un ‡ot maximal)
Remark 6 Les ‡ots sont un modèle des réseaux de communication (circuits electriques,
réseau de machines, réseau de transport...)
Remark 7 Il faut toujours commencer par les chemins augmentants, jusqu’à ce qu’il n’y en
ait plus.
Le théorème suivant permet de trouver une coupe de capacité minimale associée à un ‡ot
maximal.
15