Algorithmique et Programmation
Projet : plus courts chemins à origine unique par l’algorithme de Dijkstra
Ecole normale supérieure
Département d’informatique
td-algo@di.ens.fr
2014-2015
Pour ce projet, nous cherchons à trouver le chemin le plus court entre deux sommets d’un graphe
oriénté et pondéré dont lse poids représentent les longueurs d’arc.
L’algorithme de Dijkstra nous permet de calculer le plus chemin entre une source set tous les autres
sommets du graphe. Cet algorithme emploie à la base une file de priorité comme structure de donnée.
Cette structure permet d’inserer des éléments pondérés, de retrouver l’élément de poids minimum et
d’éffacer ce élément de poids minimum de la file.
La file de priorité peut être implémentée de différentes façons. Pour cet exercise vous utiliserez des
Tas de Fibonacci.
1 Algorithme de Dijkstra
L’algorithme de Dijkstra recherche la distance à partir de la source sde manière gloutonne. Il trouve
les sommets du graphe orienté G= (S, A, w)donné en entré (ainsi que le chemin le plus court vers ces
sommets) en order croissant de leur distance de s. Notons pas ds(t)la distance (du plus court chemin)
de sàt.
Au départ, seulement la distance de svers sest connue (cette distance ds(s)est 0).
À chaque étape, l’algorithme choisi un arc (u, v)d’un sommet udont la distance est connue à un
sommet vdont la distance (de s) est inconnue. Cet arc est choisi à minimiser la distance totale de sà
vsi (u, v)est le dernier arc utilisé. C’est-à-dire l’arc (u, v)minimisant ds(u) + w(u, v)est choisi et ce
chemin utilisant le plus court chemin de sàuet l’arc (u, v)est déclaré comme (un) plus court de sàv.
Par conséquent, on inscrit ds(u) + w(u, v)pour ds(v).
Et on continue choissisant un nouvel arc pour la prochaine étape et ainsi de suite.
Quelques astuces sont utile pour trouver rapidement l’arc (u, v)minimisant ds(u) + w(u, v)à chaque
étape. Nous maintenons une liste d’arrêtes non-vus provenant d’un sommet dont la distance est connue.
Si une arrête (minimisante) entre deux sommets à distances connue est choisie, nous marquons cette
arrête comme vue et passont simplement à l’étape suivante (nous pouvons prouver qu’elle nous servira
pas dans un chemin le plus court). Finalement, plutôt que de maintenir une liste d’arcs, nous utilisons
une file de priorité d’arcs non-vus pour pouvoir rapidement trouve l’élément minimisant la distance
totale.
2 File de priorité
Une file de priorité est simplement un ensemble d’objets pondérés (dans notre cas les objets seront des
arcs du graphe dont le poids est la distance totale de ssi on utilise cet arc comme dernier arc du chemin)
qui permet les opérations suivantes:
•insérer(objet,poid) qui ajoute un objet avec poid.
•extraire-min() qui enlève l’objet de poids minimum de l’ensemble et retourne cet objet avec son
poid.
3 Pseudo-code
3.1 Algorithme de Dijkstra
Voir [1, §25.2]
1