suivant: Le cas général, algorithme
monter: Les algorithmes de plus
précédent: Graphe acyclique
Lorsque le réseau contient des circuits, il n'est plus possible d'utiliser
l'algorithme précédent qui s'appuie sur un tri topologique. Toutefois, il
est toujours possible de tirer profit de la non négativité des coûts
sur les arcs.
Pour ce faire on partitionne l'ensemble des sommets en deux ensembles
et
. Les sommets de
sont dits fixés et ceux de
temporaires. On utilise une fonction de marquage
que nous appellerons distance et qui à la fin de l'algorithme sera
égale à la distance minimale depuis
vers chaque sommet.
A chaque étape, la définition de
est la suivante :
est la longueur d'un plus court chemin de
vers
dont tous les
sommets intermédiaires sont dans
. Initialement,
et
,
.
L'algorithme repose sur le postulat
suivant :
Les distances aux sommets fixés (c'est-à-dire les sommets de
) sont
minimales.
A chaque itération, le sommet temporaire de plus petite distance est
transféré directement dans
et l'on met à jour les distances de tous
ses successeurs.
La complexité temporelle de l'algorithme de Dijkstra sous cette forme simple
est
. En effet, à chaque étape, on transfère un n
ud de
vers
, ce qui nous fait
itérations. A l'intérieur de chaque
itération, on recherche le sommet de
qui possède la plus
petite distance temporaire, opération en
dans le pire des cas.
Toutefois, des structures de données performantes (telles que
les Tas de Fibonnacci) permettent de rabaisser significativement cette
complexité (
).
Démonstration de l'algorithme :
Elle se fait par récurrence sur la taille de
avec les hypothèses suivantes :
est minimale pour tout sommet
est la longueur du plus court chemin ne passant que par des
sommets de
pour arriver en
.
Vérifions la validité de l'hypothèse pour
.
par définition de l'origine des plus courts chemins. Or, cette
distance est nécessairement minimale du fait de la non négativité des coûts
sur les arcs.
- Dans
les seuls sommets pour lesquels
sont les sommets
tels que
et pour lesquels
et comme
est le seul sommet appartenant à
, l'hypothèse
est nécessairement vérifiée.
Vérifions l'hypothèse à une étape quelconque :
Soit
le sommet de
dont la distance temporaire
est minimale. Comme il va être transféré dans
, il nous faut
montrer que
est optimale. Par hypothèse,
est la
longueur d'un plus court chemin de
vers
dont tous les sommets
intermédiaires appartiennent à
. Nous allons montrer que tout
chemin qui utilise au moins un sommet de
est au moins
aussi long.
Soit
un chemin de
vers
passant par des sommets de
. On peut le décomposer en 2 sous chemins
et
où
ne passe que par des sommets de
et aboutit en
;
joignant
à
tel qu'illustré par la
figure (3.2).
Figure 3.2:
Mise en place de la démonstration de l'algorithme de Diksktra
 |
Par hypothèse,
car
est la longueur du
plus court chemin ne passant que par des sommets de
et aboutissant en
alors que
est un chemin quelconque ne passant que par des sommets de
et aboutissant également en
.
Or :
car
est minimale sur
(il s'agit de la base même de l'algorithme de Dijkstra).
Et, comme :

et
du fait de la non négativité des coûts portés par les arcs, l'on obtient :
Finalement :
est donc minimale pour tous les chemins passant par
et
. Elle est donc minimale globalement. Ouf !
Il nous faut maintenant vérifier que l'opération de mise à jour des distances
et du tableau des prédécesseurs (c'est-à-dire, en fait, des chemins eux
mêmes) est correcte.
Les seuls sommets à être mis à jour sont
et les sommets
de
tels que
et
. Or ces sommets
auront pour prédécesseur
qui fait partie de
. Donc leur distance temporaire est maintenant égale à
ce qui constitue bien un plus court chemin empruntant uniquement
des sommets de
.
suivant: Le cas général, algorithme
monter: Les algorithmes de plus
précédent: Graphe acyclique
Bruno Garcia
2000-12-17