Академический Документы
Профессиональный Документы
Культура Документы
F. Madelaine C. Simon
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
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
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
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
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
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
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