Vous êtes sur la page 1sur 3

Chapitre 3 : Problèmes du plus court chemin

Graphe pondéré (valué): Un graphe pondéré est un graphe oū on associe à chaque arc un
nombre réel appelé poids/longueur de l'arc. On notera l(x,y) la longueur de l'arc (x,y).
Étant donné un chemin d'un sommet x à un sommet y, on appelle longueur du chemin, la somme
des longueurs des arcs qui le constituent.

Le problème du plus court chemin


On peut s'intéresser à la recherche d'un plus court chemin dans un graphe :
1 - d'un sommet à tous les autres
2 - entre tous les couples de sommets

Remarques
1 - Si le sommet de départ n’est pas racine du graphe, il existe des sommets qui ne seront pas
accessibles, le problème du plus court chemin ne se pose alors que pour les sommets descendants
de s. Dans le graphe 1 ci-dessous, le sommet "c" n'est pas descendant du sommet s.
2 - Le graphe 2 présente une particularité qui va interdire de trouver une solution au problème du
plus court chemin de s aux autres sommets du graphe. Il existe dans ce graphe un circuit de
longueur négative : le circuit (a, b, c, a) a pour longueur -1. On peut construire le chemin s, a, b,
c, a, b, c, a, b... dont la longueur n'est pas bornée inférieurement.
On peut donc faire diminuer autant que l’on veut la longueur des chemins de s à a en empruntant
une infinité de fois le circuit. Un tel circuit est appelé "circuit absorbant".

Algorithme de Dijkstra
proposé par E.W.Dijkstra en 1959 un algorithme qui permet de calculer le plus court chemin entre
un sommet particulier et tous les autres dans un graphe avec des poids d'arcs non négatives. Le
résultat un arbre avec un sommet particulier appelé racine.

L'algorithme de Dijkstra maintient un label d(i) de distance pour chaque nœud i. à chaque étape
intermédiaire, l'algorithme divise les nœuds en deux groupes: ceux qui sont étiquettes de façon
permanente (nœuds permanents) et ceux étiquètes de façon temporaire (nœuds temporaires). Le
label de distance d'un nœud permanent représente la distance de la source vers ce nœud. Alors
que le label de distance d'un nœud temporaire est une borne supérieure de la distance du plus
court chemin vers ce nœud.

Procedure Dijkstra()

La complexité de cet algorithme est O(n2). On peut cependant améliorer cette complexité en
modifiant la structure de données utilisée par l'algorithme.

Exemple

7 B 3
A D
2
2
3 5
4 3

Algorithme de Bellman-Ford
est un algorithme qui permet de trouver les plus courts chemins, depuis un sommet source vers
tous les autres sommets, dans un graphe orienté pondéré (valué). Contrairement à l'algorithme de
Dijkstra, cet algorithme permet la présence d'arcs de poids négatif et peut détecter l'existence un
circuit absorbant depuis le sommet source. La complexité de l'algorithme est, dans le pire des
cas, en O(nm).
Procédure Bellman-Ford()
Begin
for each (xy)ÎA do
d(s)=0
p(s)=s if (d(y)> d(x)+cij) then
for each v ÎV\{s} do d(v)=+∞ enddo écrire (Il existe un circuit absorbant)
for i=1 to |V|-1 do endif
for each (xy)ÎA do End
if (d(y)> d(x)+cij) then
d(y)=d(x)+cij
p(y)=x
endif
enddo
enddo
Algorithme de Floyd-Warshall

L’algorithme considère une suite de matrices n x n : d0, d1, …, dn, définies pour tous les couples
de sommets (x, y) par :
d0 (x, y) = d(x, y) si (x,y) Î A, ∞ sinon, et d0 (x, x) = 0
dk(x, y) = longueur d’un plus court chemin reliant x à y dans G dont les sommets intermédiaires
sont dans {1, 2, …, k} ou ∞ si un tel chemin n’existe pas.
Remarquons que dk (x, x) sera la longueur minimale d’un circuit passant par x et n’utilisant que
des sommets de {1, 2, …, k} ‫{ ׫‬x}, si un tel circuit existe.

Propriété: dk (x, y) = min { dk-1(x, y), dk-1(x, k) + dk-1(k, y) }

Partant de d = d0, qui correspond à la matrice du graphe, on calcule successivement d1, d2,... dn qui
est la matrice des distances cherchées. À chaque étape, on teste si dk(x, x) < 0, alors on peut
détecter l’existence d’un circuit absorbant et arrêter l’algorithme.

Procédure Floyd-Warshall()

La complexité de cet algorithme est O(n3).

Vous aimerez peut-être aussi