Académique Documents
Professionnel Documents
Culture Documents
Dijkstra
Plus court chemin
Algorithme de Dijkstra
F. Guinand, S. Balev
Master I - Le Havre
Plan
1 E. W. Dijkstra
3 Algorithme de Dijkstra
E. W. Dijkstra
E.W. Dijkstra
mathématicien et informaticien
début en physique théorique
contributions majeures en informatique
Types de problèmes
le problème de la détermination d’un plus court chemin
entre deux sommets,
le problème de la détermination des plus courts chemin
d’un sommet vers l’ensemble des autres sommets du
graphe,
le calcul du plus court chemin pour l’ensemble des couples
de sommets du graphe.
Contraintes
si les longueurs sont toutes positives ou nulles
si les longueurs sont toutes égales à l’unité
si le graphe et les longueurs sont quelconques
si le graphe est sans circuit
si le graphe est connexe ou fortement connexe (graphe
orienté)
algorithme de Dijkstra
algorithme de Bellman-Ford
algorithme de Floyd-Warshall
Problème
Principe
On maintient
T - ensemble de sommets traités
d(v ), v ∈ V - longueur du plus court chemin de s à v qui ne
passe que par des sommets de T
À chaque itération
on choisit le sommet non-traité le plus proche de T
on l’ajoute à T
on met à jour les d de ses voisins
T ←∅
Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(s) ← 0
TantQue (T 6= V )
v ← argmin{d(u) : u 6∈ T }
T ← T ∪ {v }
Pour u ∈ voisins(v ) Faire
d(u) ← min{d(u), d(v ) + wvu }
finPour
finTantQue
Exemple
a 4 b 7 c
5 1 4 1
1 2
d e g
f
2 5 1
1
h 2 4
i j
Question
On a les longueurs des chemins, mais comment obtenir les
chemins eux-mêmes ?
T ←∅
Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(s) ← 0
pred(s) ← null
TantQue (T 6= V )
v ← argmin{d(u) : u 6∈ T }
T ← T ∪ {v }
Pour u ∈ voisins(v ) Faire
Si (d(u) > d(v ) + wvu ) Alors
d(u) ← d(v ) + wvu
pred(u) ← v
finSi
finPour
finTantQue
Terminaison et correction
Complexité
File prioritaire
Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(s) ← 0
F.initialiser()
F.ajouter(s, 0)
TantQue (non F.estVide())
v ← F.extraireMin()
Pour u ∈ voisins(v ) Faire
Si (d(u) > d(v ) + wvu ) Alors
d(u) ← d(v ) + wvu
F.ajouter(u, d(u))
finSi
finPour
finTantQue
Liste non-trié
F.estVide() : O(1)
F.extraireMin() : O(n)
F.ajouter(e, p) : O(1)
Liste trié
F.estVide() : O(1)
F.extraireMin() : O(1)
F.ajouter(e, p) : O(n)
Dans les deux cas, la complexité de l’algorithme de Dijkstra
reste O(n2 )
Complexité – récapitulation
Exercice
Limitations
L’algorithme de Dijkstra ne s’applique que pour des graphes
dont le poids des arêtes/arcs est positif ou nul.
−2
1 2
b c d
−5
4 5 2
e f
Procedure maj((u, v ) ∈ E)
d(v ) = min{d(v ), d(u) + wuv }
FinProcedure
s − u1 − u2 − · · · − uk − v
Algorithme de Bellman-Ford
Pour v ∈ V Faire
d(v ) ← ∞
finPour
d(s) ← 0
Répéter n − 1 fois
Pour e ∈ E faire
maj(e)
finPour
finRépéter
Exercices
Principe :
d(i, j, k ) - la longueur du plus court chemin entre i et j en
utilisant des sommets intermédiaires seulement parmi
{1, . . . , k }
Au début d(i, j, 0) = wij si (i, j) ∈ E et ∞ sinon
On ajoute un sommet k à chaque itération en mettant à
jour tous les d(i, j, k )
Algorithme de Floyd-Warshall
Pour i de 1 à n Faire
Pour j de 1 à n Faire
d(i, j) = wij ou ∞
finPour
finPour
Pour k de 1 à n Faire
Pour i de 1 à n Faire
Pour j de 1 à n Faire
d(i, j) = min{d(i, j), d(i, k ) + d(k , j)}
finPour
finPour
finPour
Exercices