Вы находитесь на странице: 1из 7

IUT Info 2 GI Anne 2007-08 e Priode 1 et 2 e

Cours sur les graphes : les algorithmes

F. Madelaine C. Simon

Lalgorithme de Bellman-Ford et ses variantes


Algorithme 1 : Bellman-Ford Donnes e G un graphe orient valu sans circuit de longueur strictement ngative e e e s un sommet de G Variables locales L tableau des distances depuis s /* index par les sommets */ e (u, v) un arc dbut e initialisation L[s] := 0 pour tous les sommet v = s faire L[v] := + tant que L change faire /* relaxation de larc (u, v) */ 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 )) nsi nprch ntq n Sorties : L, le tableau des distances des plus court chemins de s

Dans le cas classique, il sagit de calculer les distances des plus courts chemins depuis une source s ` chaque autre sommet v dun graphe orient valu a e e G . Les distances sont non pas en termes de nombres darcs dun chemin mais, en termes de somme des valeurs de chaque arc qui le compose. En eet, on travaille sur un graphe orient valu, cest-`-dire quon dispose dune fonction e e a sur les arcs de G ` valeur dans R. En termes plus informatique, on a ` notre a a disposition la fonction suivante :

length(u, v, G ) : renvoie la valeur de larc (u, v) dans le graphe orient e valu G (si larc existe). e

Ici, nous dtaillons lalgorithme dans le cas o` lentre a un plus court chee u e min. Autrement dit, si le graphe na pas de circuit de longueur strictement ngative. e 1

Les Algorithmes

Cours sur les graphes

Mmoriser les chemins. e


En plus de calculer la longueur dun plus court chemin depuis s, on peut aussi stocker un plus court chemin. En eet, ` chaque fois quon relche un arc a a (u, v), cela signie que le chemin de s ` v passe dornavant par u, autrement dit a e le prdcesseur de v est maintenant le sommet u. On peut par exemple stocker e e ces prdcesseurs dans un tableaux index par les sommets du graphe. Voir e e e lalgorithme 2 ci-contre pour une implmentation (les lignes correspondantes e sont en bleu).

Dtecter si un graphe quelconque a un circuit ngatif. e e


On peut montrer que lalgorithme de Bellman-Ford (Algorithme 1) sarrte e apr`s au plus n 1 executions de la boucle Tant que, dans le cas dun graphe e sans circuit de poids ngatif (ici n est le nombres de sommets du graphe). e La preuve se fait par rcurrence sur le nombre ditrations et lhypoth`se de e e e rcurrence est la suivante. Au bout de x itrations de la boucle Tant Que, e e pour tout sommet v, L[v] est la longueur du plus court chemin de s ` v parmi a ceux qui ont au plus x arcs. Si un graphe connexe a un circuit ngatif, alors il ny a pas de plus court e chemin depuis s vers certains sommets (en particuliers ceux qui sont sur ce circuit ngatif). Donc, lalgorithme 1 sur un tel graphe executerait indnie e ment dans la boucle Tant Que. En particulier, cette derni`re sexecuterait au e moins n fois. On peut donc executer la boucle Tant Que n fois sur un graphe quelconque, et si ` la derni`re itration, la valeur de L change, alors on sait a e e quil y a un circuit ngatif. e Voir lalgorithme 2 ci-contre pour une implmentation (les lignes correse pondantes sont en vert). 2

Algorithme 2 : Bellman-Ford (amlior) e e Donnes e G un graphe orient valu connexe e e s un sommet de G Variables locales L tableau des distances depuis s P red tableau des prdcesseurs sur un plus court chemin depuis s e e Circuit? Boolen vrai ssi il y a un circuit ngatif e e (u, v) un arc dbut e initialisation L[s] := 0 pour tous les sommet v = s faire L[v] := + Circuit? := faux. pour x = 0 ` n 1 faire a 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 nsi nprch npour pour chaque arc (u, v) de G faire si L(v)>L(u)+length((u, v, G )) alors Circuit? := vrai nsi nprch n Sorties : L, P red, Circuit?.

Les Algorithmes

Cours sur les graphes

Variantes

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 Le cas dual : distance vers un sommet Au lieu de calculer des plus longs chemins. Bien evidemment, lalgorithme a maintenant des limitations courts chemins depuis s vers tous les sommets, on peut calculer la distance direntes : il na de sens que dans un graphe sans circuit strictement positif e des plus courts chemins depuis nimporte quel sommet ` un sommet t (voir a (voir algorithme 4). algorithme 3). Algorithme 3 : Variante de Bellman-Ford (le cas dual) Donnes e G un graphe orient valu sans circuit de longueur strictement ngative e e e t un sommet de G Variables locales L tableau des distances vers un sommet ` t a Succ tableau des successeurs sur un plus court chemin ` t a (u, v) un arc dbut e initialisation L[t] := 0 pour tous les sommet v = 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 nsi nprch ntq n Sorties : L, succ Algorithme 4 : Autre variante de Bellman-Ford (plus long chemin) Donnes e G un graphe orient valu sans circuit de longueur strictement positive e e 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 ` t a (u, v) un arc dbut e initialisation L[s] := 0 pour tous les sommet v = 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 nsi nprch ntq n Sorties : L, Pred

Les Algorithmes

Cours sur les graphes

Parcours

Dans un graphe non-orient G ` partir dun sommet s, on dcouvre les e a e popFront(P ) : enl`ve le premier sommet de la pile P (si celle-ci nest pas e sommets de la composante connexe de s dans G (cest-`-dire lensemble des a vide). sommets accessibles par un chemin depuis s dans G). Lors du calcul, on utilise un ensemble Z pour stocker les sommets dj` visits, et une variable F pour ea e stocker les sommets de la fronti`re, cest-`-dire ceux ayant au moins un voisin e a non visit. Selon la structure de donne quon utilise pour F on obtient des Algorithmes de parcours e e parcours dirents. e Algorithme 5 : Parcours gnral e e Donnes e Structures de donnes e G un graphe Lensemble s un sommet de G On dispose des fonctions suivantes sur un ensemble S. Variables locales choose(S) : renvoie un sommet x de S (si S nest pas vide). Z un ensemble /* zone connue */ empty?(S) : renvoie vrai ssi S est lensemble vide. F un ensemble /* la fronti`re */ e add(x, S) : ajoute x ` lensemble S. a u, v deux sommets remove(x, S) : enl`ve x de lensemble S (si x appartient ` S). e a dbut e initialisation La le add(s,Z) add(s,F ) On dispose des fonctions suivantes sur une le Q. checkFront(Q) : renvoie le premier sommet de F (si Q nest pas vide). rpter e e empty?(Q) : renvoie vrai ssi Q est la le vide. v :=choose (F ) pushBack(x, Q) : ajoute x ` larri`re de la le Q. a e si il existe u Z adjacent ` v alors a popFront(Q) : enl`ve le premier sommet de la le Q (si celle-ci nest pas e add(u,F ) /* premi`re visite de u */ e vide). add(u,Z) sinon La pile remove(v,F ) /* derni`re visite de v */ e nsi On dispose des fonctions suivantes sur une pile P . jusqu` empty ?(F ) a checkFront(P ) : renvoie le premier sommet de P (si P nest pas vide). empty?(P ) : renvoie vrai ssi P est la pile vide. n pushFront(x, P ) : ajoute x au dbut de la pile P . e 4

Les Algorithmes

Cours sur les graphes

Algorithme 6 : Parcours en largeur Donnes e G un graphe s un sommet de G Variables locales Z un ensemble /* zone connue F une le /* la fronti`re e u, v deux sommets dbut e initialisation add(s,Z) pushBack(s,F ) rpter e e v :=checkFront (F ) si il existe u Z adjacent ` v alors a add(u,Z) /* premi`re visite de u e pushBack(u,F ) sinon popFront(F ) /* derni`re visite de v e nsi jusqu` empty ?(F ) a n

*/ */

*/

*/

Algorithme 7 : Parcours en profondeur Donnes e G un graphe s un sommet de G Variables locales Z un ensemble /* zone connue F une pile /* la fronti`re e u, v deux sommets dbut e initialisation add(s,Z) pushFront(s,F ) rpter e e v :=checkFront (F ) si il existe u Z adjacent ` v alors a add(u,Z) /* premi`re visite de u e pushFront(u,F ) sinon popFront(F ) /* derni`re visite de v e nsi jusqu` empty ?(F ) a n

*/ */

*/

*/

Les Algorithmes

Cours sur les graphes

Application du parcours en largeur

Applications du parcours en profondeur

On sintresse au moment o` on visite un sommet pour la premi`re e u e fois et celui o` on le visite pour la derni`re fois. On a deux tableaux u e Distance ` la source On peut calculer la distance depuis la source s ` a a e chaque sommet v du graphe (si G est connexe). En eet, on peut facilement Dbut et Fin dans lesquels on stocke les temps correspondant. On mee e observer que les niveaux de larbre (= distance ` la racine) correspondent ` la sure le temps en termes du nombre x dexecutions de la boucle rpter. a a distance ` la source. a Algorithme 9 : Parcours en profondeur + dbut et n e Donnes e Algorithme 8 : Parcours en largeur + distance ` la source a G un graphe connexe et s un sommet de G Donnes e Variables locales G un graphe connexe et s un sommet de G Z un ensemble, F une pile et u, v deux sommets Variables locales Debut et Fin deux tableaux /* indexs par les sommets */ e Z un ensemble, F une le, u, v deux sommets dbut e L tableau des distances ` la source /* indexs par les sommets */ a e initialisation dbut e x=0 initialisation add(s,Z) add(s,Z) pushFront(s,F ) pushBack(s,F ) Dbut[s] := x e L[s] := 0 rpter e e rpter e e x := x + 1 v :=checkFront (F ) v :=checkFront (F ) si il existe u Z adjacent ` v alors a si il existe u Z adjacent ` v alors a add(u,Z) /* premi`re visite de u */ e add(u,Z) /* premi`re visite de u */ e pushBack(u,F ) pushFront(u,F ) L[u] := L[v] + 1 Dbut[s] := x e sinon sinon popFront(F ) /* derni`re visite de v */ e popFront(F ) /* derni`re visite de v */ e nsi Fin[s] := x jusqu` empty ?(F ) a nsi n jusqu` empty ?(F ) a Sorties : L, tableau des distances ` la source s a n 6

Les Algorithmes

Cours sur les graphes

Le Tri topologique. On dispose dun graphe orient sans cycle. Un tel e graphe reprsente typiquement un probl`me dordonnancement de tches : un e e a sommet correspond ` une tche et un arc (u, v) indique la contrainte de prca a e e dence la tche u doit tre termine avant que la tche v ne puisse commencer . a e e a Le probl`me du tri topologique consiste ` ordonner les sommets du graphe de e a telle sorte que si il y a un arc (u, v) alors u vient avant v dans lordre calcul. e Bien que le graphe soit orient, on peut parfaitement y appliquer lalgoe rithme de parcours en profondeur. On peut observer que la derni`re visite dun e sommet a forcment lieu avant la derni`re visite dun sommet qui le prc`de. e e e e Ainsi, on peut voir les valeurs calcules dans le tableau Fin comme des valeurs e de priorit : plus la valeur est haute, plus la tche est importante. Autrement e a dit, lordre inverse de celui donn par Fin est un ordre topologique. e

Algorithme 10 : Parcours en profondeur + Tri Topologique Donnes e G un graphe orient sans cycle e s un sommet de G Variables locales Z un ensemble, F une pile et u, v deux sommets Priorit un tableau e /* index par les sommets */ e dbut e initialisation x=0 add(s,Z) pushFront(s,F ) rpter e e x := x + 1 v :=checkFront (F ) si il existe u Z successeur de v alors add(u,Z) /* premi`re visite de u */ e pushFront(u,F ) sinon popFront(F ) /* derni`re visite de v */ e Priorit[s] := x e nsi jusqu` empty ?(F ) a n Sorties : Priorit e

Вам также может понравиться