16
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

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

Embed Size (px)

Citation preview

Page 1: 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

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

Page 2: 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

Dist = ∞ for u in GDists = 0P = Ps = s Q = Q.append(s)while Q: z = Q.get_and_delete() for x in 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 >

Generic Shortest Path (G, s)

Page 3: 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

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)

Page 4: 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

Dist = ∞ for u in GDists = 0Ps = s Q = Q.append(s)while Q: z = Q.pop() for x in Adjz: If Px == 0: Distx = Distz +1 Px = z Q.append(x) return path(P)

Shortest Path (G, s)

Page 5: 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

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(V2+E) // O((V+E)log V) // O(E+Vlog V)

Page 6: 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

Dist = ∞ for u in GDists=0Ps=s Q = Vwhile Q: z = Q.delete_min() for x in Adjz: Relax(z, x)...Return <P, Dist>

The algorithm : DIJKSTRA(G,s)

Page 7: 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

Dist = ∞ for u in GDists = 0Ps = s Q = Makeheap(V) (using dist-values as keys)while Q: z = Q.deletemin_key() /♯ extract min operation

for x in Adjz: If Distx > Distz+w(z, x) Q.decrease_key(x) /♯Distx = Distz+w(z, x), Px = z

Dijkstra1 (G.w, s)

Page 8: 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

M = 0 for u in G Dist = ∞ for u in GDists = 0Ps = s Q.add(s) /♯ altenatively, Q={s} and insert nodes when reached

while Q: z = Q.delete_min() for x in 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)

Dijkstra2 (altenative) (G,s)

Page 9: 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

• 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)• Fibonacci Heap: O(E+VlogV)

COMPLEXITE

Page 10: 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

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)

Page 11: 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

M = 0 for u in G Dist = ∞ for u in GMs=1Dists=0Q.enqueue(s)Ps=s while Q: z = Q.dequeue() Mz=0 for x in Adjz: If Distx > Distz+w(z, x) Distx = Distz+w(z,x) Px = z if Mx==0: Mx=1 Q.enqueue(x)

Bellman-Ford (G.w,s)

Page 12: 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

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)

Page 13: 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

Dist = ∞ for u in GDists =0Ps = s Q = Topological_sort(G)while Q: z = Q.pop() for x in Adjz: If Distx > Distz+w(z, x) Distx = Distz+w(z, x) Px = z

SHORTEST_PATHS_DAGs (G.w, s)

Page 14: 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

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)

Page 15: 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

M = 0 for u in G, Dist = ∞ for u in G, Dists=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 Adjz: If Distx > Distz+w(z, x): Distx = Distz+w(z, x) if Mx ≠ a: Mx = a Q.enqueue(x)G does not contains a negative cycle

NEGATIVE_CYCLE(G.w, s)

Page 16: 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

Currency conversion. Given currencies and exchange rates, what is 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.28 UKPound [ 455.2 x 0.6677 x 1.0752 ]

Currency UKPound Euro JapYen Swiss US Dollar Gold (oz.)

UKPound 1.0000 0.6853 0.005290 0.4569 0.6368 208.100

Euro 1.4599 1.0000 0.007721 0.6677 0.9303 304.028 JapYen 189.050 129.520 1.0000 85.4694 120.400 39346.7

Swiss 2.1904 1.4978 0.011574 1.0000 1.3941 455.200

US Dollar 1.5714 1.0752 0.008309 0.7182 1.0000 327.250

Gold(oz.) 0.004816 0.00329 0.0000255 0.002201 0.003065 1.0000

Shortest paths application: Currency conversion