Chapitre 5 : Graphes

Download Report

Transcript Chapitre 5 : Graphes

Chapitre 5 : Graphes
Alexandre Blondin Mass´e
Laboratoire d’informatique formelle
Universit´
e du Qu´
ebec `
a Chicoutimi
3 f´evrier 2014
Cours 8INF870
D´epartement d’informatique et math´ematique
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
1 / 74
Table des mati`eres
1. Parcours de graphes
2. Graphes acycliques
3. Composantes fortement connexes
4. Plus courts chemins
5. Tous les plus courts chemins
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
2 / 74
Graphes orient´es
1
2
3
4
5
6
1 2 3 4 5 6
1
2
3
4
5
6
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
0
0
1
0
0
0
1
0
A. Blondin Mass´
e (UQAC)
0
1
1
0
0
0
0
0
1
0
0
1
graphe
1
2
3
4
5
6
2
5
5
2
4
6
4
/
6
/
/
/
/
/
liste d’adjacence
matrice d’adjacence
3 f´
evrier 2014
4 / 74
Graphes non orient´es
1 2 3 4 5
1
2
graphe
3
5
4
1
2
3
4
5
2
1
2
2
4
A. Blondin Mass´
e (UQAC)
5
5
4
5
1
1
2
3
4
5
0
1
0
0
1
1
0
1
1
1
0
1
0
1
0
0
1
1
0
1
1
1
0
1
0
matrice d’adjacence
/
3
4
/
/
3
2
/
/
3 f´
evrier 2014
liste d’adjacence
5 / 74
Notation
I
Un graphe (orient´e ou non) est un couple G = (V, E) ;
I
On d´esigne par
I
G.V l’ensemble des sommets de G ;
I
G.E l’ensemble des arcs (ou arˆ
etes) de G ;
I
n le nombre de sommets ;
I
m le nombre d’arcs/arˆ
etes ;
I
G.Voisins(u) l’ensemble des voisins du sommet u ;
I
G.Pred(u) l’ensemble des pr´
ed´
ecesseurs de u ;
I
G.Succ(u) l’ensemble des successeurs de u.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
6 / 74
Graphes valu´es
I
Dans certains cas, on introduit une fonction de coˆ
ut (ou
de poids)
w : E → R.
I
Selon le contexte, on peut stocker de l’information
I
dans les sommets (lieu, personne, entit´e, etc.)
I
dans les arcs/arˆ
etes (coˆ
ut, distance, relation, etc.).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
7 / 74
Parcours en largeur
h Voir la version diapositive i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
8 / 74
Pseudocode
1: procedure ParcoursLargeur(G : graphe non orient´e, s : sommet)
2:
pour u ∈ G.V − {s} faire
3:
u.couleur ← blanc
4:
u.dist ← ∞
5:
u.pred ← null
6:
fin pour
7:
s.couleur ← gris
8:
s.dist ← 0
9:
s.pred ← null
10:
Q←∅
11:
Q.Enfiler(s)
12:
tant que Q 6= ∅ faire
´filer()
13:
u ← Q.De
14:
pour v ∈ G.Voisins(u) faire
15:
si v.couleur = blanc alors
16:
v.couleur ← gris
17:
v.dist ← u.dist + 1
18:
v.pred ← u
19:
Q.Enfiler(v)
20:
fin si
21:
fin pour
22:
u.couleur ← noir
23:
fin tant que
24: fin procedure
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
9 / 74
Observations
I
Le parcours en largeur a une complexit´e Θ(n + m) ;
I
En effet, chaque sommet est dans la file exactement une
fois (Θ(n)) ;
I
De la mˆeme fa¸con, les arˆetes incidentes `
a un sommet ne
sont parcourues qu’une seule fois (Θ(m)) ;
I
On en conclut que la complexit´e totale est Θ(n + m) ;
I
On peut aussi utiliser le parcours en largeur pour calculer
la distance entre s et n’importe quel sommet v ;
I
Dans le mˆeme ordre d’id´ee, on peut calculer un plus court
chemin entre s et v en utilisant correctement les valeurs
u.pred.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
10 / 74
Distance entre deux sommets
I
La distance entre deux sommets u et v est la longueur
d’un plus court chemin reliant u et v ;
I
On a toujours dist(u, u) = 0 ;
I
Si u et v sont adjacents, alors dist(u, v) = 1 ;
I
Si u et v ne sont pas dans la mˆeme composante connexe,
alors dist(u, v) = ∞ ;
I
Nous allons maintenant montrer que u.dist indique bien la
distance entre s et u.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
11 / 74
Calcul de la distance
Lemme
Soit G = (V, E) un graphe et s ∈ V . Alors pour tout (u, v) ∈ E,
nous avons
dist(s, v) ≤ dist(s, u) + 1.
I
Si u n’est pas atteignable `
a partir de s, alors
dist(s, u) = ∞ et donc le lemme est vrai ;
I
Sinon, alors un plus court chemin entre s et v ne peut ˆetre
plus long que le plus court chemin entre s et u suivi de
l’arc/arˆete (u, v).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
12 / 74
Calcul de la distance (suite)
Lemme
` la fin de l’algorithme, nous avons v.dist ≥ dist(s, v).
A
I
On proc`ede par induction sur le nombre d’appels `a
l’op´eration Enfiler ;
I
L’hypoth`
ese d’induction est que v.dist ≥ dist(s, v) pour
tout sommet v ;
I
Cas de base.
I
Le premier sommet `
a ˆetre enfil´e est s ;
I
On a bien s.dist = 0 = dist(s, s) ≥ dist(s, s) ;
I
De plus, tous les autres sommets v v´erifient
v.dist = ∞ ≥ dist(s, v)
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
13 / 74
Calcul de la distance (suite)
Induction.
I
Le prochain enfilage se d´eroule lorsqu’un sommet blanc
devient gris ;
I
Soit v un sommet blanc d´ecouvert `
a partir d’un sommet
u;
I
Par l’hypoth`ese d’induction, u.dist ≥ dist(s, u) ;
I
Lorsque la distance est mise `
a jour, on obtient
v.dist = u.dist + 1
≥ dist(s, u) + 1
≥ dist(s, v)
A. Blondin Mass´
e (UQAC)
(par l’hypoth`ese d’induction)
(par le lemme pr´ec´edent).
3 f´
evrier 2014
14 / 74
Composition de la file
Lemme
Soit Q = hv1 , v2 , . . . , vr i la file de l’algorithme de parcours en
largeur. Alors en tout temps, pour i = 1, 2, . . . , r − 1, on a
(i) vr .dist ≤ v1 .dist + 1 et
(ii) vi .dist ≤ vi+1 .dist
I
La d´emonstration se fait par induction sur le nombre
d’op´
erations sur la file ;
I
Cas de base. La file ne contient que le sommet s, alors
c’est vrai ;
I
Induction. Il y a deux cas `
a v´erifier, selon qu’on empile
ou d´
epile une valeur.
I
Lorsqu’on d´
epile une valeur v1 , alors la nouvelle tˆ
ete de
la file est v2 ;
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
15 / 74
Composition de la file (suite)
I
Clairement, on a toujours vi .dist ≤ vi+1 .dist pour
i = 2, 3, . . . , r − 1 par hypoth`
ese d’induction (ii) et la
propri´et´e (i) est v´erifi´ee puisque
vr .dist ≤ v1 .dist + 1 ≤ v2 .dist + 1;
I
´
Etudions
ce qui se passe lorsqu’on empile un sommet vr+1 ;
I
Alors la tˆ
ete de file v1 v´erifie v1 .dist ≥ u.dist ;
I
Par cons´equent, la propri´et´e (ii) est v´erifi´ee puisque
vr+1 .dist = v.dist = u.dist + 1 ≤ v1 .dist + 1;
I
On montre la propri´et´e (i) en remarquant que
vr .dist ≤ u.dist + 1 = v.dist = vr+1 .dist.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
16 / 74
Parcours en largeur
Th´eor`eme
Soit G = (V, E) un graphe orient´e ou non et supposons que
l’algorithme de parcours en largeur vu plus tˆot est ex´ecut´e
sur G `a partir d’un sommet source s. Alors
(1) Tout sommet v accessible depuis s est d´
ecouvert ;
`
(2) A la fin, v.dist = dist(s, v) pour tout sommet v ;
(3) Pour tout sommet v, un plus court chemin de s vers v
peut ˆetre construit en prenant un plus court chemin de s
vers v.pred, suivi de l’arc/arˆete (v.pred, v).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
17 / 74
D´emonstration du th´eor`eme
I
On proc`ede par contradiction ;
I
Soit v un sommet le plus proche possible de s tel que
v.dist 6= dist(s, v) ;
I
Clairement, v 6= s ;
I
Par un des lemmes pr´ec´edents, v.dist ≥ dist(s, v) et donc
v.dist > dist(s, v) ;
I
Aussi, v doit ˆetre accessible `
a partir de s, sinon
dist(s, v) = ∞ ≥ v.dist ;
I
Soit u un sommet se trouvant juste avant v dans un plus
court chemin et alors dist(s, v) = dist(s, u) + 1 ;
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
18 / 74
D´emonstration du th´eor`eme (suite)
I
Comme v est un contre-exemple minimal, on doit avoir
u.dist = dist(s, u), de sorte que
v.dist > dist(s, v) = dist(s, u) + 1 = u.dist + 1.
(1)
I
Il nous reste `a v´erifier trois cas selon que v est blanc, gris
ou noir :
I
Si v est blanc, alors l’algorithme effectue l’affectation
v.dist ← u.dist + 1, contredisant l’´equation (1) ;
I
Si v est noir (alors que u est gris), on a v.dist ≤ u.dist,
contredisant encore l’´equation (1) ;
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
19 / 74
D´emonstration du th´eor`eme (suite)
I
Si v est gris, alors un de ses pr´
ed´
ecesseurs w a ´et´e trait´e
avant u ;
I
On a alors v.dist = w.dist + 1 ;
I
Par cons´equent, w.dist ≤ u.dist et donc
v.dist = w.dist + 1 ≤ u.dist + 1.
I
Il s’agit encore d’une contradiction avec (1) ;
I
Le fait qu’on puisse construire un plus court chemin `a
partir de v.pred est ´
evident.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
20 / 74
R´ecup´eration d’un plus court chemin
I
1:
2:
3:
4:
5:
6:
7:
8:
9:
Apr`es avoir effectu´e le parcours en largeur, on r´ecup`ere
facilement un plus court chemin entre s et v :
fonction PlusCourtChemin(s, v : sommets)
si v = s alors
retourner hsi
sinon si v.pred = null alors
retourner null
sinon
retourner PlusCourtChemin(s, v.pred) + hvi
fin si
fin fonction
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
21 / 74
Arbre du parcours en largeur
r
s
t
u
1
0
2
3
2
v
1
w
2
x
3
y
s
r
v
A. Blondin Mass´
e (UQAC)
w
x
t
y
u
3 f´
evrier 2014
22 / 74
Parcours en profondeur
h Voir la version diapositive i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
23 / 74
Pseudocode
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
procedure ParcoursProfondeur(G : graphe)
pour u ∈ G.V faire
u.couleur ← blanc
Initialisation
u.pred ← null
La variable temps est
fin pour
globale
temps ← 0
pour u ∈ G.V faire
On appelle la
si u.couleur = blanc alors
proc´edure Visiter sur
Visiter(G, u)
chacun des sommets
fin si
pas encore visit´e
fin pour
fin procedure
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
24 / 74
Pseudocode (suite)
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure Visiter(G : graphe, u : sommet)
temps ← temps + 1
C’est la premi`ere fois
u.d´ecouvert ← temps
qu’on rencontre le somu.couleur ← gris
met u
pour v ∈ G.Voisins(u) faire
si v.couleur = blanc alors
On visite d’abord
v.pred ← u
r´ecursivement les sucVisiter(G, v)
cesseurs de u qui n’ont
fin si
pas encore ´et´e visit´es
fin pour
u.couleur ← noir
On peut marquer le
temps ← temps + 1
sommet comme finalis´e
u.fini ← temps
fin procedure
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
25 / 74
Th´eor`eme des parenth`eses
Soit G = (V, E) une graphe (orient´e ou non). Alors pour toute
paire de sommets u et v, exactement une des trois conditions
est satisfaite :
1. Les intervalles [u.d´ecouvert, u.fini] et [v.d´ecouvert, v.fini]
sont disjoints et ni u ni v n’est un descendant de l’autre ;
2. L’intervalle [u.d´ecouvert, u.fini] est contenu
compl`
etement dans l’intervalle [v.d´ecouvert, v.fini] et u
est un descendant de v ;
3. L’intervalle [v.d´ecouvert, v.fini] est contenu
compl`
etement dans l’intervalle [u.d´ecouvert, u.fini] et v
est un descendant de u.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
26 / 74
Illustration
y
z
s
t
3/6
2/9
1/10
11/16
4/5
7/8
12/13
14/15
x
w
v
u
y
x
t
v
u
w
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
s
t
C
z
B
s
z
F
B
v
u
C
y
w
C
C
x
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
27 / 74
Th´eor`eme des chemins blancs
Th´eor`eme
Dans un parcours en profondeur d’un graphe G = (V, E), le
sommet v est un descendant du sommet u si et seulement si
au temps u.d´ecouvert, il existe un chemin de u vers v ne
passant que par des sommets blancs.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
28 / 74
Classification des arcs (graphes orient´es)
Dans un graphe orient´
e, on distingue quatre types d’arcs :
I
Arcs d’arbre. Ce sont ceux qui forment la forˆ
et obtenue
par le parcours en profondeur ;
I
Arcs de retour (back edges). Ce sont les arcs qui relient
un sommet avec son ancˆ
etre ;
I
Arcs avant (forward edge). Ce sont les arcs qui ne sont
pas dans l’arbre, mais qui relient un sommet `a un de ses
descendants ;
I
Arcs crois´
es (cross edges). Ce sont tous les autres
arcs.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
29 / 74
Classification des arˆetes (graphes non orient´es)
Dans un graphe non orient´
e, seuls deux des quatre types
d’arˆetes sont pr´esents :
Th´eor`eme
Dans un parcours en largeur d’un graphe non orient´
e, toute
arˆete de G est soit une arˆ
ete d’arbre ou une arˆ
ete de retour.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
30 / 74
Graphe de d´ependances
cale¸cons
chaussettes
pantalon
chaussures
montre
chemise
ceinture
cravate
veston
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
32 / 74
Tri topologique
I
Soit G un graphe orient´
e et acyclique ;
I
Un tri topologique de G est un ordonnancement des
sommets de G ayant la propri´et´e que pour tout arc (u, v),
le sommet u apparaˆıt avant le sommet v ;
I
Il existe ´evidemment plusieurs tris possibles ´etant
donn´e un graphe de d´
ependances ;
I
On d´erive un algorithme directement `
a partir du parcours
en profondeur : il suffit d’ins´erer le sommet en tˆ
ete de
liste chaque fois qu’il a fini d’ˆetre trait´e.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
33 / 74
Exemple
cale¸cons
chaussettes
pantalon
chaussures
montre
chemise
ceinture
cravate
veston
I
Un ordre possible est cale¸
cons, pantalon, chaussettes,
montre, chaussures, chemise, cravate, ceinture,
veston.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
34 / 74
D´etecter si un graphe est acyclique
Une fa¸con efficace de d´eterminer si un graphe est acyclique est
d’utiliser un parcours en profondeur :
Th´eor`eme
Un graphe orient´
e G est acyclique si et seulement si un
parcours en profondeur de G ne rencontre aucun arc de
retour (back edge).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
35 / 74
Composantes fortement connexes
I
On d´efinit la relation → sur les sommets par u → v si et
seulement s’il existe un chemin de u vers v ;
I
On dit que deux sommets sont ´
equivalents, not´e u ∼ v, si
u → v et v → u ;
I
La relation ∼ est une relation d’´
equivalence ;
I
Les classes d’´
equivalence de la relation ∼ sont appel´ees
composantes fortement connexes.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
37 / 74
Calcul des composantes fortement connexes
a
b
c
d
13/14
11/16
1/10
8/9
12/15
3/4
2/7
5/6
e
f
g
h
a
b
c
d
e
f
g
h
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
38 / 74
Algorithme de Kosaraju
1: fonction ComposantesFortementConnexes(G : graphe orient´e)
2:
ParcoursProfondeur(G)
3:
Calculer le graphe GT
4:
ParcoursProfondeur(GT ) en ´
enum´
erant les sommets u en ordre
d´
ecroissant de valeur u.fini
Ci ← la i-`
eme composante connexe de l’arbre du parcours en profondeur
calcul´
e pr´
ec´
edemment
6:
retourner {Ci | i = 1, 2, . . . , k}, o`
u k est le nombre de composantes
fortement connexes
7: fin fonction
5:
I
L’algorithme de Kosaraju est tr`
es simple ;
I
De plus, il a une complexit´e Θ(n + m) et est donc optimal ;
I
Il utilise deux parcours en profondeur ;
I
Tarjan a propos´e un algorithme qui ne fait qu’une seule
passe.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
39 / 74
Algorithme de Tarjan
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
fonction Tarjan(G : graphe orient´e)
i←0
P ← PileVide()
C←∅
pour v ∈ G.V faire
si v.rang n’est pas d´efini alors
Visiter(G, v)
fin si
fin pour
fin fonction
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
Initialisation des trois
variables globales
On appelle la
proc´edure Visiter sur
chacun des sommets
pas encore visit´e
40 / 74
Algorithme de Tarjan (suite)
1: fonction Visiter(G : graphe orient´e, v : sommet)
2:
v.rang ← i
3:
v.ancˆ
etre ← i
4:
i←i+1
5:
P.Empiler(v)
6:
pour w ∈ G.Voisins(v) faire
7:
si w.rang n’est pas d´
efini alors
8:
Visiter(w)
9:
v.ancˆ
etre ← min(v.ancˆ
etre, w.ancˆ
etre)
10:
sinon si w ∈ P alors
11:
v.ancˆ
etre ← min(v.ancˆ
etre, w.rang)
12:
fin si
13:
fin pour
14:
si v.ancˆ
etre = v.rang alors
15:
C←∅
16:
r´
ep´
eter
´piler()
17:
w ← P.De
18:
C ← C ∪ {w}
19:
jusqu’`
a ce que w = v
20:
C ← C ∪ {C}
21:
fin si
22: fin fonction
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
On initialise le rang et le plus
petit ancˆ
etre du sommet v
comme ´
etant lui-mˆ
eme
On calcule le plus petit
ancˆ
etre de tous les successeurs de v puis on met `
a jour
si c’est plus petit que v
Si tous les successeurs de v
ont comme plus petit ancˆ
etre
le sommet v lui-mˆ
eme, c’est
que toute la composante a ´
et´
e
visit´
ee et se trouve dans la
pile
41 / 74
Calcul des composantes fortement connexes
h Voir la version diapositive i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
42 / 74
Probl`eme des plus courts chemins
I
Consid´erons un graphe orient´
e G = (V, E) ;
I
On ´ecrit u → v s’il existe un chemin de u vers v ;
I
On ´ecrit u →
− v si p est un chemin de u vers v ;
I
On ajoute une fonction de poids w : E → R ;
I
Le poids d’un chemin p = hv0 , v1 , . . . , vk i est donn´e par
p
w(p) =
k
X
w(vi−1 , vi ),
i = 1, 2, . . . , k.
i=1
I
La distance entre deux sommets u et v est alors d´efinie par
(
p
min{w(p) | u →
− v}, si u → v ;
dist(u, v) =
∞
sinon.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
44 / 74
Diff´erents probl`emes
I
Plusieurs probl`emes diff´erents concernent des plus courts
chemins ;
I
Nous avons d´ej`a vu la version avec w(p) = |p|, c’est-`a-dire
o`
u chaque arˆete a un poids de 1 ;
I
Source unique : On cherche la distance entre un
sommet u et tous les autres sommets ;
I
Source et cibles uniques : On cherche la distance entre
un sommet u et un sommet v ;
I
Toutes les paires : On cherche la distance entre toute
paire de sommets u et v.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
45 / 74
Sous-chemins d’un plus court chemin
Lemme
Soit G = (V, E) un graphe orient´
e et w : E → R une fonction
de poids. De plus, soit p = hv1 , v2 , . . . , vk i un plus court chemin
entre v0 et vk et pij = hvi , vi+1 , . . . , vj i le sous-chemin de p entre
vi et vj . Alors pij est un plus court chemin entre vi et vj .
I
La d´emonstration se fait facilement par l’absurde ;
I
En effet, supposons qu’il existe un chemin p0ij plus court
que pij ;
I
Alors on peut construire un chemin p0 plus court que p,
contredisant la minimalit´e de p.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
46 / 74
Poids n´egatifs
a
−4
b
4
3
6
s
5
c
d
8
g
−3
2
7
3
e
f
−6
I
Dans certaines situations, w(e) < 0 pour certains arcs e ;
I
Il y a un probl`eme si on trouve un cycle c atteignable
depuis le sommet de d´epart tel que w(c) < 0 ;
I
En effet, dans ce cas, on peut trouver un chemin de poids
aussi petit qu’on veut ;
I
Si c’est le cas, par convention, on ´ecrit dist(s, v) = −∞.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
47 / 74
Relaxation d’un arc
I
Les algorithmes que nous allons voir utilisent une
op´
eration ´
el´
ementaire, appel´ee relaxation :
1: procedure Relaxer(u, v, w : sommets)
2:
si v.dist > u.dist + w(u, v) alors
3:
v.dist ← u.dist + w(u, v)
4:
v.pred = u
5:
fin si
6: fin procedure
u
5
2
v
u
9
5
v
2
Relaxer(u, v, w)
u
5
A. Blondin Mass´
e (UQAC)
2
6
Relaxer(u, v, w)
v
u
7
5
3 f´
evrier 2014
v
2
6
48 / 74
Propri´et´es
I
In´
egalit´
e du triangle. Pour tout arc (u, v), on a
dist(s, v) ≤ dist(s, u) + w(u, v).
I
Borne sup´
erieure. On a toujours v.dist ≥ dist(s, v) pour
tout sommet et lorsque l’´
egalit´
e est atteinte, on ne
change plus la valeur ;
I
Aucun chemin. S’il n’existe aucun chemin entre s et v,
alors on a toujours v.dist(s, v) = ∞ ;
I
Convergence. S’il existe un plus court chemin terminant
par (u, v) et que u.dist = dist(s, u), alors on peut relaxer
(u, v) et alors v.dist = dist(s, v) ;
I
Relaxation d’un chemin. Si p = hv0 , v1 , . . . , vk i est un
plus court chemin entre v0 et vk et que nous relaxons les
arcs de p dans l’ordre, alors vk .dist = dist(v0 , vk ).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
49 / 74
L’algorithme de Bellman-Ford
h Voir la version diapositive i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
50 / 74
Pseudocode
1: procedure Bellman-Ford(G : graphe, w : poids, s : sommet)
2:
Initialiser tous les sommets a
`∞
3:
pour i = 1, 2, . . . , |G.V | − 1 faire
4:
pour (u, v) ∈ G.E faire
5:
Relaxer(u, v, w)
6:
fin pour
7:
fin pour
8:
pour (u, v) ∈ G.E faire
9:
si v.dist > u.dist + w(u, v) alors
10:
Afficher que le graphe poss`ede un cycle n´egatif
11:
fin si
12:
fin pour
13: fin procedure
I
La complexit´e totale est Θ(nm).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
51 / 74
L’algorithme de Bellman-Ford est correct
Th´eor`eme
Soit G = (V, E) un graphe orient´e, s ∈ V et w : E → R une
fonction de poids.
1. Si G contient un cycle de poids n´
egatif, alors
l’algorithme le d´etecte ;
2. Si G ne contient pas un tel cycle, alors v.dist = dist(s, v)
pour tout v ∈ V et v.pred permet de construire un chemin
de poids minimal entre s et v pour tout v ∈ V .
I
Puisque l’algorithme relaxe chaque arc |V | − 1 fois, chaque
arc d’un plus court chemin est relax´
e dans l’ordre ;
I
Comme tout sous-chemin d’un plus court chemin est
lui-mˆeme un plus court chemin, alors v.pred permet de
reconstruire un chemin de poids minimal.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
52 / 74
Plus courts chemins dans un DAG
h Voir la version diapositive i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
53 / 74
Pseudocode
1: procedure PlusCourtsCheminsDAG(G : dag, w : poids, s sommet)
2:
Ordonner les sommets de G a
` l’aide d’un tri topologique
3:
Initialiser les sommets a
` ∞ sauf s a
`0
4:
pour u ∈ V en ordre topologique faire
5:
pour v ∈ G.Voisins(u) faire
6:
Relaxer(u, v, w)
7:
fin pour
8:
fin pour
9: fin procedure
I
La complexit´e totale est Θ(n + m) ;
I
On se convainc facilement que l’algorithme est correct
puisque l’ordre dans lequel les arcs sont relax´
es est le
mˆeme ordre que celui d’un plus court chemin.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
54 / 74
L’algorithme de Dijkstra
h Voir la version diapositive i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
55 / 74
Pseudocode
1: procedure Dijkstra(G : graphe orient´e, w : poids positifs, s : sommet)
2:
Initialiser les distances `
a ∞ sauf celle de s `
a0
3:
Soit Q une file `
a priorit´
e initialis´
ee avec G.V bas´
ee sur l’attribut dist
4:
S←∅
5:
tant que Q 6= ∅ faire
6:
u ← ExtraireMinimum(Q)
7:
S ← S ∪ {u}
8:
pour v ∈ G.Voisins(u) faire
9:
Relaxer(u, v, w)
10:
Mettre `
a jour la cl´
e de v dans Q
11:
fin pour
12:
fin tant que
13: fin procedure
I
Pour initialiser Q, la complexit´e est O(n) ;
I
On doit extraire le minimum n fois, donc O(n log n) ;
I
On met la cl´e `a jour en temps O(m log n) ;
I
La complexit´e totale est O(n + (m + n) log n) = O(m log n).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
56 / 74
Analyse de l’algorithme
I
L’algorithme de Dijkstra est correct si w(e) est positif
pour tout arc e ;
I
Pour le d´emontrer, il faut utiliser l’invariant suivant :
Au d´ebut de chaque it´eration de la boucle tant
que, nous avons v.dist = dist(s, v) pour tout
sommet v ∈ S.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
57 / 74
Retour sur les matrices d’adjacence
I
Supposons que les sommets sont num´
erot´
es 1, 2, . . . , n ;
I
On peut repr´esenter les poids des arcs par une matrice W
dont les entr´ees sont


si i = j ;
0,
wij = w(i, j), si i 6= j et (i, j) ∈ E ;


∞,
si i 6= j et (i, j) ∈
/ E.
I
Certains poids peuvent ˆetre n´egatifs, mais on suppose qu’il
n’y a aucun cycle de poids n´egatif ;
I
Comme dans la section pr´ec´edente, on souhaite calculer
non seulement le poids minimal d’un chemin, mais
´egalement le chemin en question.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
59 / 74
Exemple
1 2 3 4 5
poids minimaux
1
2
3
4
5
2
3
4
8
1
0
3
7
2
8
1
0
4
-1
5
-3
-4
0
-5
1
2
1
5
0
6
-4
-1
3
-2
0
3
2
−4
7
5
1
6
1 2 3 4 5
−5
4
pr´ed´ecesseurs
A. Blondin Mass´
e (UQAC)
1
2
3
4
5
3 f´
evrier 2014
4
4
4
4
3
3
3
3
4
4
4
4
5
2
2
5
1
1
1
1
60 / 74
Programmation dynamique
I
Afin de calculer des plus courts chemins entre toutes
les paires de sommets, on se base sur une strat´egie de
programmation dynamique ;
I
Il faut suivre les ´etapes suivantes :
I
Caract´eriser la structure d’un plus court chemin ;
I
Exprimer de fa¸con r´
ecursive la solution au probl`eme ;
I
Calculer les plus courts chemins en commen¸cant
par les plus petits sous-probl`
emes (bottom-up).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
61 / 74
Expression r´ecursive
(m)
I
Soit `ij le poids minimum d’un chemin de i vers j de
longueur au plus m ;
I
Pour m = 0, on a
(0)
`ij
I
Si m ≥ 1, alors
(m)
`ij
= min
=
I
(
0, si i = j ;
=
∞, si i 6= j.
(m−1)
`ij
,
(m−1)
min {`ik
1≤k≤n
(m−1)
min {`
1≤k≤n ik
+ wkj }
+ wkj }.
Il s’agit donc de calculer une suite de matrices L(1) , L(2) ,
. . ., L(n−1) pour obtenir le poids minimum.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
62 / 74
Exemple
h Voir la version diapositive i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
63 / 74
Algorithme
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
I
fonction ProchaineMatrice(L, W : matrices)
Soit n l’ordre des matrices L et W
Soit L0 une nouvelle matrix n × n
pour i = 1, 2, . . . , n faire
pour j = 1, 2, . . . , n faire
L0 [i, j] ← ∞
pour k = 1, 2, . . . , n faire
L0 [i, j] ← min(L0 [i, j], L[i, k] + W [k, j])
fin pour
fin pour
fin pour
fin fonction
On a trois boucles imbriqu´ees, donc le calcul se fait en
Θ(n3 ).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
64 / 74
Algorithme (suite)
1: fonction MatriceDistances(W : matrice des poids)
2:
Soit n l’ordre de la matrice W
3:
L(1) ← W
4:
pour m = 2, 3, . . . , n − 1 faire
5:
L(m) ← ProchaineMatrice(L(m−1) , W )
6:
fin pour
7:
retourner L(n−1)
8: fin fonction
I
La complexit´e totale est Θ(n4 ) ;
I
On peut l’am´eliorer en r´eduisant le nombre d’appels `a
ProchaineMatrice.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
65 / 74
Algorithme (suite)
´liore
´(W : matrice des poids)
1: fonction MatriceDistancesAme
2:
Soit n l’ordre de la matrice W
3:
L(1) ← W
4:
m←1
5:
tant que m < n − 1 faire
6:
L(2m) ← ProchaineMatrice(L(m) , L(m) )
7:
m ← 2m
8:
fin tant que
9:
retourner L(m)
10: fin fonction
I
On obtient alors une complexit´e de Θ(n3 log n).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
66 / 74
L’algorithme de Floyd-Warshall
I
En utilisant une autre strat´egie de programmation
dynamique, il est possible de r´eduire la complexit´e `a
Θ(n3 ) ;
I
L’id´ee consiste `a d´
ecomposer un chemin de i vers j en un
chemin de i vers k et un autre de k vers j, tel que tous les
autres sommets sont dans {1, 2, . . . , k − 1}.
k
{1, 2, . . . , k − 1}
j
{1, 2, . . . , k − 1}
i
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
67 / 74
Structure d’un plus court chemin
Pour construire un plus court chemin de i vers j passant par
les sommets {1, 2, . . . , k}, on a deux possibilit´es :
I
Si k n’est pas un sommet interm´
ediaire, alors tous les
sommets interm´
ediaires sont dans {1, 2, . . . , k − 1} ;
I
Par cons´equent, un plus court chemin de i vers j passant
par {1, 2, . . . , k − 1} est aussi un plus court chemin passant
par {1, 2, . . . , k} ;
I
Si k est un sommet interm´
ediaire, alors on utilise la
p1
p2
d´ecomposition i −→ k −→ j et alors
I
p1 est un plus court chemin de i vers k passant par
{1, 2, . . . , k − 1} et
I
p2 est un plus court chemin de k vers j passant par
{1, 2, . . . , k − 1}.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
68 / 74
Expression r´ecursive
(k)
I
Soit dij le poids d’un plus court chemin de i vers j
passant par {1, 2, . . . , k} ;
I
On a alors dij = W [i, j] ;
I
De fa¸con plus g´
en´
erale, on obtient
(
W [i, j],
si k = 0 ;
(k)
dij =
(k−1) (k−1)
(k−1)
min(dij , dik
+ dkj ), si k ≥ 1.
I
Il suffit donc de calculer la matrice D(n) pour obtenir les
distances finales.
(0)
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
69 / 74
Pseudocode
1: fonction FloydWarshall(W : matrice des poids)
2:
Soit n l’ordre de la matrice W
3:
D(0) ← W
4:
pour k = 1, 2, . . . , n faire
5:
Soit D(k) une matrice n × n
6:
pour i = 1, 2, . . . , n faire
7:
pour j = 1, 2, . . . , n faire
8:
D(k) [i, j] ← min(D(k−1) [i, j], D(k−1) [i, k] + D(k−1) [k, j])
9:
fin pour
10:
fin pour
11:
fin pour
12:
retourner D(n)
13: fin fonction
I
On obtient alors une complexit´e de Θ(n3 ).
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
70 / 74
Calcul du pr´ed´ecesseur
I
L’algorithme de Floyd-Warshall peut facilement ˆetre
modifi´
e pour retenir le pr´
ed´
ecesseur permettant de
construire un chemin de poids minimum ;
I
Plus pr´ecis´ement, on peut maintenir une matrice P (k) qui
est mise `a jour de la fa¸con suivante ;
I
Si k = 0, alors
P
I
(0)
(
null , si i = j ou W [i, j] = ∞ ;
[i, j] =
i,
si i 6= j et W [i, j] < ∞.
La mise `
a jour se fait selon la r`egle suivante :
P
(k)
(
P (k−1) [i, j],
[i, j] =
P (k−1) [k, j],
A. Blondin Mass´
e (UQAC)
si D(k−1) [i, j] ≤ D(k−1) [i, k] + D(k−1) [k, j]
si D(k−1) [i, j] > D(k−1) [i, k] + D(k−1) [k, j].
3 f´
evrier 2014
71 / 74
Clˆoture transitive
I
L’algorithme de Floyd-Warshall peut facilement ˆetre
adapt´e pour calculer la clˆ
oture transitive d’un graphe
orient´e ;
I
´
Etant
donn´e un graphe G = (V, E), o`
u V = {1, 2, . . . , n}, la
clˆ
oture transitive de G est un graphe G∗ = (V, E ∗ ), o`
u
E ∗ = {(i, j) | il existe un chemin de i vers j dans G}.
I
Il suffit d’initialiser une matrice de poids avec W [i, j] = 1
s’il y a un arc de i vers j, sinon, W [i, j] = 0 ;
I
Dans l’algorithme de Floyd-Warshall, on remplace la
fonction min par ∨ et la somme + par ∧.
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
72 / 74
Pseudocode
ˆ tureTransitive(G : graphe orient´
1: fonction Clo
e)
2:
n ← |G.V |
3:
Soit T (0) une matrice n × n
4:
pour i = 1, 2, . . . , n faire
5:
pour j = 1, 2, . . . , n faire
6:
si i = j ou (i, j) ∈ G.E alors
7:
T (0) [i, j] ← 1
8:
sinon
9:
T (0) [i, j] ← 0
10:
fin si
11:
fin pour
12:
fin pour
13:
pour k = 1, 2, . . . , n faire
14:
Soit T (k) une matrice n × n
15:
pour i = 1, 2, . . . , n faire
16:
pour j = 1, 2, . . . , n faire
17:
T (k) [i, j] ← T (k−1) [i, j] ∨ (T (k−1) [i, k] ∧ T (k−1) [k, j])
18:
fin pour
19:
fin pour
20:
fin pour
21:
retourner T (n)
22: fin fonction
A. Blondin Mass´
e (UQAC)
3 f´
evrier 2014
73 / 74
Exemple
L(1) =
1
2
3
4
1
1
0
0
0
2
0
1
1
1
3
0
1
1
4
1
0
1
A. Blondin Mass´
e (UQAC)
1
2
4
3
1
2
3
4
1
1
0
0
0
2
1
1
1
1
0
3
1
1
1
1
1
4
1
1
1
1
L(4) =
3 f´
evrier 2014
74 / 74