160 likes | 279 Views
CHEMINS DANS LES GRAPHES. Le PCC entre un sommet et tous les autres sommets dans un graphe sans poids Le PCC entre un sommet et tous les autres sommets dans un graphe à des poids positifs Le PCC entre un sommet et tous les autres sommets dans un graphe pondéré.
E N D
CHEMINS DANS LES GRAPHES • Le PCC entre un sommet et tous les autres sommets dans un graphe sans poids • Le PCC entre un sommet et tous les autres sommets dans un graphe à des poids positifs • Le PCC entre un sommet et tous les autres sommets dans un graphe pondéré. • Le PCC entre un sommet et tous les autres sommets dans un graphe orienté et sans cycle
GenericShortestPath(G, s) Dist= ∞ for u in G Dists = 0 P = Ps = s Q = Q.append(s) whileQ: z = Q.get_and_delete() forxin Adjz: If Distx > Distz+w(z, x): /♯ the edge(z,x) is « tense» Distx = Distz+w(z, x) Px= z Q.append(x) Return < P, D >
Le plus court chemin entre 2 sommets • Données: Un grapheG avec des arêtes (arcs) sans poidset sommets de G. • But: Le plus court chemin entre s et les autres sommets du graphe Complexité: O(V+E)
ShortestPath(G, s) Dist= ∞ for u in G Dists = 0 Ps = s Q = Q.append(s) whileQ: z = Q.pop() forxin Adjz: If Px== 0: Distx= Distz +1 Px= z Q.append(x) returnpath(P)
Le plus court chemin: Dijkstra • Données: Un grapheG avec des arêtes (arcs) à des poidspositifset un sommets. • But: Le plus court chemin entre s et les autres sommets du graphe. Complexité: O(V2+E) // O((V+E)log V) // O(E+Vlog V)
The algorithm : DIJKSTRA(G,s) Dist= ∞for u in G Dists=0 Ps=s Q = V whileQ: z = Q.delete_min() forxin Adjz: Relax(z, x) ... Return <P, Dist>
Dijkstra1 (G.w, s) Dist= ∞for u in G Dists = 0 Ps = s Q = Makeheap(V) (usingdist-values as keys) whileQ: z = Q.deletemin_key() /♯extractmin operation forxin Adjz: If Distx > Distz+w(z, x) Q.decrease_key(x) /♯Distx = Distz+w(z, x),Px = z
Dijkstra2 (altenative) (G,s) M = 0 for u in G Dist= ∞ for u in G Dists = 0 Ps = s Q.add(s) /♯altenatively, Q={s} and insert nodeswhenreached whileQ: z = Q.delete_min() forxin Adjz: If Distx > Distz+w(z, x) Q.decrease_key(x) /♯Distx = Distz+w(z, x),Px = z If Mx==0: Mx=1 Q.add(x)
COMPLEXITE • Opérations: Extract-Min Decrease-Key # ops: V E • Temps/Op. • Array: O(V) O(1) • Heap: O(logV) O(logV) • Fibonacci Heap: O(logV) O(1) (amortie) • Complexitétotale en Temps: • Array: O(V2) • Heap: O((V+E)logV) • FibonacciHeap: O(E+VlogV)
Le plus court chemin: Bellman-Ford Données: Un graphevaluéG et un sommets sans cycle négatif. But: Le plus court chemin entre s et les autres sommets du graphe. Complexité: O(VE)
Bellman-Ford (G.w,s) M = 0 for u in G Dist= ∞ for u in G Ms=1 Dists=0 Q.enqueue(s) Ps=s whileQ: z = Q.dequeue() Mz=0 forxin Adjz: If Distx > Distz+w(z,x) Distx = Distz+w(z,x) Px= z if Mx==0: Mx=1 Q.enqueue(x)
Le chemin le plus court: DAGs • Données: Un grapheorienté et sans cycle G, et un sommetsde G. • But: Le plus court chemin entre s et les autres sommets du graphe. Complexité: O(V+E)
SHORTEST_PATHS_DAGs(G.w, s) Dist= ∞for u in G Dists =0 Ps = s Q = Topological_sort(G) whileQ: z = Q.pop() forxin Adjz: If Distx > Distz+w(z, x) Distx = Distz+w(z, x) Px = z
Détection des Cycles négatifs • Données: Un grapheG et un sommets. • But: G posséde t-il un cycle négatif? Complexité: O(VE)
NEGATIVE_CYCLE(G.w, s) M = 0 for u in G, Dist= ∞ for u in G, Dists=0, a =1, Q.enqueue(s), Q.enqueue(♯) whileQ: z = Q.dequeue() if z ==♯: if a < n : Q.enqueue(♯) a+=1 elif Q: PRINT ‘Gcontains a negativecycle’ break forxin Adjz: If Distx > Distz+w(z,x): Distx = Distz+w(z,x) if Mx ≠ a: Mx = a Q.enqueue(x) G does not containsa negative cycle
Shortestpaths application: Currency conversion Currencyconversion. Givencurrencies and exchange rates, whatis best way to convert one ounce of gold to US dollars? 1 oz. Gold → 327.25 US Dollar. 1 oz. gold→ 208.10 →UKPound→ 327.00 US Dollar[ 208.10 x 1.5714 ] 1 oz. gold → 455.2 Francs→ 304.39 Euros→ 327.28UKPound[ 455.2 x 0.6677 x 1.0752 ] CurrencyUKPound Euro JapYenSwiss US Dollar Gold (oz.) UKPound1.0000 0.6853 0.005290 0.4569 0.6368 208.100 Euro1.4599 1.0000 0.007721 0.6677 0.9303 304.028 JapYen189.050 129.520 1.0000 85.4694 120.400 39346.7 Swiss2.1904 1.4978 0.011574 1.0000 1.3941 455.200 US Dollar 1.57141.0752 0.008309 0.7182 1.0000 327.250 Gold(oz.) 0.004816 0.00329 0.0000255 0.002201 0.003065 1.0000