Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Valentin Egbers Geändert vor über 10 Jahren
1
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
2
Graphalgorithmen Single Source Shortest Path (SSSP)
Startknoten s Aufgabe: Berechne kürzeste Wege von s zu allen anderen Knoten All Pairs Shortest Path (APSP) Aufgabe: Berechne kürzeste Wege zwischen allen Knotenpaaren SSSP in ungerichteten Graphen (Breitensuche) Graph in Adjazenzlistendarstellung Nutze Kanten von G, um alle Knoten zu finden, die von s aus erreichbar sind Finde kürzeste Distanz (Anzahl Kanten) zu jedem anderen Knoten
3
Graphalgorithmen Invariante (Breitensuche)
Knoten haben 3 Farben: weiß, grau und schwarz Zu Beginn: Alle Knoten sind weiß Ein nicht-weißer Knoten heißt „entdeckt“ Unterscheidung grau-schwarz dient zur Steuerung des Algorithmus Wenn (u,v)E ist und u ist schwarz, dann sind seine adjazenten Knoten grau oder schwarz Graue Knoten können adjazente weiße Knoten haben
4
Graphalgorithmen Beispiel (mögl. Zustand bei einer Breitensuche) s
5
Graphalgorithmen BFS(G,s) 1. „initialisiere BFS“ 2. while Q do
u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz
6
Graphalgorithmen d[u]: Abstand zu s (zu Beginn )
p[u]: Vaterknoten von u (zu Beginn nil) BFS(G,s) 1. „initialisiere BFS“ 2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz
7
Graphalgorithmen Für jeden Knoten u: color[u] = weiß d[u] =
p[u] = nil BFS(G,s) 1. „initialisiere BFS“ 2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz
8
Graphalgorithmen Für jeden Knoten u: color[u] = weiß d[u] =
p[u] = nil BFS(G,s) 1. „initialisiere BFS“ 2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz Für Knoten s: color[s] = grau d[s]=0 p[s]=nil s wird in Schlange Q eingefügt
9
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz c g s b f i Q: s
10
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz c g s u b f i Q: s
11
Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz c g s u b f i Q: s
12
Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz c g s u b f i Q: s
13
Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz c g s u b f i Q: s
14
Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u b f i Q: s
15
Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u b f i Q: s, a
16
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u v=b f i Q: s, a
17
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u v=b f i Q: s, a
18
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u v=b f i Q: s, a
19
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u v=b f i 1 Q: s, a
20
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u v=b f i 1 Q: s, a, b
21
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u b f i 1 Q: a, b
22
Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u b f i 1 Q: a, b
23
Graphalgorithmen d u=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s u b f i 1 Q: a, b
24
Graphalgorithmen d u=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 v=c g s u b f i 1 Q: a, b
25
Graphalgorithmen d u=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 v=c g s 2 u b f i 1 Q: a, b, c
26
Graphalgorithmen v=d u=a e h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u b f i 1 Q: a, b, c
27
Graphalgorithmen v=d u=a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u b f i 1 Q: a, b, c, d
28
Graphalgorithmen v=d u=a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u b f i 1 Q: b, c, d
29
Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u u=b f i 1 Q: b, c, d
30
Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u u=b f i 1 Q: b, c, d
31
Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u b f i 1 Q: c, d
32
Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 u=c g s 2 u b f i 1 Q: c, d
33
Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 u=c g s 2 u b f i 1 3 Q: c, d, f
34
Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u b f i 1 3 Q: d, f
35
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 c g s 2 u b f i 1 3 Q: d, f
36
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c g s 2 u b f i 1 3 Q: d, f, e
37
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c g s 2 u b f i 1 3 Q: f, e
38
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c g s 2 u b u=f i 1 3 Q: f, e
39
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c g s 2 u 4 b u=f i 1 3 4 Q: f, e, g, i
40
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c g s 2 u 4 b u=f i 1 3 4 Q: e, g, i
41
Graphalgorithmen u=d a u=e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c g s 2 u 4 b f i 1 3 4 Q: g, i
42
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c 5 u=g s 2 u 4 b f i 1 3 4 Q: i, h
43
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c 5 g s 2 u 4 b f u=i 1 3 4 Q: h
44
Graphalgorithmen u=d a e 2 u=h BFS(G,s) 1. „initialisiere BFS“ 3
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c 5 g s 2 u 4 b f i 1 3 4 Q:
45
Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 3
2. while Q do u head[Q] for each vAdj[u] do if color[v]=weiß then color[v] grau d[v] d[u]+1; p[v] u enqueue(Q,v) dequeue(Q) color[u] schwarz 1 3 c 5 g s 2 u 4 b f i 1 3 4
46
Graphalgorithmen Satz 47 Beweis
Sei G=(V,E) ein Graph. Die Laufzeit des Algorithmus BFS beträgt O(|V|+|E|). Beweis Laufzeit Initialisierung: O(|V|) Nach der Initialisierung wird kein Knoten weiß gefärbt Daher ist jeder Knoten nur einmal in der Schlange Zeit für Schlangenoperationen ist O(|V|) Adjazenzliste jedes Knotens wird nur durchlaufen, wenn er aus der Schlange entfernt wird Damit wird jede Adjazenzliste maximal einmal durchlaufen (d.h. jede Kante maximal zweimal) Laufzeit für Liste: O(|E|) Gesamtlaufzeit: O(|V|+|E|)
47
Graphalgorithmen Kürzeste Wege in ungewichteten Graphen
Sei d(s,t) die minimale Anzahl Kanten in einem s-t-Weg Ein s-t-Weg der Länge d(s,t) heißt kürzester Weg Wollen zeigen, dass BFS korrekt kürzeste Wege berechnet
48
Graphalgorithmen Lemma 48 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV ein beliebiger Knoten. Dann gilt für jede Kante (u,v)E: d(s,v) d(s,u)+1 Beweis Ist u erreichbar von s, dann ist es auch v Der kürzeste Weg von s nach v kann nicht länger sein, als der kürzeste Weg von s nach u gefolgt von der Kante (u,v). Damit gilt die Ungleichung. Ist u nicht erreichbar von s, dann ist d(s,u)= und die Ungleichung gilt.
49
Graphalgorithmen Lemma 49 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und es laufe die Breitensuche von einem Startknoten sV. Nach Abschluss der Breitensuche gilt für jeden Knoten v, dass d[v] d(s,v) ist. Beweis Induktion über Anzahl von Zeitpunkten, an denen ein Knoten in Q eingefügt wird (I.A.) Nach Initialisierung gilt d[s]=0=d(s,s) und d[v]=≥d(s,v) für alle vV-{s} (I.V.) Aussage gilt nach m Einfügeoperationen (I.S.) Betrachte nach m Einfügeoperationen einen weißen Knoten v, der während einer Suche von u entdeckt wird. Nach (I.V.) gilt d[u]≥d(s,u). Zeile 7: d[v] wird auf d[u]+1 gesetzt Es gilt: d[v] = d[u]+1 ≥ d(s,u)+1 ≥ d(s,v) nach Lemma 48
50
Graphalgorithmen Lemma 49 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und es laufe die Breitensuche von einem Startknoten sV. Nach Abschluss der Breitensuche gilt für jeden Knoten v, dass d[v] d(s,v) ist. Beweis Knoten v wird dann in die Schlange eingefügt und grau gefärbt Damit ändert sich d[v] im Laufe des Algorithmus nicht mehr und die Aussage des Lemmas bleibt erhalten
51
Graphalgorithmen Lemma 50 Beweis
Sei <v ,…, v > der Inhalt der Schlange Q während eines Durchlaufs der Breitensuche auf einem Graph G=(V,E), wobei v Kopf und v Ende der Schlange ist. Dann gilt d[v ]d[v ]+1 und d[v ]d[v ] für i=1,2,…,r-1. Beweis Induktion über die Anzahl Schlangenoperationen (I.A.) Die Schlange enthält nur s, damit gilt das Lemma (I.V.) Das Lemma gilt nach m Schlangenoperationen (I.S.) Wir müssen zeigen, dass das Lemma immer noch nach m+1 Schlangenoperationen gilt. Die (m+1)ste Schlangenoperation ist entweder eine enqueue oder dequeue Operation 1 r 1 r r 1 i i+1
52
Graphalgorithmen Lemma 50 Beweis
Sei <v ,…, v > der Inhalt der Schlange Q während eines Durchlaufs der Breitensuche auf einem Graph G=(V,E), wobei v Kopf und v Ende der Schlange ist. Dann gilt d[v ]d[v ]+1 und d[v ]d[v ] für i=1,2,…,r-1. Beweis Dequeue: Wird v aus der Schlange entfernt, so wird v der neue Kopf Dann gilt aber sicherlich d[v ] d[v ]+1 d[v ]+1 Alle anderen Ungleichungen sind nicht betroffen, also gilt das Lemma 1 r 1 r r 1 i i+1 1 2 r 1 2
53
Graphalgorithmen Lemma 50 Beweis
Sei <v ,…, v > der Inhalt der Schlange Q während eines Durchlaufs der Breitensuche auf einem Graph G=(V,E), wobei v Kopf und v Ende der Schlange ist. Dann gilt d[v ]d[v ]+1 und d[v ]d[v ] für i=1,2,…,r-1. Beweis Enqueue: Wird in Zeile 8 ein Knoten v eingefügt (und damit zu v ), so ist v der Knoten u, von dem aus v entdeckt wurde Es gilt: d[v ] = d[v] = d[u]+1 = d[v ]+1 Außerdem: d[v ] d[v ]+1 = d[u]+1 = d[v] = d[v ] Die anderen Ungleichungen bleiben erhalten; Also gilt das Lemma 1 r 1 r r 1 i i+1 r+1 1 r+1 1 r 1 r+1
54
Graphalgorithmen Satz 51
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, dass ein kürzester Weg von s nach p[v] gefolgt von der Kante (p[v],v) ein kürzester s-v-Weg ist.
55
Graphalgorithmen Satz 51 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, dass ein kürzester Weg von s nach p[v] gefolgt von der Kante (p[v],v) ein kürzester s-v-Weg ist. Beweis Fall 1 (v nicht erreichbar von s):
56
Graphalgorithmen Satz 51 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, dass ein kürzester Weg von s nach p[v] gefolgt von der Kante (p[v],v) ein kürzester s-v-Weg ist. Beweis Fall 1 (v nicht erreichbar von s): Nach Lemma 49 gilt d[v] d(s,v) =
57
Graphalgorithmen Satz 51 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, dass ein kürzester Weg von s nach p[v] gefolgt von der Kante (p[v],v) ein kürzester s-v-Weg ist. Beweis Fall 1 (v nicht erreichbar von s): Nach Lemma 49 gilt d[v] d(s,v) = Es kann keinen ersten Knoten geben, dessen d-Wert in Zeile 7 auf gesetzt wird
58
Graphalgorithmen Satz 51 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, dass ein kürzester Weg von s nach p[v] gefolgt von der Kante (p[v],v) ein kürzester s-v-Weg ist. Beweis Fall 1 (v nicht erreichbar von s): Nach Lemma 49 gilt d[v] d(s,v) = Es kann keinen ersten Knoten geben, dessen d-Wert in Zeile 7 auf gesetzt wird Somit wird v nie entdeckt
59
Graphalgorithmen Satz 51 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, dass ein kürzester Weg von s nach p[v] gefolgt von der Kante (p[v],v) ein kürzester s-v-Weg ist. Beweis Fall 1 (v nicht erreichbar von s): Nach Lemma 49 gilt d[v] d(s,v) = Es kann keinen ersten Knoten geben, dessen d-Wert in Zeile 7 auf gesetzt wird Somit wird v nie entdeckt
60
Graphalgorithmen Beweis Fall 2 (v erreichbar von s):
61
Graphalgorithmen Beweis Fall 2 (v erreichbar von s):
Sei V = {vV : d(s,v) = k} k
62
Graphalgorithmen Beweis Fall 2 (v erreichbar von s):
Sei V = {vV : d(s,v) = k} Wir zeigen per Induktion über k: Es gibt genau einen Zeitpunkt, zu dem jeder Knoten vV (a) grau gefärbt wird (b) d[v]=k gesetzt wird (c) wenn vs, dann p[v] auf u gesetzt wird für ein uV (d) v in Schlange Q eingefügt wird k k k-1
63
Graphalgorithmen Beweis Fall 2 (v erreichbar von s):
Sei V = {vV : d(s,v) = k} Wir zeigen per Induktion über k: Es gibt genau einen Zeitpunkt, zu dem jeder Knoten vV (a) grau gefärbt wird (b) d[v]=k gesetzt wird (c) wenn vs, dann p[v] auf u gesetzt wird für ein uV (d) v in Schlange Q eingefügt wird Da nur zur Initialisierung Knoten weiß gefärbt werden, gibt es maximal einen solchen Zeitpunkt k k k-1
64
Graphalgorithmen Beweis Fall 2 (v erreichbar von s):
Sei V = {vV : d(s,v) = k} Wir zeigen per Induktion über k: Es gibt genau einen Zeitpunkt, zu dem jeder Knoten vV (a) grau gefärbt wird (b) d[v]=k gesetzt wird (c) wenn vs, dann p[v] auf u gesetzt wird für ein uV (d) v in Schlange Q eingefügt wird Da nur zur Initialisierung Knoten weiß gefärbt werden, gibt es maximal einen solchen Zeitpunkt k k k-1
65
Graphalgorithmen Beweis
(I.A.) V ={s}. Während der Initialisierung wird s grau gefärbt, d[s] auf 0 gesetzt, und s in Q eingefügt. Somit gilt die Aussage.
66
Graphalgorithmen Beweis
(I.A.) V ={s}. Während der Initialisierung wird s grau gefärbt, d[s] auf 0 gesetzt, und s in Q eingefügt. Somit gilt die Aussage. (I.V.) Aussage gilt für alle Knoten aus V k-1
67
Graphalgorithmen Beweis
(I.A.) V ={s}. Während der Initialisierung wird s grau gefärbt, d[s] auf 0 gesetzt, und s in Q eingefügt. Somit gilt die Aussage. (I.V.) Aussage gilt für alle Knoten aus V (I.S.) Q ist nie leer bis Algorithmus terminiert. k-1
68
Graphalgorithmen Beweis
(I.A.) V ={s}. Während der Initialisierung wird s grau gefärbt, d[s] auf 0 gesetzt, und s in Q eingefügt. Somit gilt die Aussage. (I.V.) Aussage gilt für alle Knoten aus V (I.S.) Q ist nie leer bis Algorithmus terminiert. Nachdem v in Q eingefügt wurde, ändern sich d[v] und p[v] nicht mehr k-1
69
Graphalgorithmen Beweis
(I.A.) V ={s}. Während der Initialisierung wird s grau gefärbt, d[s] auf 0 gesetzt, und s in Q eingefügt. Somit gilt die Aussage. (I.V.) Aussage gilt für alle Knoten aus V (I.S.) Q ist nie leer bis Algorithmus terminiert. Nachdem v in Q eingefügt wurde, ändern sich d[v] und p[v] nicht mehr Nach Lemma 50 sind die d-Werte monoton steigend, wenn Knoten in die Schlange eingefügt werden k-1
70
Graphalgorithmen Beweis
(I.A.) V ={s}. Während der Initialisierung wird s grau gefärbt, d[s] auf 0 gesetzt, und s in Q eingefügt. Somit gilt die Aussage. (I.V.) Aussage gilt für alle Knoten aus V (I.S.) Q ist nie leer bis Algorithmus terminiert. Nachdem v in Q eingefügt wurde, ändern sich d[v] und p[v] nicht mehr Nach Lemma 50 sind die d-Werte monoton steigend, wenn Knoten in die Schlange eingefügt werden Betrachte nun vV , k>0. Monotonie mit d[v]≥k (Lemma 50) und (I.V.): wenn v entdeckt wird, dann erst nachdem alle Knoten aus V in die Schlange eingefügt wurden k-1 k k-1
71
Graphalgorithmen Beweis
(I.A.) V ={s}. Während der Initialisierung wird s grau gefärbt, d[s] auf 0 gesetzt, und s in Q eingefügt. Somit gilt die Aussage. (I.V.) Aussage gilt für alle Knoten aus V (I.S.) Q ist nie leer bis Algorithmus terminiert. Nachdem v in Q eingefügt wurde, ändern sich d[v] und p[v] nicht mehr Nach Lemma 50 sind die d-Werte monoton steigend, wenn Knoten in die Schlange eingefügt werden Betrachte nun vV , k>0. Monotonie mit d[v]≥k (Lemma 50) und (I.V.): wenn v entdeckt wird, dann erst nachdem alle Knoten aus V in die Schlange eingefügt wurden k-1 k k-1
72
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV k-1 v u
73
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV ObdA. Sei u der erste solche Knoten, der grau gefärbt wird (existiert wegen I.V.) k-1 v u
74
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV ObdA. Sei u der erste solche Knoten, der grau gefärbt wird (existiert wegen I.V.) Wird Knoten grau gefärbt, so wird er auch in Schlange eingefügt und muss irgendwann als Kopf der Schlange auftauchen k-1 v u
75
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV ObdA. Sei u der erste solche Knoten, der grau gefärbt wird (existiert wegen I.V.) Wird Knoten grau gefärbt, so wird er auch in Schlange eingefügt und muss irgendwann als Kopf der Schlange auftauchen Ist u Kopf der Schlange, so wird seine Adjazenzliste durchlaufen und v in Zeile 4 entdeckt k-1 v u
76
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV ObdA. Sei u der erste solche Knoten, der grau gefärbt wird (existiert wegen I.V.) Wird Knoten grau gefärbt, so wird er auch in Schlange eingefügt und muss irgendwann als Kopf der Schlange auftauchen Ist u Kopf der Schlange, so wird seine Adjazenzliste durchlaufen und v in Zeile 4 entdeckt Dann wird v in Zeile 6 grau gefärbt und Zeile 7 setzt d[v]=k und p[v]=u. k-1 v u
77
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV ObdA. Sei u der erste solche Knoten, der grau gefärbt wird (existiert wegen I.V.) Wird Knoten grau gefärbt, so wird er auch in Schlange eingefügt und muss irgendwann als Kopf der Schlange auftauchen Ist u Kopf der Schlange, so wird seine Adjazenzliste durchlaufen und v in Zeile 4 entdeckt Dann wird v in Zeile 6 grau gefärbt und Zeile 7 setzt d[v]=k und p[v]=u. Zeile 8 fügt v in die Schlange ein k-1 v u
78
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV ObdA. Sei u der erste solche Knoten, der grau gefärbt wird (existiert wegen I.V.) Wird Knoten grau gefärbt, so wird er auch in Schlange eingefügt und muss irgendwann als Kopf der Schlange auftauchen Ist u Kopf der Schlange, so wird seine Adjazenzliste durchlaufen und v in Zeile 4 entdeckt Dann wird v in Zeile 6 grau gefärbt und Zeile 7 setzt d[v]=k und p[v]=u. Zeile 8 fügt v in die Schlange ein Damit folgt unsere Aussage per Induktion für alle V k-1 v u k
79
Graphalgorithmen Beweis
Da d(s,v)=k gibt es Pfad mit k Kanten von s nach v und Knoten u mit (u,v)E und uV ObdA. Sei u der erste solche Knoten, der grau gefärbt wird (existiert wegen I.V.) Wird Knoten grau gefärbt, so wird er auch in Schlange eingefügt und muss irgendwann als Kopf der Schlange auftauchen Ist u Kopf der Schlange, so wird seine Adjazenzliste durchlaufen und v in Zeile 4 entdeckt Dann wird v in Zeile 6 grau gefärbt und Zeile 7 setzt d[v]=k und p[v]=u. Zeile 8 fügt v in die Schlange ein Damit folgt unsere Aussage per Induktion für alle V k-1 v u k
80
Graphalgorithmen Beweis
Abschließend beobachten wir, dass wenn vV ist, dann ist p[v] in V k k-1
81
Graphalgorithmen Beweis
Abschließend beobachten wir, dass wenn vV ist, dann ist p[v] in V Damit können wir einen kürzesten Weg von s nach v bekommen, indem wir einen kürzesten Weg von s nach p[v] nehmen und der Kante (p[v],v) folgen k k-1
82
Graphalgorithmen Beweis
Abschließend beobachten wir, dass wenn vV ist, dann ist p[v] in V Damit können wir einen kürzesten Weg von s nach v bekommen, indem wir einen kürzesten Weg von s nach p[v] nehmen und der Kante (p[v],v) folgen k k-1
83
Graphalgorithmen Zusammenfassung (Breitensuche)
Die Breitensuche kann dazu genutzt werden, um das SSSP Problem in ungewichteten Graphen zu lösen Die Laufzeit der Breitensuche ist O(|V|+|E|)
84
Graphalgorithmen Kürzeste Wege in gewichteten Graphen G=(V,E)
w: ER ; w(e) ist Länge der Kante e; w(u,v) ist Länge der Kante (u,v) Für Pfad <v , v ,…, v > ist Pfadlänge gegeben durch d(u,v) = min w(p) , falls es Pfad von u nach v gibt d(u,v) = , sonst 1 k Pfade p von u nach v
85
Graphalgorithmen Negative Kantengewichte
Manchmal hat man Instanzen mit negativen Kantenlängen Bei ungerichteten Graphen kann man Kante immer wieder vorwärts und rückwärts durchlaufen Kürzester Pfad u.U. nicht wohldefiniert Erstmal nichtnegative Kantengewichte 5 7 15 -10 1
86
Graphalgorithmen Lemma 52 Beweis
Sei G=(V,E) ein gewichteter, gerichteter Graph mit Kantengewichten w(e) und sei <v ,…, v > ein kürzester Weg von v nach v . Dann ist für alle 1≤i,j≤k der Weg <v ,…, v > ein kürzester Weg von v nach v . Beweis Annahme: Es gäbe einen kürzeren Weg <v , u ,…, u ,v > von v nach v . Dann wäre < v ,…, v , u , …, u , v ,…, v > kürzer als <v , …, v >. Widerspruch. 1 k 1 k i j i j i 1 l j i j 1 i 1 l j k 1 k
87
Graphalgorithmen Dijkstra‘s Algorithmus
Graph in Adjazenzlistendarstellung Keine negativen Kantenlängen Überträgt Idee der Breitensuche auf gewichtete Graphen
88
Graphalgorithmen Dijkstra‘s Algorithmus
Graph in Adjazenzlistendarstellung Keine negativen Kantenlängen Überträgt Idee der Breitensuche auf gewichtete Graphen 2 4 3 1 1
89
Graphalgorithmen Dijkstra‘s Algorithmus
Graph in Adjazenzlistendarstellung Keine negativen Kantenlängen Überträgt Idee der Breitensuche auf gewichtete Graphen Erster Ansatz: Ersetze Kantenlängen durch mehrfache Kanten 2 3 4 1 1
90
Graphalgorithmen Dijkstra‘s Algorithmus
Erste Idee: Ersetze Kantenlängen durch mehrfache Kanten Probleme: Langsam bei großen Kantenlängen; nur ganzzahlige Längen Zunächst ganzzahlige Längen. Idee: Simuliere Breitensuche effizient 2 3 4 1 1
91
Graphalgorithmen Dijkstra‘s Algorithmus
Erste Idee: Ersetze Kantenlängen durch mehrfache Kanten Probleme: Langsam bei großen Kantenlängen; nur ganzzahlige Längen Zunächst ganzzahlige Längen. Idee: Simuliere Breitensuche effizient 2 3 4 1 1
92
Graphalgorithmen Dijkstra‘s Algorithmus
Erste Idee: Ersetze Kantenlängen durch mehrfache Kanten Probleme: Langsam bei großen Kantenlängen; nur ganzzahlige Längen Zunächst ganzzahlige Längen. Idee: Simuliere Breitensuche effizient Aufgabe: Bestimme für jeden Knoten den Zeitpunkt, zu dem er entdeckt wird 2 3 4 1 1
93
Graphalgorithmen Dijkstra‘s Algorithmus
Betrachte Breitensuche in der expandierten Version von G u,vV Wird ein Knoten u zum Zeitpunkt t (d.h. d[u]=t) entdeckt und ist Kante (u,v) mit Gewicht w(u,v) in G, so wird v spätestens zum Zeitpunkt t+w(u,v) entdeckt Unter Umständen wird v eher über einen anderen Knoten entdeckt t 3 v Wird zu Zeitpunkt ≤t+3 entdeckt u 1 1
94
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein a 2 b 3 4 1 1 2 6 c 7 d
95
Graphalgorithmen d[u]= für alle uV prio[u]= prio[s]=0
color[u]=weiß für alle uV BreitensucheSimulation(G,w,s) Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein a 2 b 3 4 s 1 1 2 6 c 7 d
96
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (s,0) a 2 b 3 4 s 1 2 1 6 7 c d
97
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (s,0) a 2 b 3 4 s 1 2 1 6 7 c d
98
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: a 2 b 3 4 s 1 2 1 u 6 7 c d
99
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: a 2 b 3 4 s 1 2 1 u 6 7 c d
100
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: a 2 b 3 4 s 1 2 1 u 6 7 c d
101
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: a 2 b 3 4 s 1 2 1 u 6 7 c d
102
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: a 2 b 3 v 4 s 1 2 1 u 6 c 7 d
103
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (a,3) a 2 b 3 v 4 s 1 2 1 u 6 c 7 d
104
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (a,3) a 2 b 3 4 s 1 1 2 u 6 v c 7 d
105
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (a,3), (c,6) a 2 b 3 4 s 1 1 2 u 6 v c 7 d
106
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (a,3), (c,6) a 2 b 3 4 s 1 2 1 u 6 7 c d
107
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (c,6) a 2 b 3 4 s 1 2 1 u 6 7 c d
108
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (c,6) a 2 b 3 4 s 1 2 1 u 6 7 c d
109
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (c,6) a 2 b 3 4 s 1 2 1 u 6 7 c d
110
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (c,6) 3 a 2 b 3 4 s 1 2 1 u 6 7 c d
111
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (c,4), (b,5), (c,6), (d,7) 3 a 2 b 3 4 s 1 2 1 u 6 7 c d
112
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (c,4), (b,5), (c,6), (d,7) 3 a 2 b 3 4 s 1 2 1 u 6 7 c d
113
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (b,5), (c,6), (d,7) 3 a 2 b 3 4 s 1 2 1 u 6 7 c d
114
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (b,5), (c,6), (d,7) 3 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
115
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (b,5), (a,6), (c,6), (d,7), (d,11) 3 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
116
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (a,6), (c,6), (d,7), (d,11) 3 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
117
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (a,6), (c,6), (d,7), (d,11) 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
118
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (a,6), (c,6), (d,6), (d,7), (d,11) 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
119
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (c,6), (d,6), (d,7), (d,11) 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
120
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (d,6), (d,7), (d,11) 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
121
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (d,7), (d,11) 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c d
122
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (d,7), (d,11) 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c 6 d
123
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: (d,11) 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c 6 d
124
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein Q: 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c 6 d
125
Graphalgorithmen BreitensucheSimulation(G,w,s)
Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein 3 5 a 2 b 3 4 s 1 2 1 u 6 7 4 c 6 d
126
Graphalgorithmen Beobachtung:
Sind mehrere Paare (u,p) in der Prioritätenschlange, so ist nur das mit der geringsten Priorität relevant BreitensucheSimulation(G,w,s) Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein
127
Graphalgorithmen Beobachtung: d-Werte und Prioritäten fast identisch
BreitensucheSimulation(G,w,s) Initialisiere Simulation Füge (s,prio[s]) mit Priorität prio[s] in Prioritätenschlange Q ein while Q do (u, prio[u]) ExtractMin(Q) if color[u]=weiß then color[u] schwarz d[u] prio[u] for each vAdj[u] do prio[v] d[u] + w(u,v) Füge (v,prio[v]) mit Priorität prio[v] in Q ein
128
Graphalgorithmen d[u]= für alle uV-{s} d[s]=0
color[u]=weiß für alle uV Dijkstra‘s Algorithmus(G,w,s) Initialisiere SSSP Q V[G] while Q do u ExtractMin(Q) if color[u]=weiß then color[u] schwarz for each vAdj[u] do if d[u] + w(u,v)< d[v] then d[v] d[u] + w(u,v) DecreaseKey(v,d[v])
129
Für alle schwarzen Knoten wurde die Distanz korrekt berechnet.
Graphalgorithmen Invariante: Für alle schwarzen Knoten wurde die Distanz korrekt berechnet. Dijkstra‘s Algorithmus(G,w,s) Initialisiere SSSP Q V[G] while Q do u ExtractMin(Q) if color[u]=weiß then color[u] schwarz for each vAdj[u] do if d[u] + w(u,v)< d[v] then d[v] d[u] + w(u,v) DecreaseKey(v,d[v])
130
Graphalgorithmen Prioritätenschlangen mit DecreaseKey
DecreaseKey(v,p): Erlaubt das Verringern der Priorität von Schlüssel v auf Wert p Einfachste Implementation Lösche v Füge v mit Priorität p in Prioritätenschlange ein
131
Graphalgorithmen Lemma 53 Beweis
Sei G=(V,E) ein gerichteter oder ungerichteter Graph und sei sV ein beliebiger Knoten. Dann gilt für jede Kante (u,v)E: d(s,v) d(s,u)+w(u,v) Beweis (Argumentation identisch zu Lemma 48) Ist u erreichbar von s, dann ist es auch v Der kürzeste Weg von s nach v kann nicht länger sein, als der kürzeste Weg von s nach u gefolgt von der Kante (u,v). Damit gilt die Ungleichung. Ist u nicht erreichbar von s, dann ist d(s,u)= und die Ungleichung gilt.
132
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis Zeile 9 ist die einzige Zeile, in der d-Werte geändert werden.
133
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis Zeile 9 ist die einzige Zeile, in der d-Werte geändert werden. Wir zeigen per Induktion über die Ausführungen von Zeile 9, dass Lemma 54 gilt. (I.A.) Vor der ersten Ausführung entsprechen die d-Werte den Werten direkt nach der Initialisierung. Für diese Werte gilt das Lemma.
134
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis Zeile 9 ist die einzige Zeile, in der d-Werte geändert werden. Wir zeigen per Induktion über die Ausführungen von Zeile 9, dass Lemma 54 gilt. (I.A.) Vor der ersten Ausführung entsprechen die d-Werte den Werten direkt nach der Initialisierung. Für diese Werte gilt das Lemma. (I.V.) Das Lemma gilt nach m Ausführungen von Zeile 9.
135
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis Zeile 9 ist die einzige Zeile, in der d-Werte geändert werden. Wir zeigen per Induktion über die Ausführungen von Zeile 9, dass Lemma 54 gilt. (I.A.) Vor der ersten Ausführung entsprechen die d-Werte den Werten direkt nach der Initialisierung. Für diese Werte gilt das Lemma. (I.V.) Das Lemma gilt nach m Ausführungen von Zeile 9. (I.S.) Betrachte (m+1)sten Ausführung. Nach (I.V.) gilt d[v] d(s,v) und d[u] d(s,u). Wir setzen in Zeile 9 d[v] auf d[u]+w(u,v).
136
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis Zeile 9 ist die einzige Zeile, in der d-Werte geändert werden. Wir zeigen per Induktion über die Ausführungen von Zeile 9, dass Lemma 54 gilt. (I.A.) Vor der ersten Ausführung entsprechen die d-Werte den Werten direkt nach der Initialisierung. Für diese Werte gilt das Lemma. (I.V.) Das Lemma gilt nach m Ausführungen von Zeile 9. (I.S.) Betrachte (m+1)sten Ausführung. Nach (I.V.) gilt d[v] d(s,v) und d[u] d(s,u). Wir setzen in Zeile 9 d[v] auf d[u]+w(u,v).
137
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten u: d[w] d(s,w). Beweis (I.S.) Betrachte (m+1)sten Ausführung. Nach (I.V.) gilt d[v] d(s,v) und d[u] d(s,u). Wir setzen in Zeile 9 d[v] auf d[u]+w(u,v).
138
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis (I.S.) Betrachte (m+1)sten Ausführung. Nach (I.V.) gilt d[v] d(s,v) und d[u] d(s,u). Wir setzen in Zeile 9 d[v] auf d[u]+w(u,v).
139
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis (I.S.) Betrachte (m+1)sten Ausführung. Nach (I.V.) gilt d[v] d(s,v) und d[u] d(s,u). Wir setzen in Zeile 9 d[v] auf min{d[v], d[u]+w(u,v)}. Es gilt d[v] = d[u] + w(u,v) d(s,u) + w(u,v) d(s,v) nach Lemma 53. Somit gilt auch hier das Lemma.
140
Graphalgorithmen Lemma 54 Beweis
Zu jedem Ausführungszeitpunkt von Dijkstra‘s Algorithmus gilt für jeden Knoten w: d[w] d(s,w). Beweis (I.S.) Betrachte (m+1)sten Ausführung. Nach (I.V.) gilt d[v] d(s,v) und d[u] d(s,u). Wir setzen in Zeile 9 d[v] auf min{d[v], d[u]+w(u,v)}. Es gilt d[v] = d[u] + w(u,v) d(s,u) + w(u,v) d(s,v) nach Lemma 53. Somit gilt auch hier das Lemma.
141
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt.
142
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV zum Zeitpunkt des Schwarzfärbens d[u] = d(s,u) gilt.
143
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV zum Zeitpunkt des Schwarzfärbens d[u] = d(s,u) gilt. Annahme: Es gibt einen Knoten u, für den zum Zeitpunkt des Schwarzfärbens d[u] d(s,u) gilt.
144
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV zum Zeitpunkt des Schwarzfärbens d[u] = d(s,u) gilt. Annahme: Es gibt einen Knoten u, für den zum Zeitpunkt des Schwarzfärbens d[u] d(s,u) gilt. Sei u der erste solche Knoten. Betrachte die Situation zu Beginn des Durchlaufs der while-Schleife, in dem u schwarz gefärbt wird.
145
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV zum Zeitpunkt des Schwarzfärbens d[u] = d(s,u) gilt. Annahme: Es gibt einen Knoten u, für den zum Zeitpunkt des Schwarzfärbens d[u] d(s,u) gilt. Sei u der erste solche Knoten. Betrachte die Situation zu Beginn des Durchlaufs der while-Schleife, in dem u schwarz gefärbt wird. Es gilt us, da s als erster Knoten schwarz gefärbt wird und zu diesem Zeitpunkt d[s]=0= d(s,s) gilt. (Widerspruch!)
146
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV zum Zeitpunkt des Schwarzfärbens d[u] = d(s,u) gilt. Annahme: Es gibt einen Knoten u, für den zum Zeitpunkt des Schwarzfärbens d[u] d(s,u) gilt. Sei u der erste solche Knoten. Betrachte die Situation zu Beginn des Durchlaufs der while-Schleife, in dem u schwarz gefärbt wird. Es gilt us, da s als erster Knoten schwarz gefärbt wird und zu diesem Zeitpunkt d[s]=0= d(s,s) gilt. (Widerspruch!)
147
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Es gibt Weg von s nach u, da ansonsten wegen Lemma 54 d[u]==d(s,u) gilt. (Widerspruch!)
148
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Es gibt Weg von s nach u, da ansonsten wegen Lemma 54 d[u]==d(s,u) gilt. (Widerspruch!) Sei nun y der erste weiße Knoten auf einem kürzesten Weg von s nach u und x sein Vorgänger. 2 4 4 3 y u s x
149
Graphalgorithmen Satz 55 Beweis
Wenn wir Dijkstra‘s Algorithmus auf einem gewichteten, gerichteten Graph G=(V,E) mit nichtnegativen Kantengewichten und Startknoten s ausführen, so gilt nach Terminierung d[u] = d(s,u) für alle Knoten uV. Beweis Es gibt Weg von s nach u, da ansonsten wegen Lemma 54 d[u]==d(s,u) gilt. (Widerspruch!) Sei nun y der erste weiße Knoten auf einem kürzesten Weg von s nach u und x sein Vorgänger. 2 4 4 3 y u s x
150
Graphalgorithmen Beweis Es gilt d[x]= d(s,u) nach Wahl von u. 2 4 4 3
y u s x
151
Graphalgorithmen Beweis Es gilt d[x]= d(s,u) nach Wahl von u.
In Zeile 9 wird nun d[y] auf min{d[y], d[x]+w(x,y)} gesetzt. Nach Lemma 52 ist der Weg von s nach y über x ein kürzester Weg (da er „Teilweg“ des kürzesten Weges von s nach u ist). 2 4 4 3 y u s x
152
Graphalgorithmen Beweis Es gilt d[x]= d(s,u) nach Wahl von u.
In Zeile 9 wird nun d[y] auf min{d[y], d[x]+w(x,y)} gesetzt. Nach Lemma 52 ist der Weg von s nach y über x ein kürzester Weg (da er „Teilweg“ des kürzesten Weges von s nach u ist). Somit ist d[x]+w(x,y)=d(s,y) und d[y] wird wegen Lemma 53 auf diesen Wert gesetzt. 2 4 4 3 y u s x
153
Graphalgorithmen Beweis Es gilt d[x]= d(s,u) nach Wahl von u.
In Zeile 9 wird nun d[y] auf min{d[y], d[x]+w(x,y)} gesetzt. Nach Lemma 52 ist der Weg von s nach y über x ein kürzester Weg (da er „Teilweg“ des kürzesten Weges von s nach u ist). Somit ist d[x]+w(x,y)=d(s,y) und d[y] wird wegen Lemma 53 auf diesen Wert gesetzt. Da die Kantengewichte nichtnegativ sind, folgt d(s,y) ≤ d(s,u) und somit nach Lemma 53 d[y]= d(s,y) ≤ d(s,u) ≤ d[u]. 2 4 4 3 y u s x
154
Graphalgorithmen Beweis Es gilt d[x]= d(s,u) nach Wahl von u.
In Zeile 9 wird nun d[y] auf min{d[y], d[x]+w(x,y)} gesetzt. Nach Lemma 52 ist der Weg von s nach y über x ein kürzester Weg (da er „Teilweg“ des kürzesten Weges von s nach u ist). Somit ist d[x]+w(x,y)=d(s,y) und d[y] wird wegen Lemma 53 auf diesen Wert gesetzt. Da die Kantengewichte nichtnegativ sind, folgt d(s,y) ≤ d(s,u) und somit nach Lemma 53 d[y]= d(s,y) ≤ d(s,u) ≤ d[u]. Da aber u von ExtractMin aus der Prioritätenschlange entfernt wurde, gilt d[u] ≤ d[y] und somit d[y]= d(s,y) = d(s,u) = d[u]. Widerspruch! 2 4 4 3 y u s x
155
Graphalgorithmen Beweis Es gilt d[x]= d(s,u) nach Wahl von u.
In Zeile 9 wird nun d[y] auf min{d[y], d[x]+w(x,y)} gesetzt. Nach Lemma 52 ist der Weg von s nach y über x ein kürzester Weg (da er „Teilweg“ des kürzesten Weges von s nach u ist). Somit ist d[x]+w(x,y)=d(s,y) und d[y] wird wegen Lemma 53 auf diesen Wert gesetzt. Da die Kantengewichte nichtnegativ sind, folgt d(s,y) ≤ d(s,u) und somit nach Lemma 53 d[y]= d(s,y) ≤ d(s,u) ≤ d[u]. Da aber u von ExtractMin aus der Prioritätenschlange entfernt wurde, gilt d[u] ≤ d[y] und somit d[y]= d(s,y) = d(s,u) = d[u]. Widerspruch! 2 4 4 3 y u s x
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.