15. Kürzeste Wege t s SS 2016 DuA - Kapitel 15 1 Gewichtete Graphen Ein gewichteter Graph G ist ein Paar (V,E) zusammen mit einer Gewichtsfunktion w, wobei E ⊆ V × V und w: E → IR. Für e∈E heißt w(e) das Gewicht von e. Für einen Weg p mit Kanten e1,..ek heißt w(p)=w(e1)+...+w(ek) das Gewicht von p. Ein kürzester Weg von Knoten u zum Knoten v ist der Weg mit dem kleinsten Gewicht von u nach v. SS 2016 DuA - Kapitel 15 2 Berechnung kürzester Wege Probleme: Kürzeste Wege von einem Startknoten s (Single Source Shortest Path) Kürzeste Wege zwischen allen Knotenpaaren (All Pairs Shortest Path) Single Source Shortest Path (SSSP): o Gegeben: Gewichteter Graph G und Startknoten s o Gesucht: Für alle Knoten v die Distanz δ(s,v) sowie ein kürzester Weg. SS 2016 DuA - Kapitel 15 3 Kürzeste Wege 42 0 -∞ -∞ -∞ -1 0 +∞ 5 -∞ 2 2 0 s 0 -2 -3 -1 -1 -2 -2 -3 δ(s,v): Distanz zwischen s und v ∞ δ(s,v) = -∞ kein Weg von s nach v Weg bel. kleiner Kosten von s nach v min{ w(p) | p ist Weg von s nach v} SS 2016 DuA - Kapitel 15 4 Kürzeste Wege 42 0 -∞ 5 -∞ -1 0 +∞ -∞ 2 2 0 s 0 -∞ -2 -3 -1 -2 -1 -2 -3 Wann sind die Kosten -∞? Wenn es einen negativen Kreis gibt: s SS 2016 C DuA - Kapitel 15 v w(C)<0 5 Kürzeste Wege Negativer Kreis hinreichend und notwendig für Wegekosten -∞. Negativer Kreis hinreichend: s Weg p Weg q C v w(C)<0 Kosten für i-fachen Durchlauf von C: w(p) + i⋅w(C) + w(q) Für i→∞ geht Ausdruck gegen -∞. SS 2016 DuA - Kapitel 15 6 Kürzeste Wege Negativer Kreis hinreichend und notwendig für Wegekosten -∞. Negativer Kreis notwendig: • l: minimale Kosten eines einfachen Weges von s nach v • es gibt nichteinfachen Weg r von s nach v mit Kosten w(r)<l • r nicht einfach: Zerlegung in pCq, wobei C ein Kreis ist und pq ein einfacher Pfad • da w(r) < l≤w(pq) ist, gilt w(C)<0 SS 2016 DuA - Kapitel 15 7 Kürzeste Wege in DAGs • Gerichteter azyklischer Graph (DAG): Graph ohne gerichtete Kreise • DAG mit Kantenkosten 1: Breitensuche 3 2 4 1 3 3 1 4 s 2 2 SS 2016 DuA - Kapitel 15 8 Kürzeste Wege in DAGs DAG mit beliebigen Kantenkosten: Reine Breitensuche funktioniert nicht. 2 1 4 2 1 1 3 2 s 2 8 7 2 1 2 4 6 SS 2016 1 1 3 1 2 9 5 1 DuA - Kapitel 15 9 Kürzeste Wege in DAGs Korrekte Distanzen: 2 1 4 2 1 1 3 2 s 2 5 4 2 1 2 4 4 SS 2016 1 1 3 1 2 6 5 1 DuA - Kapitel 15 10 Kürzeste Wege in DAGs Strategie: nutze aus, dass Knoten in DAGs topologisch sortiert werden können (alle b erfüllen a<b) Kanten a 2 4 2 1 3 s 9 1 1 2 1 11 2 4 7 SS 2016 6 1 1 2 10 2 3 1 5 1 DuA - Kapitel 15 8 11 Kürzeste Wege in DAGs Strategie: betrachte dann Knoten in der Reihenfolge ihrer topologischen Sortierung und aktualisiere Distanzen zu s 4 1 2 1 s 4 3 3 10 2 9 1 1 5 46 2 1 2 4 7 46 SS 2016 6 1 2 2 5 2 3 1 1 2 5 1 DuA - Kapitel 15 11 6 8 12 Kürzeste Wege in DAGs Konkret: für jeden besuchten Knoten u: für alle Kanten (u,v)∈E: setze Distanz d[v] auf min{d[v],d[u]+w(u,v)} 4 1 2 1 s 4 3 3 10 2 9 1 1 5 4 2 1 2 4 7 4 SS 2016 6 1 2 2 5 2 3 1 1 2 5 1 DuA - Kapitel 15 11 6 8 13 Kürzeste Wege in DAGs Strategie: 1. Topologische Sortierung der Knoten 2. Aktualisierung der Distanzen gemäß der topologischen Sortierung Warum funktioniert das?? SS 2016 DuA - Kapitel 15 14 Kürzeste Wege in DAGs Betrachte kürzesten Weg von s nach v. Dieser hat topologische Sortierung (ti)i mit ti<ti+1 for alle i. t1 s 0 w1 t2 t3 t4 t5 d1 d2 d3 d4 w2 w3 w4 v Besuch in topologischer Reihenfolge führt zu richtigen Distanzen (di = ∑j≤i wi). SS 2016 DuA - Kapitel 15 15 Kürzeste Wege in DAGs Betrachte kürzesten Weg von s nach v. Dieser hat topologische Sortierung (ti)i mit ti<ti+1 für alle i. t1 s 0 w1 t2 t3 t4 t5 d1 d2 d3 d4 w2 w3 w4 v Bemerkung: kein Knoten auf dem Weg zu v kann Distanz < di zu s haben, da sonst kürzerer Weg zu v möglich wäre. SS 2016 DuA - Kapitel 15 16 Kürzeste Wege Allgemeine Strategie: • Am Anfang, setze d(s):=0 und d(v):=∞ für alle Knoten • besuche Knoten in einer Reihenfolge, die sicherstellt, dass mindestens ein kürzester Weg von s zu jedem v in der Reihenfolge seiner Knoten besucht wird • für jeden besuchten Knoten u, aktualisiere die Distanzen der Knoten v mit (u,v)∈E, d.h. setze d(v) := min{d(v), d(u)+w(u,v)} SS 2016 DuA - Kapitel 15 17 Kürzeste Wege in DAGs Zurück zur Strategie: 1. Topologische Sortierung der Knoten 2. Aktualisierung der Distanzen gemäß der topologischen Sortierung Wie führe ich eine topologische Sortierung durch? SS 2016 DuA - Kapitel 15 18 Kürzeste Wege in DAGs Topologische Sortierung: • Verwende eine FIFO Queue Q • Anfangs enthält Q alle Knoten, die keine eingehende Kante haben (Quellen). • Solange Q nicht leer ist, entnehme v aus Q und markiere alle (v,w)∈E. Falls alle Kanten nach w markiert sind und w noch nicht in Q war, füge w in Q ein. • Reihenfolge, in der Knoten aus Q entnommen werden, ergibt topologische Sortierung. SS 2016 DuA - Kapitel 15 19 Kürzeste Wege in DAGs Beispiel: • : Knoten momentan in Queue Q • Nummerierung nach Einfügereihenfolge 2 1 6 4 2 1 3 3 1 2 10 9 2 1 2 4 7 SS 2016 1 1 5 1 2 11 8 1 DuA - Kapitel 15 20 Kürzeste Wege in DAGs Korrektheit der topologischen Nummerierung: Knoten wird erst dann nummeriert, wenn alle Vorgänger nummeriert sind. 2 1 6 4 2 1 3 3 1 2 10 9 2 1 2 4 7 SS 2016 1 1 5 1 2 11 8 1 DuA - Kapitel 15 21 Kürzeste Wege in DAGs Laufzeit: Zur Bestimmung aller Knoten ohne eingehende Kante muss Graph einmal durchlaufen werden. Danach wird jeder Knoten und jede Kante genau einmal betrachtet, also Zeit O(n+m). 2 1 6 4 2 1 3 3 1 2 10 9 2 1 2 4 7 SS 2016 1 1 5 1 2 11 8 1 DuA - Kapitel 15 22 Kürzeste Wege in DAGs Bemerkung: topologische Sortierung kann nicht alle Knoten nummerieren genau dann, wenn Graph gerichteten Kreis enthält (kein DAG ist) Test auf DAG-Eigenschaft 2 1 6 4 2 1 3 3 1 2 10 9 2 1 2 4 7 SS 2016 1 1 5 1 2 11 8 1 DuA - Kapitel 15 23 Kürzeste Wege in DAGs DAG-Strategie: 1. Topologische Sortierung der Knoten Laufzeit O(n+m) 2. Aktualisierung der Distanzen gemäß der topologischen Sortierung Laufzeit O(n+m) Insgesamt Laufzeit O(n+m). SS 2016 DuA - Kapitel 15 24 Kürzeste Wege Nächster Schritt: Kürzeste Wege für beliebige Graphen mit positiven Kantengewichten. Problem: besuche Knoten eines kürzesten Weges in richtiger Reihenfolge w s 0 d1 d2 d3 d4 v Lösung: besuche Knoten in der Reihenfolge der Distanz zur Quelle s SS 2016 DuA - Kapitel 15 25 Kürzeste Wege Annahme: Alle Kantengewichte sind positiv Algorithmus von Dijkstra: 1. Es sei S die Menge der entdeckten Knoten 2. Zu Beginn: S={s} und d[s]=0 3. while V≠S do 4. Wähle Knoten v∈V \ S mit mindestens einer Kante aus S und für den d[v] := min (d[u] + w(u,v)) minimal unter allen v∈V \ S ist (u,v)∈(S,V\S) 5. Füge v zu S hinzu SS 2016 DuA - Kapitel 15 26 Kürzeste Wege Wie kann man Pfade berechnen? • Wie bei BFS/DFS über Feld π • Wenn (u,v) die Kante ist, für die das Minimum in Zeile 4 erreicht wird, dann setze π[v] ← u Kürzester s-u-Weg P(u) ist implizit gespeichert: • Für u=s haben wir den leeren Weg als kürzesten Weg von s nach s • Für u≠s gilt: P(u) besteht aus Weg P(π(u)) gefolgt von Kante (π[u],u) SS 2016 DuA - Kapitel 15 27 Kürzeste Wege Satz 15.1 (Korrektheit): • δ(s,u): Länge des kürzesten Weges von s nach u • Γ(S): Menge der Knoten in V\S mit Kante aus S Invariante: 1. Für jedes u∈S: d[u]=δ(s,u) und d[u]≤minv∈Γ(S) δ(s,v) 2. Für jedes v∈Γ(S): d[v]≥δ(s,v) Beweisskizze: S SS 2016 Knoten v mit minimalem d[v] DuA - Kapitel 15 28 Kürzeste Wege Wie kann man Dijkstras Algorithmus effizient implementieren? • Naiver Ansatz: Überprüfe für jeden Knoten aus V\S alle Kanten (Laufzeit O(|V|⋅|E|) ) Besser: • Halte d[v]-Werte für alle v∈V\S aufrecht • Speichere alle Knoten aus V\S in Heap ab mit Schlüssel d[v] Problem: Was ist, wenn sich Schlüssel verändern SS 2016 DuA - Kapitel 15 29 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements des Heaps, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 5 Decrease-Key(A,i,newkey) 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] SS 2016 DuA - Kapitel 15 9 11 12 15 30 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements des Heaps, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 5 Decrease-Key(A,i,newkey) 9 11 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 15 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 31 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 5 Decrease-Key(A,i,newkey) 9 11 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 3 i 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 32 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 5 Decrease-Key(A,i,newkey) 9 11 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 3 i 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 33 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 5 Decrease-Key(A,i,newkey) 9 3 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 11 i 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 34 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 5 Decrease-Key(A,i,newkey) 9 3 i 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 11 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 35 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 5 Decrease-Key(A,i,newkey) 9 3 i 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 11 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 36 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 3 Decrease-Key(A,i,newkey) 9 5 i 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 11 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 37 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 3 i Decrease-Key(A,i,newkey) 9 5 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 11 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 38 Kürzeste Wege Heaps mit Decrease-Key: • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 3 i Decrease-Key(A,i,newkey) 9 5 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 11 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 39 Kürzeste Wege Heaps mit Decrease-Key: Laufzeit: O(log n) • Datenstruktur Min-Heap A • Neue Funktion DecreaseKey(A, i, newkey): Wir bekommen Index i des Elements der Heap, dessen Wert (Schlüssel) auf newkey gesetzt wird • newkey ist kleiner als der alte Schlüssel 3 i Decrease-Key(A,i,newkey) 9 5 1. A[i] ← newkey 2. while i>1 and A[parent[i]]>A[i] do 11 12 3. A[parent[i]] ↔ A[i] 4. i ← parent[i] DecreaseKey(A,5,3) SS 2016 DuA - Kapitel 15 40 Kürzeste Wege Wie kann man Dijkstras Algorithmus effizient implementieren? • Halte d[v] Werte für alle v∈V\S aufrecht • Speichere alle Knoten aus V\S in Prioritätenschlange ab mit Schlüssel d[v] • Für jeden Knoten v speichere Zeiger auf sein Vorkommen im Heap • d[v]-Werte vergrößern sich nie • Benutze Decrease-Key, wenn sich Wert d[v] verringert SS 2016 DuA - Kapitel 15 41 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 2. d[s]←0; S←∅; Q←BuildHeap(V) 3. while Q≠∅ do Abkürzung für Decrease-Key(Q,v,d[u]+w(u,v)) 4. u←deleteMin(Q) Wir nehmen an, dass in v Pos. 5. S←S∪{u} von v in Q vermerkt ist. 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u SS 2016 DuA - Kapitel 15 42 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 7 5. S←S∪{u} d c 5 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u SS 2016 DuA - Kapitel 15 43 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ ∞ 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) ∞ 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u SS 2016 DuA - Kapitel 15 44 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ ∞ 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u s Q: a SS 2016 b DuA - Kapitel 15 c 45 d Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ ∞ 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u s Q: a SS 2016 b DuA - Kapitel 15 c 46 d Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ ∞ 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u d Q: a SS 2016 DuA - Kapitel 15 c b 47 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ ∞ 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u d Q: a SS 2016 DuA - Kapitel 15 c b 48 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ ∞ 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u d Q: a SS 2016 DuA - Kapitel 15 c b 49 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u a Q: d SS 2016 DuA - Kapitel 15 c b 50 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ ∞ 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u a Q: d SS 2016 DuA - Kapitel 15 c b 51 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 7 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u a Q: c SS 2016 DuA - Kapitel 15 d b 52 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 7 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u a Q: c SS 2016 DuA - Kapitel 15 d b 53 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 7 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u c Q: d SS 2016 DuA - Kapitel 15 b 54 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil ∞ 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 7 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u c Q: d SS 2016 DuA - Kapitel 15 b 55 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 7 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u b Q: d SS 2016 DuA - Kapitel 15 c 56 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 7 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u b Q: d SS 2016 DuA - Kapitel 15 c 57 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u b Q: d SS 2016 DuA - Kapitel 15 c 58 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 2 4 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u b Q: d SS 2016 DuA - Kapitel 15 c 59 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 2 4 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u c Q: d SS 2016 DuA - Kapitel 15 60 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u c Q: d SS 2016 DuA - Kapitel 15 61 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u c Q: d SS 2016 DuA - Kapitel 15 62 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u c Q: d SS 2016 DuA - Kapitel 15 63 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 64 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 65 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 66 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 67 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 68 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 69 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 ∞ 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 70 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 71 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 d 72 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 73 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 74 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 75 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 1 4 2 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Q: SS 2016 DuA - Kapitel 15 76 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 2 4 1 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Laufzeit: • Q←V (Aufbau des Heaps): O(|V|) SS 2016 DuA - Kapitel 15 77 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 2 4 1 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Laufzeit: • deleteMin und Decrease-Key: O(log |V|) SS 2016 DuA - Kapitel 15 78 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 2 4 1 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Laufzeit: • deleteMin: |V|-mal, Decrease-Key: |E|-mal SS 2016 DuA - Kapitel 15 79 Kürzeste Wege Dijkstra(G,w,s) 1. for each vertex v∈V do d[v]←∞; π[v]←nil 4 2 2 2. d[s]←0; S←∅; Q←V a b 2 3. while Q≠∅ do 2 4 1 s 6 8 4. u←deleteMin(Q) 0 7 5. S←S∪{u} d c 5 9 4 6. for each vertex v∈Adj[u] do 7. if d[v]>d[u]+w(u,v) then DK(Q,v,d[u]+w(u,v)); π[v]←u Laufzeit: • insgesamt O((|V|+|E|) log |V|) SS 2016 DuA - Kapitel 15 80 Kürzeste Wege Dijkstras Algorithmus • Kürzeste Wege von einem Knoten und mit positiven Kantengewichten • Laufzeit O((|V|+|E|) log |V|) • Bessere Laufzeit von O(|V| log |V| + |E|) möglich mit besseren Heaps (z.B. Fibonacci Heap) Fragen: • Was passiert bei negativen Kantengewichten? • Wie kann man das kürzeste Wege Problem für alle Paare von Knoten effizient lösen? SS 2016 DuA - Kapitel 15 81 Kürzeste Wege Beispiel für Problem mit Dijkstra Algo: v 2 ∞ 0 2 -1 1 s 3 ∞ 3 ∞ -1 1 -4 Knoten v hat falschen Distanzwert! Alternative Verfahren bekannt (siehe Kapitel 17). SS 2016 DuA - Kapitel 15 82 Changelog 12.06.16: Folien 28, 42-80 (DK eingesetzt) SS 2016 DuA - Kapitel 15 83 Kürzeste Wege Das transitive Hülle Problem: • Gegeben sei ein gerichteter, ungewichteter Graph G=(V,E) • Gesucht: Die transitive Hülle G*=(V,E*) von G, wobei E*={(u,v): es gibt Weg von u nach v in G} G SS 2016 G* DuA - Kapitel 15 84 Kürzeste Wege Das transitive Hülle Problem: • Gegeben sei ein gerichteter, ungewichteter Graph G=(V,E) • Gesucht: Die transitive Hülle G*=(V,E*) von G, wobei E*={(u,v): es gibt Weg von u nach v in G} Transitive Hülle: • In O(|V|²+|V| |E|) Zeit mit Breiten- oder Tiefensuche von jedem Knoten • Geht das auch schneller? SS 2016 DuA - Kapitel 15 85 Kürzeste Wege Graphen und Matrixmultiplikation: • Sei A die n×n-Adjazenzmatrix von Graph G mit Knotenmenge {1,…,n} • Was ist A⋅A? Behauptung 15.2: Sei Z= A⋅A. Dann gilt zij >0, g.d.w. es in G einen Pfad der Länge 2 von Knoten i zu Knoten j gibt. SS 2016 DuA - Kapitel 15 86 Kürzeste Wege Behauptung 15.2: Sei Z‘= A⋅A + A. Dann gilt, dass z‘ij >0, g.d.w. es einen Weg der Länge 1 oder 2 von Knoten i zu Knoten j gibt. Konstruiere Matrix B mit: • bij =1 ⇔ z‘ij >0 Behauptung 15.3: Matrix B hat einen Weg von Knoten i nach j, g.d.w. Matrix A einen solchen Weg hat. SS 2016 DuA - Kapitel 15 87 Kürzeste Wege Behauptung 15.4: Sei P ein Weg der Länge k>1 in G. Dann hat P maximal Länge (2/3)k in dem von Matrix B beschriebenen Graph G‘. Konsquenz aus Beh. 15.3 und 15.4: • Wenn wir die Berechnung von B log n mal iterieren, 3/2 haben wir die transitive Hülle berechnet SS 2016 DuA - Kapitel 15 88 Kürzeste Wege TransitiveHülle(A) 1. for i←1 to log3/2n do 2. Z‘ ← A A+A 3. for i←1 to n do 4. for j←1 to n do 5. if z‘ij >0 then b ←1 else b ←0 ij ij 6. A←B 7. return A SS 2016 DuA - Kapitel 15 89 Kürzeste Wege Satz 15.5: Der Algorithmus TransitiveHülle berechnet die transitive Hülle eines Graphen G in O(M(n) log n) Zeit, wobei M(n) die Laufzeit zur Matrixmultiplikation bezeichnet. SS 2016 DuA - Kapitel 15 90