1
Algorithmes de Dijkstra et de Bellman-Ford
Les chemins les moins coûteux à origine unique
De toutes les opérations que nous effectuons sur un graphe pondéré (ou valué), une retient l’attention : trouver le
chemin le moins coûteux entre deux nœuds d'un graphe. Par exemple, si un graphe modélise un réseau routier : les
sommets sont des villes et les arcs sont des routes liant deux villes. Le poids accordé à chaque arc est le kilométrage
effectué en empruntant cette route. Quel sera l’algorithme pour trouver le chemin le plus optimal en kilométrage
pour se rendre d’une ville à une autre?
Précédemment, nous avons fait l’étude d’un algorithme qui donne le chemin le plus court en terme du nombre d’arc
ou d’un autre point de vue en terme du nombre de sommets rencontrés. Cet algorithme était le parcourt en largeur
(ou par contagion). Or, notre point d’intérêt ici est plutôt le chemin le moins coûteux en fonction du poids de chaque
arc sur le chemin.
Une approche simpliste
Une idée pour trouver ce type de chemin est de parcourir exhaustivement tous les chemins du graphe qui débutent à
notre sommet d’origine. Or, un graphe dense (beaucoup d’arcs) de n sommets nous donne près de S! chemins
possibles. Donc pour un graphe de 20 sommets (ce qui est peu…) le nombre de chemin débutant à un certain
sommet avoisine les 20!, autrement dit près de 2 432 902 008 176 640 000 chemins. Supposons que de trouver 1
chemin est une opération et que nous effectuons cette recherche sur une machine qui effectue 109 opérations par
seconde, cela représente près de 77 années! Pour un graphe de 26 sommets, un ordinateur lancé en même temps que
le « Big Bang » n’aurait pas terminé encore aujourd’hui.
Compte tenu de la grande consommation en temps de cette stratégie, nous devons donc tenter de résoudre le
problème dans des temps plus raisonnables. Regardons deux de ces algorithmes.
Algorithme de Dijkstra dans le cas où les poids sont positifs
Il existe un premier algorithme, dit vorace, qui permet de résoudre rapidement le problème du plus court chemin.
Soit un graphe G(V, E) pondéré avec des poids non négatifs, pour obtenir les chemins les moins coûteux à partir
d’un sommet, l’algorithme de Dijkstra répondra à cette requête. Les variables utilisées par l’algorithme présenté plus
loin sont :
• V : l’ensemble des sommets du graphe;
• E : l’ensemble des arcs (ou arêtes) du graphe;
• T : un ensemble temporaire de sommets d’un graphe (pour ne pas modifier V);
• S : l’ensemble des sommets traités par l’algorithme (pour ne pas traiter 2 fois le même sommet);
• y : un tableau de coût de longueur |V| (le nombre de sommet du graphe);
• a : l’indice du nœud de départ;
• c(u,v) : permet d’obtenir le coût d’un arc du sommet u au sommet v appartenant à E.
L’algorithme de Dijkstra est le suivant :
POUR ∀ sommets i de V FAIRE
début yi ß +∞
fin
ya ß 0
S ß ∅
T ß V