Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

Slides:



Advertisements
Ähnliche Präsentationen
Anzahl der ausgefüllten und eingesandten Fragebögen: 211
Advertisements

Berechne den optimalen (kürzesten, schnellsten) Weg
Single-Source Shortest Paths: SSSP
Programmierung 1 - Repetitorium WS 2002/2003 Programmierung 1 - Repetitorium Andreas Augustin und Marc Wagner Homepage:
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26-Graphenalgorithmen: Wiederholung und Übung) Prof. Th. Ottmann.
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil3.
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Telefonnummer.
1 JIM-Studie 2010 Jugend, Information, (Multi-)Media Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
= = = = 47 = 47 = 48 = =
Statistiken und Tabellen
WS Algorithmentheorie 13 - Kürzeste (billigste) Wege Prof. Dr. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (27 – Kürzeste Wege) Prof. Th. Ottmann.
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (21 – Kürzeste Wege) T. Lauer.
Rechneraufbau & Rechnerstrukturen, Folie 2.1 © W. Oberschelp, G. Vossen W. Oberschelp G. Vossen Kapitel 2.
Mh9S170Nr6 a. x1= –9; x2 = 1 b. x1= –4; x2 = 1 c. x1= 1; x2 = 2 d. leer e. x1= –15; x2 = 4,2 f. x1= –3,53; x2 = 1,28 g. leer h. x1= 0,2; x2 = 2 i. x1=
Vorlesung: 1 Betriebliche Informationssysteme 2003 Prof. Dr. G. Hellberg Studiengang Informatik FHDW Vorlesung: Betriebliche Informationssysteme Teil2.
Differentielles Paar UIN rds gm UIN
Prof. Dr. Bernhard Wasmayr
Studienverlauf im Ausländerstudium
Minimum Spanning Tree: MST
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
LS 2 / Informatik Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)
Prof. Dr. Bernhard Wasmayr VWL 2. Semester
AWA 2007 Natur und Umwelt Natürlich Leben
Prof. Dr. Günter Gerhardinger Soziale Arbeit mit Einzelnen und Familien Übersicht über die Lehrveranstaltung Grundlegende Bestimmungsfaktoren der Praxis.
20:00.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik II Vorlesung 1 SS 2001 Algorithmus von Dijkstra.
Zusatzfolien zu B-Bäumen
Effiziente Algorithmen
Eine Einführung in die CD-ROM
Dokumentation der Umfrage
Effiziente Algorithmen
für Weihnachten oder als Tischdekoration für das ganze Jahr
Wir üben die Malsätzchen
Syntaxanalyse Bottom-Up und LR(0)
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen Hartmut Klauck Universität Frankfurt SS
Effiziente Algorithmen
Information und Kommunikation
Überlagerungsgesetz - Uq – Uq –– uq ~m Uq –+ uq ~m V-105.
Addieren und Subtrahieren von Dezimalzahlen
Messung der Ionisierungsenergie von Wasserstoff
Aufgabensammlung Thermodynamik Frank-Michael Barth ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List of Figures.
Der Ablauf eines Clear Rex Klärzyklus
PROCAM Score Alter (Jahre)
Ertragsteuern, 5. Auflage Christiana Djanani, Gernot Brähler, Christian Lösel, Andreas Krenzin © UVK Verlagsgesellschaft mbH, Konstanz und München 2012.
Geometrische Aufgaben
Eine lllustration der Herausforderungen des Stromsystems der Zukunft
Symmetrische Blockchiffren DES – der Data Encryption Standard
Zahlentheorie und Zahlenspiele Hartmut Menzer, Ingo Althöfer ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List.
MINDREADER Ein magisch - interaktives Erlebnis mit ENZO PAOLO
1 (C)2006, Hermann Knoll, HTW Chur, FHO Quadratische Reste Definitionen: Quadratischer Rest Quadratwurzel Anwendungen.
Parkplatz-Orga Diese Version ist vom finale Version!
Folie Beispiel für eine Einzelauswertung der Gemeindedaten (fiktive Daten)
Technische Frage Technische Frage Bitte löse die folgende Gleichung:
Unternehmensbewertung Thomas Hering ISBN: © 2014 Oldenbourg Wissenschaftsverlag GmbH Abbildungsübersicht / List of Figures Tabellenübersicht.
Forschungsprojekt Statistik 2013 „Jugend zählt“ – Folie 1 Statistik 2013 „Jugend zählt“: Daten zur Arbeit mit Kindern und Jugendlichen.
Folie Einzelauswertung der Gemeindedaten
Datum:17. Dezember 2014 Thema:IFRS Update zum Jahresende – die Neuerungen im Überblick Referent:Eberhard Grötzner, EMA ® Anlass:12. Arbeitskreis Internationale.
1 Medienpädagogischer Forschungsverbund Südwest KIM-Studie 2014 Landesanstalt für Kommunikation Baden-Württemberg (LFK) Landeszentrale für Medien und Kommunikation.
 Präsentation transkript:

Datenstrukturen, Algorithmen und Programmierung 2 (DAP2)

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

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

Graphalgorithmen Beispiel (mögl. Zustand bei einer Breitensuche) s

Graphalgorithmen BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz

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 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz

Graphalgorithmen Für jeden Knoten u: color[u] = weiß d[u] =  p[u] = nil BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz

Graphalgorithmen Für jeden Knoten u: color[u] = weiß d[u] =  p[u] = nil BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz Für Knoten s: color[s] = grau d[s]=0 p[s]=nil s wird in Schlange Q eingefügt

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz c g s b f i Q: s

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz c g s u b f i Q: s

Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz c g s u b f i Q: s

Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz c g s u b f i Q: s

Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz c g s u b f i Q: s

Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u b f i Q: s

Graphalgorithmen d v=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u b f i Q: s, a

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u v=b f i Q: s, a

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u v=b f i Q: s, a

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u v=b f i Q: s, a

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u v=b f i 1 Q: s, a

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u v=b f i 1 Q: s, a, b

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u b f i 1 Q: a, b

Graphalgorithmen d a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u b f i 1 Q: a, b

Graphalgorithmen d u=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s u b f i 1 Q: a, b

Graphalgorithmen d u=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 v=c g s u b f i 1 Q: a, b

Graphalgorithmen d u=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 v=c g s 2 u b f i 1 Q: a, b, c

Graphalgorithmen v=d u=a e h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u b f i 1 Q: a, b, c

Graphalgorithmen v=d u=a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u b f i 1 Q: a, b, c, d

Graphalgorithmen v=d u=a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u b f i 1 Q: b, c, d

Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u u=b f i 1 Q: b, c, d

Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u u=b f i 1 Q: b, c, d

Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u b f i 1 Q: c, d

Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 u=c g s 2 u b f i 1 Q: c, d

Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 u=c g s 2 u b f i 1 3 Q: c, d, f

Graphalgorithmen d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u b f i 1 3 Q: d, f

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 c g s 2 u b f i 1 3 Q: d, f

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c g s 2 u b f i 1 3 Q: d, f, e

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c g s 2 u b f i 1 3 Q: f, e

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c g s 2 u b u=f i 1 3 Q: f, e

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c g s 2 u 4 b u=f i 1 3 4 Q: f, e, g, i

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c g s 2 u 4 b u=f i 1 3 4 Q: e, g, i

Graphalgorithmen u=d a u=e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c g s 2 u 4 b f i 1 3 4 Q: g, i

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c 5 u=g s 2 u 4 b f i 1 3 4 Q: i, h

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c 5 g s 2 u 4 b f u=i 1 3 4 Q: h

Graphalgorithmen u=d a e 2 u=h BFS(G,s) 1. „initialisiere BFS“ 3 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c 5 g s 2 u 4 b f i 1 3 4 Q:

Graphalgorithmen u=d a e 2 h BFS(G,s) 1. „initialisiere BFS“ 3 2. while Q do 3. u  head[Q] 4. for each vAdj[u] do 5. if color[v]=weiß then 6. color[v]  grau 7. d[v]  d[u]+1; p[v]  u 8. enqueue(Q,v) 9. dequeue(Q) 10. color[u]  schwarz 1 3 c 5 g s 2 u 4 b f i 1 3 4

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|)

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

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.

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

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

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

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

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

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.

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

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) = 

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

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

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

Graphalgorithmen Beweis Fall 2 (v erreichbar von s):

Graphalgorithmen Beweis Fall 2 (v erreichbar von s): Sei V = {vV : d(s,v) = k} k

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

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

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

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.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Graphalgorithmen Beweis Abschließend beobachten wir, dass wenn vV ist, dann ist p[v] in V k k-1

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

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

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|)

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

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

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

Graphalgorithmen Dijkstra‘s Algorithmus Graph in Adjazenzlistendarstellung Keine negativen Kantenlängen Überträgt Idee der Breitensuche auf gewichtete Graphen

Graphalgorithmen Dijkstra‘s Algorithmus Graph in Adjazenzlistendarstellung Keine negativen Kantenlängen Überträgt Idee der Breitensuche auf gewichtete Graphen 2 4 3 1 1

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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])

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])

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

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.

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.

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.

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.

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).

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).

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).

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).

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.

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.

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.

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.

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.

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.

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!)

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!)

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!)

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

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

Graphalgorithmen Beweis Es gilt d[x]= d(s,u) nach Wahl von u. 2 4 4 3 y u s x

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

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

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

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

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