Breitensuche – Überblick (1) Die Breitensuche ist ein Algorithmus, der die Grundlage vieler Graphenalgorithmen bildet. Ziel der Breitensuche ist es, bei einem Graphen G=(V,E) und einer Quelle s ∈ V alle Knoten v ∈ V zu finden, die von s aus erreichbar sind. Dabei ist ein Knoten v von s aus erreichbar, wenn es in G einen Pfad von s nach v gibt. Die Breitensuche berechnet auch für alle Knoten v den Abstand δ(s, v ) von s zu v. Dabei ist der Abstand von s zu v die minimale Anzahl von Kanten auf einem Pfad von s nach v. SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 1 Breitensuche - Überblick (2) Die Breitensuche bestimmt alle Knoten mit Abstand < k vor den Knoten mit Abstand k. Daher der Name Breitensuche. Breitensuche funktioniert in gleicher Weise bei gerichteten und ungerichteten Graphen. Nehmen an, dass Eingabegraph in AdjazenzlistenDarstellung gegeben ist. Sagen, dass ein Knoten entdeckt wird, wenn er das erste Mal bei der Breitensuche angetroffen wird. SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 2 Breitensuche - Überblick (3) Wird v entdeckt, während Adj[u] nach neuen Knoten durchsucht wird, so heißt u Vorgänger von v. Knoten sind entweder weiß, grau oder schwarz. Weiß sind alle noch nicht entdeckten Knoten. Grau sind alle entdeckten Knoten, deren Adjazenzliste noch nicht vollständig nach neuen Knoten durchsucht wurde. Schwarz sind alle anderen Knoten, d.h., schwarze Knoten wurden bereits entdeckt und ihre Adjazenzliste wurde vollständig durchsucht. SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 3 Pseudocode für Breitensuche BFS(G, s ) 1 for jeden Knoten u in V \ {s} BFS benutzt Queue für graue Knoten. 2 do color [u] ← WHITE 3 d[u] ← ∞ color [u] := Feld für Farbe von v. Initial 4 π[u] ← NIL WHITE. 5 color [s] ← GRAY 6 d[s] ← 0 d[u] := Feld für bislang berechneten 7 π[s] ← NIL Abstand zu s. Initial ∞ . 8 Q←{ } 9 Enqueue (Q, s ) π[u] := Feld für Vorgänger. Initial NIL. 10 while Q ≠ { } 11 do u ← Dequeue (Q ) 12 for v ∈ Adj[u] 13 do if color [v ] = WHITE 14 then color [v ] ← GRAY 15 d[v ] ← d[u] + 1 16 π[v ] ← u 17 Enqueue (Q, v ) 18 color [u] ← BLACK SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 4 Pseudocode für Breitensuche BFS(G, s ) 1 for jeden Knoten u in V \ {s} BFS benutzt Queue für graue Knoten. do color [u] ← WHITE 2 3 d[u] ← ∞ color [u] := Feld für Farbe von v. Initial 4 π[u] ← NIL WHITE. 5 color [s] ← GRAY 6 d[s] ← 0 d[u] := Feld für bislang berechneten 7 π[s] ← NIL Abstand zu s. Initial ∞ . 8 Q←{ } 9 Enqueue (Q, s ) π[u] := Feld für Vorgänger. Initial NIL. 10 while Q ≠ { } 11 do u ← Dequeue (Q ) 12 for v ∈ Adj[u] 13 do if color [v ] = WHITE 14 then color [v ] ← GRAY initialisiere BFS 15 d[v ] ← d[u] + 1 16 π[v ] ← u 17 Enqueue (Q, v ) 18 color [u] ← BLACK SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 5 Breitensuche - Beispiel d a BFS(G,s) 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: s Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 6 Breitensuche - Beispiel d a BFS(G,s) 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: s Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 7 Breitensuche - Beispiel d a BFS(G,s) 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 8 Breitensuche - Beispiel d v=a BFS(G,s) 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 9 Breitensuche - Beispiel d v=a BFS(G,s) 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 10 Breitensuche - Beispiel d v=a BFS(G,s) 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 11 Breitensuche - Beispiel d v=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 12 Breitensuche - Beispiel v=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 13 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u v=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 14 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u v=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 15 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u v=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 16 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u v=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 17 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u v=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a, b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 18 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a, b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 19 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: a, b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 20 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e c h g f i Q: b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 21 Breitensuche - Beispiel v=d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 c e h g f i Q: b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 22 Breitensuche - Beispiel v=d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 c e h g f i Q: b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 23 Breitensuche - Beispiel v=d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 c e h g f i Q: b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 24 Breitensuche - Beispiel v=d 2 u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 c e h g f i Q: b Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 25 Breitensuche - Beispiel v=d 2 u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 c e h g f i Q: b, d Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 26 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g f i Q: b, d Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 27 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g f i Q: b, d Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 28 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g f i Q: b, d Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 29 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: b, d Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 30 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: b, d, c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 31 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: b, d, c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 32 Breitensuche - Beispiel d u=a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: b, d, c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 33 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: d, c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 34 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: d, c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 35 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: d, c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 36 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) u=b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 v=c e h g 2 f i Q: d, c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 37 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 v=c e h g 2 f i Q: c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 38 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 c v=e h g 2 f i Q: c Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 39 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 v=e h 3 c g 2 f i Q: c, e Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 40 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e h 3 c g 2 v=f i Q: c, e Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 41 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e h 3 c g 2 v=f i 3 Q: c, e, f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 42 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e h 3 c g 2 f i 3 Q: c, e, f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 43 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e h 3 c g 2 f i 3 Q: c, e, f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 44 Breitensuche - Beispiel u=d 2 a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 e h 3 c g 2 f i 3 Q: c, e, f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 45 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 u=c g 2 f i 3 Q: e, f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 46 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 u=c g 2 f i 3 Q: e, f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 47 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 u=c g 2 f i 3 Q: e, f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 48 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 u=e h 3 c g 2 f i 3 Q: f Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 49 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 u=e h 3 c g 2 f 4 i 3 Q: f, g Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 50 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 u=e h 3 c g 2 f 4 i 3 Q: f, g Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 51 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c g 2 u=f 4 i 3 Q: g Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 52 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c g 2 u=f 4 i 4 3 Q: g, i Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 53 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c g 2 u=f 4 i 4 3 Q: g, i Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 54 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c u=g 2 f 4 i 4 3 Q: i Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 55 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c u=g 2 f 4 5 i 4 3 Q: i, h Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 56 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c u=g 2 f 4 5 i 4 3 Q: i, h Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 57 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c g 2 f 4 5 u=i 4 3 Q: h Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 58 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c g 2 f 4 5 u=i 4 3 Q: h Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 59 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e h 3 c g 2 f 4 5 u=i 4 3 Q: h Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 60 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e u=h 3 c g 2 f 4 5 i 4 3 Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 61 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e u=h 3 c g 2 f 4 5 i 4 3 Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 62 Breitensuche - Beispiel d a BFS(G,s) 1 1. „initialisiere BFS“ 2. while Q≠∅ do v=s 0 3. u ← Dequeue(Q) b 4. for v∈Adj[u] do 5. if color[v]=WHITE then 1 6. color[v] ← GRAY 7. d[v] ← d[u]+1; π[v] ← u 8. Enqueue(Q,v) 9. color[u] ← BLACK SS 2008 2 e u=h 3 c g 2 f 4 5 i 4 3 Q: Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 63 Breitensuche – Laufzeitanalyse (1) Zeilen 2-4 jeweils konstante Zeit. Werden V − 1 mal durchlaufen. Damit Zeit O ( V ). Zeilen 5-9 insgesamt konstante Zeit. Jeder Knoten wird nur einmal in Queue eingefügt und gelöscht. Schleife in Zeilen 12 -17 wird für jeden Eintrag v in Adjazenzlisten nur einmal durchlaufen. Zeilen 12-17 pro Durchlauf Zeit O (1). SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 64 Breitensuche – Laufzeitanalyse (3) Gesamtzeit für Durchläufe der Schleife in Zeilen 11-18 insgesamt O (E ). Denn Gesamtgröße aller Adjazenzlisten Θ(E ). Satz 14.1: Bei Eingabe von Graph G=(V,E) und Quelle s besitzt Algorithmus BFS Laufzeit O (V + E ) SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 65 Pseudocode für Breitensuche BFS(G, s ) 1 for jeden Knoten u in V \ {s} do color [u] ← WHITE 2 3 d[u] ← ∞ 4 π[u] ← NIL 5 color [s] ← GRAY 6 d[s] ← 0 7 π[s] ← NIL 8 Q←{ } 9 Enqueue (Q, s ) 10 while Q ≠ { } 11 do u ← Dequeue (Q ) 12 for v ∈ Adj[u] 13 do if color [v ] = WHITE 14 then color [v ] ← GRAY 15 d[v ] ← d[u] + 1 16 π[v ] ← u 17 Enqueue (Q, v ) 18 color [u] ← BLACK SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 66 Breitensuche – Erreichbarkeit, Kürzeste Pfade (1) Lemma 14.2: Sei G= (V,E) ein gerichteter oder ungerichteter Graph. Sei s ∈ V beliebig. Für jede Kante (u, v ) ∈ E gilt δ(s, v ) ≤ δ(s, u) + 1. Lemma 14.3: Sei G=(V,E) ein gerichteter oder ungerichteter Graph. Sei s ∈ V beliebig und s,G Eingabe für BFS. Nach Beendigung von BFS gilt für jeden Knoten v ∈ V d[v ] ≥ δ(s, v ). SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 67 Breitensuche – Erreichbarkeit, Kürzeste Pfade (2) Lemma 14.4: Die Queue Q enthalte zu einem beliebigen Zeitpunkt des Ablaufs von BFS die Knoten (v1,K, v r ), wobei v1 der Kopf head[Q] und v r das Ende tail[Q] sei. Dann gilt d[v r ] ≤ d[v1 ] + 1 und d[v i ] ≤ d[v i+1 ], i = 1,K, r - 1. Korollar 14.5: Knoten v i werde während des Ablaufs von BFS vor Knoten v j in die Queue Q eingefügt. Zum Zeitpunkt, an dem v j in die Queue Q eingefügt wird, gilt d[v i ] ≤ d[v j ]. SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 68 Breitensuche – Erreichbarkeit, Kürzeste Pfade (3) Satz 14.6: Sei G=(V,E) ein gerichteter oder ungerichteter Graph. Sei s ∈ V beliebig und s,G Eingabe für BFS. Nach Beendigung von BFS gilt für jeden Knoten v ∈ V d[v ] = δ(s, v ). Insbesondere sind die von s aus erreichbaren Knoten v die Knoten mit d[v ] < ∞ . Weiter ist für jeden von s aus erreichbaren Knoten v ≠ s ein kürzester Pfad von s zu v gegeben durch einen kürzesten Pfad von s zum Vorgänger π[v ] von v erweitert um die Kante (π[v ], v ). SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 69 Breitensuche Betrachten nach BFS mit Eingabe G,s den Graphen Gπ = (Vπ ,E π ) mit Vπ = {v ∈ V | π[v ] ≠ NIL} ∪ {s}. und E π := {(π[v ], v ) | v ∈ Vπ \ {s}}. Dann gilt Satz 14.7: Gπ = (Vπ ,E π ) ist ein Baum. Vπ enthält genau die von s aus erreichbaren Knoten in G. Für jeden Knoten v ∈ Vπ ist der eindeutige Pfad von s zu v in Gπ ein kürzester Pfad von s zu v in G. SS 2008 Datenstrukturen und Algorithmen 14. Elementare Graphalgorithmen 70