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
Dist = for u in G Dist s = 0 P = P s = s Q = Q.append(s) while Q: z = Q.get_and_delete() for x in Adj z : If Dist x > Dist z +w(z, x): / the edge(z, x) is « tense » Dist x = Dist z +w(z, x) P x = z Q.append(x) Return
Le plus court chemin entre 2 sommets Données: Un graphe G avec des arêtes (arcs) sans poids et sommet s de G. But: Le plus court chemin entre s et les autres sommets du graphe Complexité : O(V+E)
Dist = for u in G Dist s = 0 P s = s Q = Q.append(s) while Q: z = Q.pop() for x in Adj z : If P x == 0: Dist x = Dist z +1 P x = z Q.append(x) return path(P)
Le plus court chemin: Dijkstra Données: Un graphe G avec des arêtes (arcs) à des poids positifs et un sommet s. But: Le plus court chemin entre s et les autres sommets du graphe. Complexité : O(V 2 +E) // O((V+E)log V) // O(E+Vlog V)
Dist = for u in G Dist s =0 P s =s Q = V while Q: z = Q.delete_min() for x in Adj z : Relax(z, x)... Return
Dist = for u in G Dist s = 0 P s = s Q = Makeheap(V) (using dist-values as keys) while Q: z = Q.deletemin_key() / extract min operation for x in Adj z : If Dist x > Dist z +w(z, x) Q.decrease_key(x) / Dist x = Dist z +w(z, x), P x = z
M = 0 for u in G Dist = for u in G Dist s = 0 P s = s Q.add(s) / altenatively, Q={s} and insert nodes when reached while Q: z = Q.delete_min() for x in Adj z : If Dist x > Dist z +w(z, x) Q.decrease_key(x) / Dist x = Dist z +w(z, x), P x = z If M x ==0: M x =1 Q.add(x)
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(V 2 ) Heap: O((V+E)logV) Fibonacci Heap: O(E+VlogV) COMPLEXITE
Le plus court chemin: Bellman-Ford Données: Un graphe valué G et un sommet s sans cycle négatif. But: Le plus court chemin entre s et les autres sommets du graphe. Complexité: O(VE)
M = 0 for u in G Dist = for u in G M s =1 Dist s =0 Q.enqueue(s) P s =s while Q: z = Q.dequeue() M z =0 for x in Adj z : If Dist x > Dist z +w(z, x) Dist x = Dist z +w(z,x) P x = z if M x ==0: M x =1 Q.enqueue(x)
Le chemin le plus court : DAGs Données: Un graphe orienté et sans cycle G, et un sommet s de G. But: Le plus court chemin entre s et les autres sommets du graphe. Complexité: O(V+E )
Dist = for u in G Dist s =0 P s = s Q = Topological_sort(G) while Q: z = Q.pop() for x in Adj z : If Dist x > Dist z +w(z, x) Dist x = Dist z +w(z, x) P x = z
Détection des Cycles négatifs Données: Un graphe G et un sommet s. But: G posséde t-il un cycle négatif? Complexité: O(VE )
M = 0 for u in G, Dist = for u in G, Dist s =0, a =1, Q.enqueue(s), Q.enqueue( ) while Q: z = Q.dequeue() if z == : if a < n : Q.enqueue( ) a+=1 elif Q: PRINT G contains a negative cycle break for x in Adj z : If Dist x > Dist z +w(z, x): Dist x = Dist z +w(z, x) if M x a: M x = a Q.enqueue(x) G does not contains a negative cycle
Currency conversion. Given currencies and exchange rates, what is best way to convert one ounce of gold to US dollars ? 1 oz. Gold US Dollar. 1 oz. gold UKPound US Dollar [ x ] 1 oz. gold Francs Euros UKPound [ x x ] Currency UKPound Euro JapYen Swiss US Dollar Gold (oz.) UKPound Euro JapYen Swiss US Dollar Gold(oz.) Shortest paths application: Currency conversion