Kürzeste Wege (Version vom 16.6.)

Werbung
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
Herunterladen