Professional Documents
Culture Documents
123 / 149
124 / 149
Lalgorithme de Dijkstra
Initialisation:
D(s)=0, proche(s)=s D(x)= , proche(x)=null S= (sommets traits)
Tant que S X:
x = sommet de X-S ayant la valeur D(x) minimale diffrente de S:=S+{x} pour chaque arc e=(x,y) dans E t.q. y dans X-S: relax(e)
126 / 149
G
2467
F
621
D
328
Ide: construit un ACM partir dun sommet r racine chaque tape on a S (sommets dj couverts), arbre T couvrant S. on choisi larte (x,y) la plus lgre t.q x S, y X-S S:=S + y, T:= T + (x,y)
9 9
337
1464
802
C
184
144 1258
b
6 4 5
b
6 4 5
184
a
5
2 4
d
5
a
5
2 4
d
5
H
2658
I
1235
1423
A
0
1090
B
946
127 / 149 128 / 149
Algorithme de Prim
Tant que S X : 1. pivot:= le sommet uX-S avec D(u) minimum S:=S + u T:=T + (proche(u), u) 2. m..j. des valeurs d et proche pour chaque sommet vX-S adjacent u. si p(u,v) < D(v): a. proche(v) = u b. D(v) = p(u,v)
b
6 4 5
a
5
2 4
d
5
b
6 4 5
2 4
d
5
Dijkstra donne un arbre couvrant. PCC avec Dijkstra pour la source d? PCC avec Dijkstra pour la source e?
129 / 149 130 / 149
Plan du cours
Comparaison Prim / Dijkstra Bellman Ford (Pb2)
une source, poids ngatifs O(mn)
Algorithme de Bellman-Ford
Ide: relaxer tous les arcs n-1 fois. Ide de preuve: chaque chemin de poids minimal vers un sommet contient au plus n-1 arcs. Distance possibles: (sommets nonatteignables), - (sommets sans pcc), les autres
131 / 149
132 / 149
Algorithme de Bellman-Ford
Bellman-Ford:
D(s)=0, proche(s)=s D(x)= , proche(x)=null
Exemple
rpter n-1 fois pour chaque arc e=(x,y): relax(e) pour chaque arc e=(x,y) si D[y] > D[x] + p(x, y): return FALSE //cycle absorbant ou sans-pcc(y) //si on veut les sommets //des circuits absorbants sans-pcc(sommet y) si D[y] > - D[y]= - pour chaque arc e=(y,z) sans-pcc(z) 133 / 149
0 1 2 3 4 5
0 0 0 0 0 0 0
50 50 25 25 25
80 80 55 55
15 15 15 15 15
45 45 45 45
75
75 65
134 / 149
Complexit de Bellman-Ford
Initialisation: O(n) Boucle et relaxation darcs: n appels pour m arcs, O(nm) Complexit: O(nm)
Preuve
1er cas: graphe sans circuit absorbant partir de la source s Considrons un sommet vk et son plus court chemin p = < v0 , v1,..., vk>, ayant k n - 1 arcs Par induction sur k: Si k=0, D(s) = 0 aprs linitialisation Supposons D(vi-1) le cout du PCC de s vers vi-1 aprs litration (i-1) Comme larc (vi-1,vi) est relax litration (i), D(vi) doit tre le cout du PCC de s vers vi. Comme on fait n 1 k itrations, D(vk) doit etre le cout du PCC de s vers vk 2me cas: par contradiction
135 / 149 136 / 149
Plan du cours
Comparaison Prim / Dijkstra Bellman Ford (Pb2)
une source, poids ngatifs O(mn)
Problme 3
Trouver pour toutes les paires i, j, le chemin de poids minimum de i j. On suppose les sommets numrots de 1 n. On va utiliser la reprsentation de graphe par matrice dadjacence A. On veut trouver
matrice des poids D[i,j] des PCCs les PCSs: matrice de sommets, P, t.q. P[i,j] donne le sommet qui prcde j dans le chemin de poids minimal de i j.
137 / 149
138 / 149
Rduction au Pb2?
Avec Dijkstra/Bellman-Ford? Complexit? Initialisation D:
D[i,i] = 0 D[i,j] = A[i,j], si arc (i,j) D[i,j] = sinon
Initialisation P:
P[i,i] = null P[i,j] = i, si arc (i,i) P[i,j] = null sinon
Plan du cours
Comparaison Prim / Dijkstra Bellman Ford (Pb2)
une source, poids ngatifs O(mn)
142 / 149
Floyd-Warshall
Aussi par programmation dynamique. Itrations succesive, apres literation k, matrice A(k): A(k)[i,j] donne la distance du pcc de i j qui ne passe pas par un sommet plus grand que k. A(k)[i,j] = min (A(k-1)[i,j] , A(k-1) [i,k]+ A(k-1)[k,j]) Rsultat final A(n)
143 / 149
Floyd-Warshall
initialisation W[i,j] pour k de 1 n pour i de 1 n pour j de 1 n si (A[i,j] > A[i,k]+A[k,j]) A[i,j] := A[i,k]+A[k,j]; Complexit O(n3).
144 / 149
Exemple Floyd-Warshall
8 1 3 5 2
145 / 149
146 / 149
Variantes du PCC
Plusieurs fonctions de cout en mme temps
PCC avec contraintes (exemple: distances, pages, et stations dessences)
Exercice - Dijkstra
Si les poids des arcs sont des entiers dans {0, ,L}, comment modifier Dijkstra pour quil calcule les pcc en O(nL + m)? Comment modifier cet algorithme pour une complexit O((n + m) lg L ) ?
147 / 149
148 / 149
Exercice Bellman-Ford
Arbitrage: On veut utiliser les diffrences entre taux dchanges pour transformer une unit dune devise donne dans plus quune unit de la mme devise.
n devises T[i,j]: taux dchange de la devise i vers la devise j
1 unit i = T[i,j] units j
Comment tester sil existe un arbitrage, cest--dire une squence i1, i2, , ik,i1 tel que T[i1,i2] x T[i2,i3] x x T[ik-1,ik] x T[ik,i1] > 1 ?
149 / 149