Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Ähnliche Präsentationen


Präsentation zum Thema: "Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)"—  Präsentation transkript:

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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 sV 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 sV. 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 vV-{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 sV. 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 sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, 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 sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, 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 sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, 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 sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, 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 sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, 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 sV Startknoten der Breitensuche. Dann entdeckt die Breitensuche alle Knoten vV, die von s aus erreichbar sind und nach Terminierung gilt d[v]=d(s,v) für alle vV. Außerdem gilt für jeden von s erreichbaren Knoten vs, 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 = {vV : d(s,v) = k} k

62 Graphalgorithmen Beweis Fall 2 (v erreichbar von s):
Sei V = {vV : d(s,v) = k} Wir zeigen per Induktion über k: Es gibt genau einen Zeitpunkt, zu dem jeder Knoten vV (a) grau gefärbt wird (b) d[v]=k gesetzt wird (c) wenn vs, dann p[v] auf u gesetzt wird für ein uV (d) v in Schlange Q eingefügt wird k k k-1

63 Graphalgorithmen Beweis Fall 2 (v erreichbar von s):
Sei V = {vV : d(s,v) = k} Wir zeigen per Induktion über k: Es gibt genau einen Zeitpunkt, zu dem jeder Knoten vV (a) grau gefärbt wird (b) d[v]=k gesetzt wird (c) wenn vs, dann p[v] auf u gesetzt wird für ein uV (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 = {vV : d(s,v) = k} Wir zeigen per Induktion über k: Es gibt genau einen Zeitpunkt, zu dem jeder Knoten vV (a) grau gefärbt wird (b) d[v]=k gesetzt wird (c) wenn vs, dann p[v] auf u gesetzt wird für ein uV (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 vV , 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 vV , 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 uV 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 uV 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 uV 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 uV 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 uV 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 uV 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 uV 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 uV 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 vV ist, dann ist p[v] in V k k-1

81 Graphalgorithmen Beweis
Abschließend beobachten wir, dass wenn vV 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 vV 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: ER ; 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,vV 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 vAdj[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 uV prio[u]= prio[s]=0
color[u]=weiß für alle uV 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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 vAdj[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 uV-{s} d[s]=0
color[u]=weiß für alle uV 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 vAdj[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 vAdj[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 sV 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 uV. 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 uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV 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 uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV 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 uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV 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 uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV 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 us, 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 uV. Beweis Jeder Knoten wird im Verlauf des Algorithmus schwarz gefärbt. Wir zeigen per Widerspruchsbeweis, dass für jeden Knoten uV 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 us, 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 uV. 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 uV. 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 uV. 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


Herunterladen ppt "Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)"

Ähnliche Präsentationen


Google-Anzeigen