Vous êtes sur la page 1sur 84

Algorithmes de plus

court chemin

Heike Ripphausen-Lipa - Beuth University of Applied Science - Berlin


J.M. Adam - Université de Grenoble Alpes - Grenoble
Objectif
 Se familiariser avec les différentes
sortes de problèmes de plus court
chemin
 Savoir quel algorithme peut être
appliqué efficacement pour quel type
de problème de plus courts chemins

Heike Ripphausen-Lipa & Jean-Michel Adam 2


Sommaire
 Introduction
 Algorithme de Dijkstra
 Algorithme de Bellman-Ford
 Algorithme de Floyd-Warshall

Heike Ripphausen-Lipa & Jean-Michel Adam 3


Problème: trouver le chemin le plus court

A
0

Trouver le plus court chemin de A à B


Introduction
On considère un graphe orienté pondéré :
 Graph G = (V,E) avec

 Fonction poids w: E -> R


(les poids des arcs sont des nombres réels)

Heike Ripphausen-Lipa & Jean-Michel Adam 5


Définition: Poids d‘un chemin

Le poids w d‘un chemin p avec


p = (v0, v1, … , vk) et (vi, vi+1) є E

Est défini ainsi :

w(p) = ∑i=1..k w(vi-1, vi)

Heike Ripphausen-Lipa & Jean-Michel Adam 6


Definition: poids du chemin le
plus court
Le poids du chemin le plus court δ(u,v) entre deux
sommets u et v est défini ainsi :

min { w(p) : p est un chemin de u à v dans G },


si un chemin existe
δ(u,v) =
∞ , sinon

Heike Ripphausen-Lipa & Jean-Michel Adam 7


Idée de base pour trouver le chemin le
plus court
De nombreux algorithmes de calcul de plus court
chemin utilisent la propriéte suivante :

Les sous-chemins des chemins les plus courts sont


eux-mêmes les chemins les plus courts !

Plus précisément:
si p = (v0, v1, … , vk) est un chemin le plus
court entre les sommets v0 et vk

alors pour i et j (0 ≤ i ≤ j ≤ k) le chemin


pij = (vi, vi+1, …, vj) est le chemin le plus
court du sommet vi au sommet vj.

Heike Ripphausen-Lipa & Jean-Michel Adam 8


Idée de base pour trouver le chemin le
plus court

 Nous nous concentrons sur le problème des chemins


les plus courts d’une source unique, c’est-à-dire
que l’on calcule les chemins les plus courts du
sommet de départ s vers tous les sommets v du
graphe.

 Beaucoup d‘algorithme de calcul de plus court chemin


utilisent la technique de relaxation :
A chaque sommet v on associe un attribut dist qui donne une
borne supérieure de la distance du plus court chemin d‘un
sommet s (la source) au sommet v.

Heike Ripphausen-Lipa & Jean-Michel Adam 9


Relaxation
La méthode relaxation d‘un arc(u,v) consiste à voir
si le chemin le plus court calculé jusqu'à v peut être
amélioré en prenant le chemin le plus court actuel de
s vers u, en lui ajoutant l’arc (u,v):

Heike Ripphausen-Lipa & Jean-Michel Adam 10


initialisation-Source-Unique

// Initialisation d'un algorithme de relaxation


// pour la recherche des plus courts chemins
// depuis une source unique : le sommet s
initialisation-Source-Unique(G, s)
pourtout sommet v de G
dist[v] ← VMAX // valeur réelle max
pred[v] ← NIL
fpour
dist[s] ← 0

Heike Ripphausen-Lipa & Jean-Michel Adam 11


Relax(u,v,w)
Relax(u, v, w)
// arc (u,v), w(u,v) est le poids de l‘arc
si dist[v] > dist[u] + w(u,v)
alors
dist[v] ← dist[u] + w(u,v)
pred[v] ← u
fsi

Heike Ripphausen-Lipa & Jean-Michel Adam 12


Algorithme de Dijkstra
(publication 1959)
Algorithme de Dijkstra
 L’ Algorithme de Dijkstra résout le problème
des chemins les plus courts depuis une
source unique, le sommet s.

 L’ Algorithme de Dijkstra ne fonctionne que


pour des poids positifs.

 Il fonctionne de manière similaire au


parcours en largeur, mais au lieu d‘utiliser
une file, il utilise une file prioritaire.

Heike Ripphausen-Lipa & Jean-Michel Adam 14


Algorithme de Dijkstra
 L'algorithme de Dijkstra gère un ensemble (virtuel)
S qui contient tous les sommets pour lesquels les
distances les plus courtes depuis s sont déjà
calculées.
 Etape par étape, le sommet u de S dont la valeur
dist est minimale, est sélectioné et tous les arcs
(u,v)incidents à u sont relaxés
 Pour gérer l‘ensemble S, des sommets dont la
distance minimale depuis s n‘a pas encore été
déterminée, on utilise la file prioritaire Q.

Heike Ripphausen-Lipa & Jean-Michel Adam 15


Algorithme de Dijkstra
Dijkstra(G, w, s)
initialisation-Source-Unique(G, s)
S ← Ø; // tous les sommets atteints depuis s
Q ← tous les sommets // tous les sommets dans Q
tantque Q ≠ Ø
u ← Extraire-Min(Q) // sommet dont dist minimale
S ← S.ajouter(u)
pour tout sommet v adjacent à u
Relax(u,v,w);
Remarque: l’ensemble de sommets S n’est
fpour pas vraiment utile; il est introduit pour
ftq mieux illustrer l’algorithme.

Heike Ripphausen-Lipa & Jean-Michel Adam 16


Algorithme de Dijkstra

a c
3
2 1

3 2 i Valeur de dist : i
s 0 e
Vide : VMAX
1
5
1
b d File prioritaire Q

s a b c d e

Remarque : Q est ordonnée selon les valeurs croisantes de dist

17
Heike Ripphausen-Lipa & Jean-Michel Adam
Algorithme de Dijkstra
a c
3
2
2 1

s 0 3 2 e

1
5
1
1
b d File prioritaire Q

b a c d e

Les sommets de S sont colorés en noir


18
Heike Ripphausen-Lipa & Jean-Michel Adam
Algorithme de Dijkstra
a c
3
2
2 1

s 0 3 2 e

1
5
1 2
1
b d File prioritaire Q

a d c e

19
Heike Ripphausen-Lipa & Jean-Michel Adam
Algorithme de Dijkstra
a c
2 3
2 5
2 1

s 0 3 2 e

1
5
1 2
1
b d File prioritaire Q

d c e

20
Heike Ripphausen-Lipa & Jean-Michel Adam
Algorithme de Dijkstra
a c Relax
2 3
2 4
2 1

s 0 3 2 7 e

1
5
1 2
1
b d File prioritaire Q

c e

21
Heike Ripphausen-Lipa & Jean-Michel Adam
Algorithme de Dijkstra
a c
2 3
2 4
2 1

s 0 3 2 5 e

1
5
1 2
1
b d File prioritaire Q

22
Heike Ripphausen-Lipa & Jean-Michel Adam
Algorithme de Dijkstra
a c
2 3
2 4
2 1

s 0 3 2 5 e

1
5
1 2
1
b d File prioritaire Q

23
Heike Ripphausen-Lipa & Jean-Michel Adam
Algorithme de Dijkstra dans une table
Initialisation
sommet s a b c d e

pred NIL NIL NIL NIL NIL NIL

dist 0 ∞ ∞ ∞ ∞ ∞

Après avoir supprimé s de Q


sommet s a b c d e

pred NIL s s NIL NIL NIL

dist 0 2 1 ∞ ∞ ∞

Heike Ripphausen-Lipa & Jean-Michel Adam 24


Algorithme de Dijkstra dans une table
Après avoir supprimé b de Q
sommet s a b c d e

pred NIL s s NIL b NIL

dist 0 2 1 ∞ 2 ∞

Après avoir supprimé a de Q


sommet s a b c d e

pred NIL s s a b NIL

dist 0 2 1 5 2 ∞

Heike Ripphausen-Lipa & Jean-Michel Adam 25


Algorithme de Dijkstra dans une table
Après avoir supprimé d de Q
sommet s a b c d e

pred NIL s s d b d

dist 0 2 1 4 2 7

Après avoir supprimé c de Q


sommet s a b c d e

pred NIL s s d b c

dist 0 2 1 4 2 5

Heike Ripphausen-Lipa & Jean-Michel Adam 26


Algorithme de Dijkstra dans une table

Après avoir supprimé e de Q


sommet s a b c d e

pred NIL s s d b c

dist 0 2 1 4 2 5

Détermination du plus court chemin de s à e :


e ← c←d←b← s

Heike Ripphausen-Lipa & Jean-Michel Adam 27


Exercice: Algorithme de Dijkstra
Avec l’algorithme de Dijkstra déterminez tous les Chemins les
plus courts partant du sommet s

a b
3
1 8

s 3 1 6 c

7
3
1
d e

28
Heike Ripphausen-Lipa & Jean-Michel Adam
Temps d’exécution de
l’algorithme de Dijkstra
Temps d‘exécution total
Initialize-Source-Unique(G, s) O(n)
Extraire-Min
dans la
S ← Ø; O(1)
queue
Q ← V(G); O(n)
pripritaire Q

tantque (Q ≠ Ø) O(n)
u ← Extraire-Min(Q) O(n * log n)
S ← S.ajouter(u) O(n)
pour tout sommet v adjacent à u
Relax(u,v,w) O(m)
fpour
ftq
O(n* log n + m) = O(n2)

Heike Ripphausen-Lipa & Jean-Michel Adam 29


Exercice: poids négatif

Donnez un exemple montrant que


l‘algorithme de Dijkstra ne fonctionne
pas avec un arc portant un poids
négatif.

Heike Ripphausen-Lipa & Jean-Michel Adam 30


Exercice: poids négatif

a c
3
6

s -3
La valeur dist de c reste 9
bien que la valeur dist de a
7 soit diminuée de 6 à 4

Heike Ripphausen-Lipa & Jean-Michel Adam 31


Problème avec l’algorithme
de Dijkstra
L’algorithme de Dijkstra n’est pas très
“orienté cible” : dans le cas où un
chemin particulier de la source vers la
destination doit être trouvé, l’algorithme
n’est pas très performant.

Heike Ripphausen-Lipa & Jean-Michel Adam 32


Algorithme de Dijkstra

A Trouver le
0
chemin le plus
court de A à B

Heike Ripphausen-Lipa & Jean-Michel Adam


Algorithme de Dijkstra

18
5

A
0

Heike Ripphausen-Lipa & Jean-Michel Adam


Algorithme de Dijkstra

18 10
5

A 17
0

Heike Ripphausen-Lipa & Jean-Michel Adam


Algorithme de Dijkstra

B
28
15
18 10
5

A 17
0

Heike Ripphausen-Lipa & Jean-Michel Adam


Algorithme de Dijkstra

B
28 21

15
18 10 28
5
Choisir ce sommet
A 17 semble ne pas
0
avoir de sens, parce
que la distance de
B augmente
En comparaison à ce sommet
Algorithme A* (1968)
L’algorithme A* est un algorithme pour trouver un
chemin entre deux sommets, et qui tente de corriger
le problème présenté précédemment sur l’algorithme
de Dijkstra.

Pour cela, l’algorithme A* utilise une fonction


heuristique ht qui estime, pour chaque sommet u, sa
distance vers la destination t.
L’algorithme ne fonctionne que si
ht(u) ≤ la distance réelle entre u et t.

Pour l’exemple précédent, ht(u) peut être la distance à


vol d’oiseau entre u et t.

Heike Ripphausen-Lipa & Jean-Michel Adam 38


Algorithme A*
L’ algorithme A* est similaire à
l’algorithme de Dijkstra avec la
difference suivante :
La file prioritaire est triée selon f avec :

f(u) = dist[u] + ht(u)

Heike Ripphausen-Lipa & Jean-Michel Adam 39


Algorithme de Bellman-Ford
(publications en 1956 et 1958)

40
Algorithme de Bellman-Ford
 L‘algorithme de Bellman-Ford résoud le problème
de recherche de plus court chemin depuis une
source unique, mais en autorisant des arcs portant
des poids négatifs.
 Il permet de détecter l‘existence d‘un circuit
absorbant, c‘est-à-dire de poids total strictement
négatif, accessible depuis le sommet source.
 Cependant, si le graphe contient un circuit
absorbant, il n‘existe pas de solution.
 L‘algorithme de Bellman-Ford utilise également la
méthode de relaxation

Heike Ripphausen-Lipa & Jean-Michel Adam 41


Rappel : problème des poids
négatifs dans l’algorithme de
Dijkstra

a c
3
6

s -3 La valeur dist de c reste 9 bien que la


valeur dist de a soit diminuée de 6 à 4.
7
Cependant, si on retraite a pour relaxer
ses voisins, on peut trouver la solution
b correcte.

Heike Ripphausen-Lipa & Jean-Michel Adam 42


Idée de l‘Algorithme de Bellman-Ford

Idée fondamentale de l’algorithme de


Bellman-Ford :

répéter
relaxer tous les arcs
Jusqu’à ce qu’il n’y ait plus de
changement de la valeur dist

Heike Ripphausen-Lipa & Jean-Michel Adam 43


Algorithme de Bellman-Ford
 Dans la première phase, les chemins
les plus courts sont déterminés, si une
solution existe
 Dans la seconde phase, l'algorithme
détermine s'il existe des circuits
absorbants.
 Si c’est le cas, l'algorithme renvoie la
valeur faux, sinon la valeur vrai

Heike Ripphausen-Lipa & Jean-Michel Adam 44


Algorithme de Bellman-Ford
Bellman-Ford(G, w, s)
Initialize-Single-Source(G, s);
// Determiner les plus courts chemins
pour (i=1; i < nbsommets; i++)
pourtout arc (u,v) de G
Relax(u,v,w)
fpour
fpour

// Déterminer s‘il y a des circuits absorbants


non_absorbant ← vrai
pour tout arc (u,v) de G
si (dist[v] > dist[u] + w(u,v))
alors non_absorbant ← faux
fsi
fpour
renvoyer non_absorbant

Heike Ripphausen-Lipa & Jean-Michel Adam 45


Algorithme de Bellman-Ford
Trouver les plus courts Chemins partant de z

-2
u v
5
6 i dist = i
-3 dist = VMAX
z 0 8 7
-4
7
2
9
x y

On fait l'hypothèse que l'itération intérieure parcourt les arcs dans


l'ordre lexicographique : (u, v), (u,x), (u,y), (v,u), …

Heike Ripphausen-Lipa & Jean-Michel Adam 46


Algorithme de Bellman-Ford

 Première exécution de l‘itération


intérieure :

 Seuls les arcs incidents à z améliorent


leurs valeurs dist.

Heike Ripphausen-Lipa & Jean-Michel Adam 47


Algorithme de Bellman-Ford

-2
u v
5
6
6
-3
z 0 8 7
-4
7
2
7
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 48


Algorithme de Bellman-Ford

 Seconde exécution de l‘itération


intérieure

Heike Ripphausen-Lipa & Jean-Michel Adam 49


Algorithme de Bellman-Ford
-2
u v
5
6 11
6 Relaxation avec l'arc (u,v) :
-3 dist[v] décroit de VMAX à 11
z 0 8 7
-4 Relaxation avec l'arc (u,y) :
7
2 dist[y] décroit de VMAX à 2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 50


Algorithme de Bellman-Ford
-2
u v
5
6 11
6
-3
z 0 8 7 Les arcs incidents à v
-4 n'améliorent pas les
7 valeurs dist
2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 51


Algorithme de Bellman-Ford
-2
u v
5
6 4
6 Relaxation avec l'arc (x,v) :
-3
z 0 8 7 dist[v] décroit de 11 à 4
-4
7
2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 52


Algorithme de Bellman-Ford
-2
u v
5
6 4
6
-3 Les arcs incidents à y
z 0 8 7 n'améliorent pas les
-4 valeurs dist
7
2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 53


Algorithme de Bellman-Ford
-2
u v
5
6 4
6
-3 Les arcs incidents à z
z 0 8 7 n'améliorent pas les
-4 valeurs dist
7
2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 54


Algorithme de Bellman-Ford

 Troisième exécution de l‘itération


intérieure

Heike Ripphausen-Lipa & Jean-Michel Adam 55


Algorithme de Bellman-Ford
-2
u v
5
6 4
6
-3
z 0 8 7 Les arcs incidents à u
-4 n'améliorent pas les
7 valeurs dist
2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 56


Algorithme de Bellman-Ford
-2
u v
5
2 4
6 Relaxation avec l'arc (v,u) :
-3
z 0 8 7 dist[u] décroit de 6 à 2
-4
7
2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 57


Algorithme de Bellman-Ford
-2
u v
5
2 4
6
-3
z 0 8 7 Les arcs incidents à x,
-4 y et z n'améliorent
7 pas les valeurs dist
2
7 2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 58


Algorithme de Bellman-Ford
 Quatrième exécution de l'itération
intérieure

Heike Ripphausen-Lipa & Jean-Michel Adam 59


Algorithme de Bellman-Ford
-2
u v
5
2 4
6
-3
z 0 8 7 Relaxation avec l'arc (u,y) :
-4
7 dist[y] décroit de 2 à -2
2
7 -2
9
x y

Heike Ripphausen-Lipa & Jean-Michel Adam 60


Algorithme de Bellman-Ford
 Toutes les exécutions supplémentaires
de l‘itération intrieure n‘améliorent plus
la solution actuelle

Heike Ripphausen-Lipa & Jean-Michel Adam 61


Algorithme de Bellman-Ford
dans une table
Initialisation

sommet u v x y z

pred NIL NIL NIL NIL NIL

dist ∞ ∞ ∞ ∞ 0

Après la première execution de l’iteration intérieure


sommet u v x y z

pred z NIL z NIL NIL

dist 6 ∞ 7 ∞ 0
Heike Ripphausen-Lipa & Jean-Michel Adam 62
Algorithme de Bellman-Ford
dans une table
Après la seconde execution de l’iteration intérieure
sommet u v x y z

pred z x z u NIL

dist 6 4 7 2 0

Après la troisième execution de l’iteration intérieure


sommet u v x y z

pred v x z u NIL

dist 2 4 7 2 0
Heike Ripphausen-Lipa & Jean-Michel Adam 63
Algorithme de Bellman-Ford
dans une table
Après la quatrième execution de l’iteration intérieure

sommet u v x y z

pred v x z u NIL

dist 2 4 7 -2 0

Heike Ripphausen-Lipa & Jean-Michel Adam 64


Exercice: appliquer l’algorithme
de Bellman-Ford

a c
3
6

s -3

Heike Ripphausen-Lipa & Jean-Michel Adam 65


Exercice: appliquer
l’algorithme de Bellman-Ford
Initialisation

sommet a b c s
a c
3
pred 6

dist s -3
7
Après la première execution de l’iteration intérieure
b
sommet a b c s

pred

dist

Heike Ripphausen-Lipa & Jean-Michel Adam 66


Exercice: appliquer
l’algorithme de Bellman-Ford
Après la seconde execution de l’iteration intérieure
sommet a b c s
a c
3
pred 6
dist s -3
7
Après la troisième execution de l’iteration intérieure
sommet a b c s b

pred

dist

Heike Ripphausen-Lipa & Jean-Michel Adam 67


Temps d‘exécution de l‘algorithme
de Bellman-Ford
Bellman-Ford(G, w, s)
Initialize-Single-Source(G, s); O(n)
// Determiner les plus courts chemins
pour (i=1; i < nbsommets; i++)
pourtout arc (u,v) de G
Relax(u,v,w) O(m) O(n * m)
fpour
fpour

// Déterminer s‘il y a des circuits absorbants


non_absorbant ← vrai
pour tout arc (u,v) de G
si (dist[v] > dist[u] + w(u,v)) O(m)
alors non_absorbant ← faux
fsi
fpour
renvoyer non_absorbant

Temps d‘exécution total de l‘algorithme de Bellman-Ford : O(n * m)


68
Algorithme de Floyd-Warshall
(1959)

69
Chemins les plus courts entre
toutes les paires de sommets
 Si l‘on veut trouver pour toutes les paires
de sommets les chemins les plus courts,
l‘algorithme décrit pécédemment peut être
appliqué en considérant successivement
chaque sommet comme sommet de départ
 L‘algorithme de Floyd-Warshall est
cependant plus efficace pour le
problème de plus courts chemins
entre tous les sommets

Heike Ripphausen-Lipa & Jean-Michel Adam 70


Algorithme de Floyd-Warshall
Données :
Un graphe orienté G =(V, E) avec l‘ensemble des
sommets V = {1, … , n} et les poids w(e) pour tous
les arcs e є E
G est représenté par une matrice d‘adjacence contenant les
poids de chaque arc ou VMAX.
Résultat:
 Une matrice n x n DIST = (distij), telle que pour
i ≠ j distij est la longueur du plus court chemin de i à
j et distii est la longueur du circuit le plus court
contenant i.
 Une matrice n x n P = (pij), telle que pij est le
sommet relié à i sur le plus court chemin(i,j)
respectivement le plus court circuit(i,i)

Heike Ripphausen-Lipa & Jean-Michel Adam 71


Algorithme de Floyd-Warshall
Floyd-Warshall-Algorithm(G, w)
// Initialization
Initialisation de DIST avec VMAX, P avec NIL

// Determination des chemins sans sommet intermédiaire


pour (i = 1; i <= n; i++)
pour (j = 1; j <= n; j++)
si ((i,j)є E)
alors distij ← wij // wij = w(i,j)
pij ← i
fsi
fpour
fpour

Heike Ripphausen-Lipa & Jean-Michel Adam 72


Algorithme de Floyd-Warshall
// suite de l'algorithme de Floyd-Warshall (G, w)
// on tente de raccourcir les chemns par le sommet
// intermédiaire k

pour (k = 1; k <= n; k++)


pour (i = 1; i <= n; i++)
pour (j = 1; j <= n; j++)
si (distij > distik + distkj)
alors distij ← distik + distkj
pij ← pkj
fsi
fpour
fpour
fpour

Heike Ripphausen-Lipa & Jean-Michel Adam 73


Algorithme de Floyd-Warshall
 Si pendant l‘exécution de l‘algorithme
on a i avec distii < 0 l‘algorithme
peut s‘arrêter car il y a un circuit
absorbant, et donc il n‘y a pas de
solution.

Heike Ripphausen-Lipa & Jean-Michel Adam 74


Algorithme de Floyd-Warshall
Remarque:
 La formule de calcul de l'Algorithme
de Floyd-Warshall correspond à la
formule de calcul de la multiplication
de matrices

Heike Ripphausen-Lipa & Jean-Michel Adam 75


Algorithme de Floyd-Warshall
-1 2
DIST0
2 3
-1 1
4
2 -1 0
3
1
-1

1 2 0 1 -1 2
DIST1
2 3
2
1
1 -1 -2 0
3 5
1

Heike Ripphausen-Lipa & Jean-Michel Adam 76


Algorithme de Floyd-Warshall
-1 2
DIST1
2 3
-1 1
4
2 -1 -2 0
3
1
-1
0
1 2 1 -1 1 2
DIST2
2 3
2
1
1 -1 -2 0 1
3 5
1

Heike Ripphausen-Lipa & Jean-Michel Adam 77


Algorithme de Floyd-Warshall
-1 1 2
DIST2
2 3
-1 1
4
2 -1 -2 0 1
3
1
-1
0
1 2 1 -1 1 2 2
DIST3
2 3 3
2
1
1 -1 -2 0 1 1
3 5
1

Heike Ripphausen-Lipa & Jean-Michel Adam 78


Algorithme de Floyd-Warshall
-1 1 2 2
DIST3
2 3 3
-1 1
4
2 -1 -2 0 1 1
3
1
-1
0
1 2 1 1 -1 1 2 2
DIST4
2 1 2 3 3
2
1
1 -1 -2 0 1 1
3 5
0 -1 1 1 2

Heike Ripphausen-Lipa & Jean-Michel Adam 79


Algorithme de Floyd-Warshall
1 -1 1 2 2
DIST4
2 1 2 3 3
-1 1
4
2 -1 -2 0 1 1
3
0 -1 1 1 2
-1
0
1 2 1 1 -1 1 2 2
DIST5
2 1 2 3 3
2
1 0 2 2 1
1 -1 -2 0 1 1
3 5
0 -1 1 1 2

Heike Ripphausen-Lipa & Jean-Michel Adam 80


Exercise: Appliquer l’algorithme
de Floyd-Warshall
DIST0 1 2 3 4 PRED0 1 2 3 4
1 1
1 1
3 2 2
6
3 3
7
2 1 4 4

DIST1 1 2 3 4 PRED1 1 2 3 4
2 4
3 1 1
2 2
3 3
4 4

Heike Ripphausen-Lipa & Jean-Michel Adam 81


Exercise: Appliquer l’algorithme
de Floyd-Warshall
DIST1 1 2 3 4 PRED1 1 2 3 4
1 1
1 1
3 2 2
6
3 3
7
2 1 4 4

DIST2 1 2 3 4 PRED2 1 2 3 4
2 4 1 1
3
2 2
3 3
4 4

Heike Ripphausen-Lipa & Jean-Michel Adam 82


Temps d‘exécution de l‘algorithme de
Floyd-Warshall
Le temps d'exécution est dominé par la seconde partie
// suite de l'algorithme de Floyd-Warshall (G, w)
// on tente de raccourcir les chemns par le sommet
// intermédiaire k

pour (k = 1; k <= n; k++)


pour (i = 1; i <= n; i++)
pour (j = 1; j <= n; j++)
si (distij > distik + distkj) O(n3)
alors distij ← distik + distkj O(n) O(n2)
pij ← pkj
fsi
fpour
fpour
fpour

Heike Ripphausen-Lipa & Jean-Michel Adam 83


84

Vous aimerez peut-être aussi