Cours sur les graphes et les algorithmes

Memoriser les chemins

En plus de calculer la longueur d’un plus court chemin depuis s, on peut aussi stocker un plus court chemin. En effet, a` chaque fois qu’on relˆache un arc (u, v), cela signifie que le chemin de s a` v passe dor´enavant par u, autrement dit le pr´ed´ecesseur de v est maintenant le sommet u. On peut par exemple stocker ces pr´ed´ecesseurs dans un tableaux index´ par les sommets du graphe. Voir l’algorithme 2 ci-contre pour une impl´ementation (les lignes correspondantes sont en bleu).

Detecter si un graphe quelconque a un circuit negatif

On peut montrer que l’algorithme de Bellman-Ford (Algorithme 1) s’arrˆete apr`es au plus n −1 executions de la boucle Tant que, dans le cas d’un graphe sans circuit de poids n´egatif (ici n est le nombres de sommets du graphe). La preuve se fait par r´ecurrence sur le nombre d’it´erations et l’hypoth`ese de r´ecurrence est la suivante. Au bout de x it´erations de la boucle Tant Que, pour tout sommet v, L[v] est la longueur du plus court chemin de s a` v parmi ceux qui ont au plus x arcs.
Si un graphe connexe a un circuit n´egatif, alors il n’y a pas de plus court chemin depuis s vers certains sommets (en particuliers ceux qui sont sur ce circuit n´egatif). Donc, l’algorithme 1 sur un tel graphe executerait ind´efini-ment dans la boucle Tant Que. En particulier, cette derni`ere s’executerait au moins n fois. On peut donc executer la boucle Tant Que n fois sur un graphe quelconque, et si a` la derni`ere it´eration, la valeur de L change, alors on sait qu’il y a un circuit négatif.
Voir l’algorithme 2 ci-contre pour une impl´ementation (les lignes corres-pondantes sont en vert).

Variantes

Le cas dual : distance vers un sommet Au lieu de calculer des plus courts chemins depuis s vers tous les sommets, on peut calculer la distance des plus courts chemins depuis n’importe quel sommet a` un sommet t (voir algorithme 3).
Algorithme 3 : Variante de Bellman-Ford (le cas dual)
Donn´ees−→
G un graphe orient´ valu´e sans circuit de longueur strictement n´egative −→
t un sommet de G
Variables locales
L tableau des distances vers un sommet a` t
Succ tableau des successeurs sur un plus court chemin a` t (u, v) un arc
d´ebut
initialisation
L[t] := 0
pour tous les sommet v 6= t faire L[v] := +∞ tant que L change faire
→−
pour chaque arc (u, v) de G faire
−→
si L(u)>L(v)+length((u, v, G )) alors →−
L(u) :=L(v)+length((u, v, G))
Succ[u] :=v
finsi
finprch
fintq
fin
Sorties : L, succ
Plus long chemin vers un sommet Au lieu de calculer des plus courts chemins depuis s vers tous les sommets, on peut calculer la distance des plus longs chemins. Bien evidemment, l’algorithme a maintenant des limitations diff´erentes : il n’a de sens que dans un graphe sans circuit strictement positif (voir algorithme 4).
Algorithme 4 : Autre variante de Bellman-Ford (plus long chemin)
Donn´ees
−→
G un graphe orient´ valu´e sans circuit de longueur strictement positive →−
s un sommet de G
Variables locales
L tableau des distances depuis un sommet s
P red tableau des successeurs sur un plus court chemin a` t (u, v) un arc
d´ebut
initialisation
L[s] := 0
pour tous les sommet v 6= s faire L[v] := −∞ tant que L change faire
−→
pour chaque arc (u, v) de G faire
→−
si L(v)<L(u)+length((u, v, G )) alors −→
L(v) :=L(u)+length((u, v, G))
Pred[v] :=u
finsi
finprch
fintq
fin
Sorties : L, Pred

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *