Graphentheorie: Grundbegriffe – 1 Graphen (ungerichtet) Algorithmen und Datenstrukturen 14. Vorlesung 1 2 6 3 Karl-Heinz Niggl 5 4. Juli 2006 4 Digraph / gerichteter Graph: 1 2 6 3 5 FG KTuEA, TU Ilmenau AuD – 07.4.2006 FG KTuEA, TU Ilmenau Graphentheorie: Grundbegriffe – 2 Städte und Verbindungswege Gatter und Leitungen auf einem Chip Systemkomponenten und Verbindungen Zustände eines Systems und Übergänge (Daten-)Flussdiagramme für Programmentwurf(-analyse) Vorgänge mit Unverträglichkeitsbeziehungen Transportsysteme: Stationen, Verbindungskapazitäten Soziale Beziehungen . . . AuD – 07.4.2006 1 Def. Ein gerichteter Graph (englisch: directed graph), kurz Digraph, ist ein Paar G := (V, E), wobei gilt: • V ist eine endliche Menge, • E ⊆ V × V = {(u, v) | u, v ∈ V }. Die Elemente von V heißen Knoten (node oder vertex). Die Elemente von E heißen Kanten (edge oder arc). v Darstellung von Knoten v: Darstellung von Kanten e = (u, v): Hier: Nur Algorithmen zum Umgang mit den Strukturen. FG KTuEA, TU Ilmenau AuD – 07.4.2006 Graphentheorie: Grundbegriffe – 3 Graphen und Digraphen sind eine in der Informatik grundlegende (Daten-)Struktur. Graphen modellieren z.B. • • • • • • • • 4 2 FG KTuEA, TU Ilmenau AuD – 07.4.2006 u v e 3 Graphentheorie: Grundbegriffe – 4 Graphentheorie: Grundbegriffe – 5 Def. Sei G = (V, E) ein Digraph, e = (u, v) ∈ E eine Kante. Def. Sei G = (V, E) ein Graph. Der Ingrad (indegree) eines Knotens v ∈ V ist die Anzahl in v eingehenden Kanten: u v e • u bzw. v heißen inzident zu e (u, v liegen auf e). v indeg(v) := |pred(v)| ... ... • u und v heißen adjazent (benachbart). • v heißt Nachfolger von u, suc(u) := {v ∈ V | (u, v) ∈ E} die Menge der Nachfolger von u. • u heißt Vorgänger von v, pred(v) := {u ∈ V | (u, v) ∈ E} die Menge der Vorgänger von u. Der Ausgrad (outdegree) von v ist #(ausgehenden Kanten): v outdeg(v) := |suc(v)| ... ... • Eine Kante (v, v) heißt Schleife (loop). v FG KTuEA, TU Ilmenau AuD – 07.4.2006 4 Graphentheorie: Grundbegriffe – 6 Äquivalent: Kantenfolge (v0, v1), (v1, v2), . . . , (vk−1, vk ) v∈V 1 4 6 1 2 3 6 7 2 5 3 9 8 Wiederholungen sind nicht verboten! Bsp. (9, 9), (1, 3, 1, 2, 3, 4, 6, 9, 9, 9), (5). 9 8 • Die Länge eines Weges (v0, v1, . . . , vk ) ist k, die Kantenzahl. Insbesondere hat ein Weg (v) die Länge 0. Summe der Ingrade: 1 + 1 + 2 + 2 + 1 + 1 + 1 + 2 + 2 = 13 AuD – 07.4.2006 4 Bsp. (1, 3, 5, 4, 6) 7 Bsp. |E| = 13 5 5 Def. Sei G = (V, E) ein Digraph. • Ein Weg (auch Pfad) in G ist eine Folge (v0, v1, . . . , vk ) von Knoten in G mit (vi−1, vi) ∈ E für 1 ≤ i ≤ k. Beweis. : In beiden Summen wird jede Kante genau einmal gezählt. FG KTuEA, TU Ilmenau AuD – 07.4.2006 Graphentheorie: Grundbegriffe – 7 Lemma (Ingrade/Ausgrade und Kantenzahl). Für einen Graphen G = (V, E) gilt: X X indeg(v) = outdeg(v) = |E| v∈V FG KTuEA, TU Ilmenau 6 FG KTuEA, TU Ilmenau AuD – 07.4.2006 7 Graphentheorie: Grundbegriffe – 8 Graphentheorie: Grundbegriffe – 9 Def. Ein Weg (v0, v1, . . . , vk ) aus paarweise verschiedenen Knoten in einem Digraphen G heißt einfach (simple). Lemma (Partielle Ordnung, Einfachheit: Digraph G). 1. Die Relation G ist reflexiv und transitiv, d.h. stets gilt: v G v und u G v ∧ v G w =⇒ u G w. 2. Ist G azyklisch, so ist G eine partielle Ordnung auf V , d.h. neben 1. ist G auch antisymmetrisch, d.h. es gilt: u G v und v G u =⇒ u = v. 3. Wenn v G w gilt, dann existiert in G auch ein einfacher Weg von v nach w. 4 1 Bsp. (1, 3, 5, 4, 6) 6 5 2 3 7 9 8 Def. Sei G = (V, E) ein Digraph. Knoten v, w ∈ V heißen wegverbunden in G, in Zeichen v G w, falls in G ein Weg (v, v1, . . . , vk−1, w) existiert. Bsp. 1 G 1, 1 G 6, 1 G 9 G heißt dag (directed acyclic graph), falls G azyklisch ist, d.h. G besitzt keinen Kreis, d.h. einen Weg (v0, v1, . . . , vk−1, v0). Beweis. Zu 1. Offenbar ist (v) ein Weg von v nach v. Sind (v0, . . . , vk ) und (vk , w1, . . . , wl) Wege in G, so auch (v0, . . . , vk , w1, . . . , wl). FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau AuD – 07.4.2006 8 Graphentheorie: Grundbegriffe – 10 AuD – 07.4.2006 9 Graphentheorie: Grundbegriffe – 11 3 1 5 Zu 2. Folgt aus 1. und der Kreisfreiheit von G. 7 Bsp. Zu 3. Idee: Entferne alle vorhandenen Kreise. 1: 2: 3: 2 procedure delete-circles-in-path( p := (v0, . . . , vk )) while p enthält vi = vj mit 0 ≤ i < j < Länge(p) do p := (v0, . . . , vi, vj+1, . . . , vk ) 6 4 (2, 1, 3, 2, 2, 3, 5, 4, 1, 3, 4 , 6, 2, 3, 4, 3, 5) → (2, 1, 3, 2, 2,3,5,4,6,2 , 3, 4, 3, 5) → (2, 1, 3, 2,2 , 3, 4, 3, 5) Korrektheit: Kommt in p = (v0, . . . , vk ) ein Knoten vi = vj , 0 ≤ i < j ≤ k zweimal vor, so ist (v0, . . . , vi, vj+1, . . . , vk ) immer noch ein Weg in G von v0 nach vk . → (2, 1, 3,2,3,4,3 , 5) → (2, 1, 3, 5) FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau 4: return p AuD – 07.4.2006 10 Bem. Andere Auswahlfolge liefert den einfachen Weg (2, 3, 5). AuD – 07.4.2006 11 Graphentheorie: Grundbegriffe – 12 Graphentheorie: Grundbegriffe – 13 Def. Ein Kreis (v0, v1, . . . , vk−1, v0) in einem Digraphen G heißt einfach, falls v1, . . . , vk−1 paarweise verschieden sind. Beweis. Wie bei der Konstruktion von einfachen Wegen, nur mit verschärfter Suchbedingung: vi = vj mit 0 ≤ i < j < k. Bsp. (1, 3, 5, 4, 1), (6, 7, 4, 6), (2, 2) sind einfache Kreise. 5 2 2 6 6 4 4 Bem. Kreise, die sich nur im Anfangspunkt unterscheiden, werden oft identifiziert. Lemma (Existenz einfacher Kreise bei Digraphen G). In einem Digraph G besitzt jeder Kreis (v0, v1, . . . , vk−1, v0) auch einen einfachen Kreis (v0, vi1 , . . . , vil , v0). FG KTuEA, TU Ilmenau 7 Bsp. 7 5 3 1 3 1 AuD – 07.4.2006 12 Graphentheorie: Grundbegriffe – 14 (3, 4, 6, 2, 2, 3, 5, 4,1,3,5,4 , 6, 7, 4, 3) → 3,4,6,2,2,3 , 5, 4, 6, 7, 4, 3) → (3, 5, 4,6,7,4 , 3) → (3, 5, 4, 3) Alternative: (3, 4,6,2,2,3,5,4,1,3,5,4,6,7,4 , 3) → (3, 4, 3) FG KTuEA, TU Ilmenau AuD – 07.4.2006 13 Graphentheorie: Grundbegriffe – 15 Def. Ein Graph (ungerichtet) ist ein Paar G := (V, E) mit: • V ist eine endliche Menge, • E ⊆ [V ]2 := {{u, v} | u, v ∈ V, u 6= v}. Bsp. Die Elemente von V heißen Knoten (node oder vertex). Die Elemente von E heißen Kanten (edge). Darstellung von Kanten e = (u, v): Def. Sei G = (V, E) ein Graph und e = (u, v) ∈ E eine Kante. v Darstellung von Knoten v: u u v e Konvention: Kanten {u, v} = {v, u} werden als Paare (u, v) geschrieben. Nur: Bei Kanten von (ungerichteten) Graphen gilt: (u, v) = (v, u) FG KTuEA, TU Ilmenau AuD – 07.4.2006 v e 14 • u bzw. v heißen inzident zu e (u, v liegen auf e). • u und v heißen adjazent (benachbart). • u heißt Nachbar von v und v heißt Nachbar von u. FG KTuEA, TU Ilmenau AuD – 07.4.2006 15 Graphentheorie: Grundbegriffe – 16 Graphentheorie: Grundbegriffe – 17 Def. Sei G ein Graph. Der Grad (degree) eines Knoten v, in Zeichen deg(v), ist die Anzahl seiner Nachbarn: 1 5 7 10 11 Bsp. Im Graphen deg(v) := |{u ∈ V | (u, v) ∈ E}| 2 4 6 8 9 ist die Anzahl der Kanten 12 und die Summe der Grade ergibt: 1 + 2 + 4 + 4 + 2 + 3 + 2 + 2 + 2 + 2 + 0 = 24 Knoten v mit Grad 0, d.h. ohne Nachbarn, heißen isoliert. Bsp. 3 Def. Sei G = (V, E) ein Graph. • Die Begriffe Weg (Pfad) in G, Länge und Einfachheit eines Weges in G sind wie bei Digraphen definiert. v deg(v) = 6 Lemma (Handshaking). Für Graphen G = (V, E) gilt: P v∈V deg(v) = 2·|E| Neu. Ist (v0, v1 . . . , vk ) ein Weg, so auch (vk , vk−1, . . . , v0). Beweis. Kante (u, v) trägt 1 zu deg(u) und 1 zu deg(v) bei. • Sind u, v ∈ V durch einen Weg in G verbunden, so schreiben wir u ∼G v (oder u ∼ v, falls G im Kontext bekannt ist). FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau AuD – 07.4.2006 16 Graphentheorie: Grundbegriffe – 18 Bem. Es gilt: u ∈ [v]∼G =⇒ [u]∼G = [v]∼G Mittels Äquivalenzklassen werden diejenigen Elemente einer Menge identifiziert, die dasgleiche tun ( Repräsentant“). ” In [v]∼G ist jedes u mit jedem anderen w wegverbunden. [v]∼G heißt auch Zusammenhangskomponente von G. Liest man u ∼G v als u mag v, so ist [v]∼G eine Clique. Lemma (Äquivalenzrelation). Die Relation ∼G ist eine Äquivalenzrelation, d.h. es gilt: Reflexivität: v ∼G v Symmetrie: u ∼G v =⇒ v ∼G u Transitivität: u ∼G v ∧ v ∼G w =⇒ u ∼G w Bew. Symmetrie folgt aus Neu, Rest wie bei Digraphen. Def. Die Menge [v]∼G := {u | u ∼G v} heißt Äquivalenzklasse von G mit Repräsentant v. FG KTuEA, TU Ilmenau AuD – 07.4.2006 17 Graphentheorie: Grundbegriffe – 19 Lemma (Existenz einfacher Wege). u ∼G v =⇒ ∃ einfacher Weg von u nach v. Bew. Wie bei Digraphen. AuD – 07.4.2006 18 Bem. Die Menge der Zusammenhangskomponenten bildet eine Partition von V , d.h. es gilt: • [v]∼G 6= ∅ • [u]∼G ∩ [v]∼G 6= ∅ =⇒ [u]∼G = [v]∼G S [v]∼G • V= v∈V FG KTuEA, TU Ilmenau AuD – 07.4.2006 19 Graphentheorie: Grundbegriffe – 20 Bsp. Graph mit 4 ZHKn 2 3 4 6 5 7 Graphentheorie: Grundbegriffe – 21 8 Def. Ein Weg (v0, v1, . . . , vk ) in einem Graphen G heißt Kreis, falls gilt: k ≥ 3, v0 = vk und (∀i ∈ {1, . . . , k −1} : vi−1 6= vi+1) sowie vk−1 6= v1. 1 10 1 9 9 7 6 2 3 5 8 4 10 v Kreis: (6,7,8,5,6,1,2,9,10,3,2,1,6) Bsp. Graph mit 7 ZHKn D.h., ein Hin und her“ (. . . , u, v, u, . . . ) über dieselbe Kante ” (u, v) = (v, u) ist nicht erlaubt. Daher muß vk−1 6= v1 gelten. Sonstige Knoten- oder Kantenwiederholungen sind erlaubt. FG KTuEA, TU Ilmenau AuD – 07.4.2006 20 FG KTuEA, TU Ilmenau AuD – 07.4.2006 Graphentheorie: Grundbegriffe – 22 Graphentheorie: Grundbegriffe – 23 Def. Ein Weg (v0, v1, . . . , vk ) in einem Graphen G heißt einfacher Kreis, falls gilt: k ≥ 3, v0 = vk und v0, v1, . . . , vk−1 sind paarweise verschieden. Def. Sei G = (V, E) ein Graph. • G heißt azyklisch (kreisfrei), falls er keinen Kreis besitzt. 1 7 6 21 Bsp. 9 2 Bsp. 3 5 8 4 • G heißt freier Baum, kurz Baum, falls er kreisfrei und zusammenhängend ist. 10 Einfache Kreise: (6,1,2,9,10,3,4,5,6) und (1,6,5,4,3,10,9,2,1) Lemma (Existenz einfacher Kreise). Besitzt ein Graph einen Kreis, so auch einen einfachen Kreis. Bsp. Beweis. Übung! FG KTuEA, TU Ilmenau AuD – 07.4.2006 22 FG KTuEA, TU Ilmenau AuD – 07.4.2006 23 Graphentheorie: Grundbegriffe – 24 Datenstrukturen für Digraphen/Graphen – 1 Lemma (Charakterisierung freier Bäume). Für Graph G = (V, E) sind folgende Aussagen äquivalent: 1. G ist ein freier Baum. 2. G ist kreisfrei und |E| ≥ |V |−1. 3. G ist zusammenhängend und |E| ≤ |V |−1. 4. Je zwei Knoten u, v sind durch genau einen einfachen Weg verbunden. 5. G ist maximal kreisfrei, d.h. G ist kreisfrei und jede neue Kante erzeugt einen Kreis. 6. G ist minimal zusammenhängend (analog definiert). Beweis. Wird für Interessierte auf die Webseite gelegt. FG KTuEA, TU Ilmenau AuD – 07.4.2006 24 Datenstrukturen für Digraphen/Graphen – 2 MG = (aij )1≤i,j≤n mit ( 1, falls (i, j) ∈ E aij := 0, sonst. In den meisten Programmiersprachen: Matrizen sind als 2-dimensionale Arrays A[1 . . n][1 . . n] realisierbar, mit Einträgen aus {0, 1} oder vom Typ boolean. B 1 2 5 4 E 3 D C 2) Dann stelle V z.B. durch ein Array dar: nodes[1..n] of nodetype wobei sich vi in nodes[i] befindet und i.a. noch mehr: Attribute der Knoten wie Markierungen oder Beschriftungen. Also: Knoten sind i.a. mit 1, 2, . . . , n numeriert und ein nodesArray ist vorhanden. Dann ist (i, j) Kante ⇐⇒ (vi, vj ) ∈ E. FG KTuEA, TU Ilmenau AuD – 07.4.2006 25 Beispiel-Digraph: 1 2 3 4 1 0 1 0 1 2 0 0 1 0 3 1 0 1 0 4 1 1 0 0 5 1 0 0 0 6 1 0 0 1 5 0 1 1 0 0 0 6 0 1 1 0 1 0 1 = b 2 6 3 5 4 Dann gilt: Anzahl der 1en in Zeile i = Ausgrad von Knoten i Anzahl der 1en in Spalte j = Ingrad von Knoten j Fazit: Zugriff (Lesen, Schreiben) auf aij geht in Zeit O(1). AuD – 07.4.2006 A Bsp. nodes: 1: A 2: B 3: E 4: D 5: C Datenstrukturen für Digraphen/Graphen – 3 Def. Sei G = (V, E) ein Graph/Digraph mit V = {1, . . . , n}. Die Adjazenzmatrix von G die n × n-Matrix FG KTuEA, TU Ilmenau Sei G = (V, E) beliebiger Graph oder Digraph. 1) Ordne die n = |V | Knoten beliebig an: V = {v1, . . . , vn} 26 FG KTuEA, TU Ilmenau AuD – 07.4.2006 27 Datenstrukturen für Digraphen/Graphen – 4 Beispiel-Graph: 1 2 3 4 1 0 1 1 1 2 1 0 1 0 3 1 1 0 0 4 1 0 0 0 5 0 1 1 1 6 0 1 1 0 5 0 1 1 1 0 1 6 0 1 1 0 1 0 1 Datenstrukturen für Digraphen/Graphen – 5 Bem. Stellt man Graphen/Digraphen mit n Knoten als Adjazenzmatrix dar, so gilt: 2 1. Speicherplatzbedarf ist Θ(n2). = b 6 2. Zugriff (Lesen/Schreiben) auf aij geht in Zeit O(1). 3 5 3. Die Ermittlung aller Nachfolger, Vorgänger oder Nachbarn eines Knotens erfordert Zeit Θ(n). 4 (Zeilen/Spaltendurchlauf; Reihenfolge: 1, . . . , n) 4. Der Speicherplatzbedarf ist im Vergleich zur vorhandenen Information relativ hoch, falls |E| ≪ n2 (dünn besetzte Graphen). Bem. Die Adjazenzmatrix eines Graphen ist symmetrisch! Bem. #(1en in Zeile/Spalte i) = Grad von Knoten i. FG KTuEA, TU Ilmenau AuD – 07.4.2006 28 FG KTuEA, TU Ilmenau AuD – 07.4.2006 29 Datenstrukturen für Digraphen/Graphen – 6 Datenstrukturen für Digraphen/Graphen – 7 Erweiterung: Sind die Kanten mit Objekten aus einer (Markierungs-)Menge M beschriftet, benutzt manstatt des Booleschen Arrays ein Array mit Einträgen aus M ∪ {−} ( −“ ” bedeutet nicht vorhanden“): ” 2 1 1 2 3 4 5 6 a 1 − a − c − − f h a 2 − − f − a d d c 3 b 6 3 a − d − b c = f c b a d e a 4 e a − − − − d c 5 f − − − − c 4 6 h − − d − − 5 Bem. Bei Zahleneinträgen wird für − oft 0 oder ∞ verwendet, je nach Anwendungsart. FG KTuEA, TU Ilmenau AuD – 07.4.2006 30 Bsp. für mögliche Beschriftungen: anwendungsabhängig. Kantenlängen l(i, j) ∈ R Kantengewicht w(i, j) ∈ R (Transport-)Kapazitäten c(i, j) ∈ R+ FG KTuEA, TU Ilmenau AuD – 07.4.2006 31 Datenstrukturen für Digraphen/Graphen – 8 Datenstrukturen für Digraphen/Graphen – 9 Def. Bei der Adjazenzlistendarstellung von Digraphen oder Graphen existiert für jeden Knoten i eine Liste Li der Bem. 1) Die Länge der Liste Li ist outdeg(i) bei Digraphen und deg(i) bei Graphen. • Nachfolger von i im Fall von Digraphen • Nachbarn von i im Fall von Graphen. 2) Bei Graphen gilt: Eintrag i kommt in Lj vor ⇐⇒ Eintrag j kommt in Li vor. nodes: Bsp. FG KTuEA, TU Ilmenau 1: 2 4 2: 5 6 3 3: 5 3 1 4: 1 2 5: 4 1 6: 1 4 3) Durch die Reihenfolge der Einträge in Liste Li sind die Nachbarn/Nachfolger von Knoten i immer implizit angeordnet. 6 Erweiterungen: a) Knotenbeschriftungen befinden sich im nodes-Array. 6 AuD – 07.4.2006 b) Kantenbeschriftungen speichert man in zusätzlichen Attributen in den Listenelementen der Adjazenzlisten. 32 FG KTuEA, TU Ilmenau AuD – 07.4.2006 33 Breitensuche in Digraphen – 1 Datenstrukturen für Digraphen/Graphen – 10 2. Das Durchlaufen aller Kanten benötigt Zeit O(|V |+|E|). 1. Breitensuche von einem Knoten v0 aus: Finde alle Knoten v, die von v0 aus erreichbar sind. Numeriere die entdeckten Knoten durch. Bestimme für jeden von v0 aus erreichbaren Knoten v einen kürzesten Weg von v0 nach v, Abstand von v0 zu v. 3. Das Durchlaufen der Adjazenzliste zu Knoten i benötigt Zeit O(deg(i)) bei Graphen bzw. O(outdeg(i)) bei Digraphen. Bsp. Die von v0 = 1 aus erreichbaren Knoten, mit kürzesten Wegen von v0 = 1 aus, und Nummern: Bem. Werden Graphen/Digraphen G = (V, E) mittels Adjazenzlisten dargestellt, dann gilt: 1. Der Speicherplatzbedarf ist O(|V |+|E|). 1 1 4 1 1 2 2 FG KTuEA, TU Ilmenau AuD – 07.4.2006 34 1 3 1 2 3 2 6 1 2 1 7 FG KTuEA, TU Ilmenau 1 2 8 1 4 2 5 3 2 1 AuD – 07.4.2006 9 10 2 3 2 7→ 4 6 5 3 6 8 7 35 Breitensuche in Digraphen – 2 Breitensuche in Digraphen – 3 Ansatz: Knoten werden entdeckt (numeriert und als ent” deckt“ markiert) und später bearbeitet (die Menge der Nachfolger wird durchgegangen, um neue Knoten zu entdecken). Die Reihenfolge der Bearbeitung wird über eine anfänglich leere Queue Q organisiert. Information an Knoten v (gespeichert im nodes-Array): Nummer bfs num(v) Level level(v) (Abstand von v0 nach v) Vorgänger pred(v) (von v auf kürzestem Weg v0 v) Globale Information: Zähler bfs count Initialisierung: bfs count ← 0; alle bfs num(v) ← 0. FG KTuEA, TU Ilmenau AuD – 07.4.2006 36 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: procedure bfs(v0) ⊲ Breitensuche von v0 aus bfs count ← bfs count+1 bfs num(v0) ← bfs count level(v0) ← 0 pred(v0) ← v0 ⊲ Weg der Länge 0 enqueue(Q, v) ⊲ erstes Element in Warteschlange while Q 6= NIL do v ← first(Q) dequeue(Q) ⊲ nun bearbeite v foreach w ∈ suc(v) (Adjazenzliste!) do if bfs num(w) = 0 then ⊲ w wird entdeckt! bfs count ← bfs count+1 bfs num(w) ← bfs count level(w) ← level(v)+1 pred(w) ← v ⊲ w von v aus erreicht enqueue(Q, w) FG KTuEA, TU Ilmenau Breitensuche in Digraphen – 4 4 1 1 Bsp. 1 7 2 7→ 1 1 3 1 2 2 2 10 9 1 6 1 2 8 1 3 1 2 3 1 5 2 3 2 1 1 4 2 2 5 10 9 in Bearbeitung 3 4 2 6 1 4 2 1 7 1 1 3 2 3 in Queue 2 2 4 5 2 37 Breitensuche in Digraphen – 5 2 8 4 1 1 1 4 2 1 1 1 3 2 3 2 6 1 2 2 AuD – 07.4.2006 1 7 1 2 8 1 1 1 2 9 10 7→ 1 3 1 2 8 1 4 2 1 7 1 1 2 3 2 6 in Queue 2 2 2 5 3 2 1 9 10 in Queue in Bearbeitung fertig FG KTuEA, TU Ilmenau AuD – 07.4.2006 38 FG KTuEA, TU Ilmenau AuD – 07.4.2006 39 Breitensuche in Digraphen – 6 4 1 1 1 2 2 3 6 1 7 1 4 1 1 3 10 9 6 7 in Queue in Bearbeitung in Bearbeitung 1 1 2 2 2 1 4 1 7 2 1 3 7→ 2 8 10 9 1 7 1 in Bearbeitung fertig AuD – 07.4.2006 40 1 2 3 2 1 1 10 9 1 in Bearbeitung 4 2 1 2 3 1 2 8 1 4 2 1 7 1 1 2 3 3 2 1 9 10 AuD – 07.4.2006 41 2) Knoten v wird von pred(v) aus entdeckt. fertig 1 8 5 (Für Weg (v0, v1, . . . , vk ) mit v = vk zeigt man induktiv, daß jedes vi auf dem Weg entdeckt wird.) in Queue 2 2 2 Feststellungen: 1) Jeder von v0 aus erreichbare Knoten v wird irgendwann entdeckt, erhält eine Nummer und Levelnummer. 3 2 8 2 1 1 4 Breitensuche in Digraphen – 9 5 2 2 7 1 4 2 3 1 1 FG KTuEA, TU Ilmenau 1 2 1 fertig 2 6 2 3 2 in Queue 4 7→ 1 3 in Bearbeitung 1 1 2 2 6 Breitensuche in Digraphen – 8 6 1 in Queue FG KTuEA, TU Ilmenau 1 10 9 1 4 5 2 2 1 1 1 3 2 3 6 3 fertig 4 7→ 5 2 2 8 2 in Queue fertig 1 1 1 4 2 1 1 1 3 2 3 2 1 1 2 2 2 8 2 Breitensuche in Digraphen – 7 5 2 2 1 1 4 2 3 2 1 2 3) Alle entdeckten Knoten mit den Kanten (pred(v), v), v 6= v0 bilden einen Baum: 1 5 3 1 2 1 9 10 2 Breitensuch-Baum 3 2 6 in Queue 4 . . . und so weiter. fertig FG KTuEA, TU Ilmenau AuD – 07.4.2006 5 3 in Bearbeitung 6 8 7 4) level(v) = Länge eines kürzesten Weges von v0 nach v. 42 FG KTuEA, TU Ilmenau AuD – 07.4.2006 43 Breitensuche in Digraphen – 10 Breitensuche in Digraphen – 11 Um einen solchen Weg zu finden, starte in v und verfolge wiederholt die Kanten (pred(w), w). 5) Die Laufzeit eines Aufrufs bfs(v0) ist proportional zur Anzahl der von v0 aus erreichbaren Knoten und Kanten. 6) Der Speicherplatzbedarf ist proportional zur Anzahl der von v0 aus erreichbaren Knoten. ′ ′ Bew. 5)+6) Sei V bzw. E die Menge der erreichten Knoten P bzw. durchlaufenen Kanten. Klar: |E ′| = v′∈V ′ outdeg(v ′) Kosten für Einfügen und Entnehmen aus der Queue: O(1) und O(outdeg(v)) für das Durchlaufen der Adjazenzliste. Insgesamt: O(|V ′|+|E ′|), nur V ′-Knoten gelangen in Q. FG KTuEA, TU Ilmenau AuD – 07.4.2006 44 Breitensuche in Digraphen – 12 4 1 1 2 2 Bsp. 1 3 2 6 1 4 2 2 1 2 1 3 BFS-Bäume mit BFS-Nummern und Levels: 1 3 2 4 6 0 8 8 7 9 10 1 AuD – 07.4.2006 AuD – 07.4.2006 45 Verläuft analog zu bfs. Beachte: Bei der Bearbeitung von v wird der Knoten pred(v), obwohl er in der Adjazenzliste von v vorkommt, nie berücksichtigt (hat schon eine Nummer). level(v) entspricht dabei dem Abstand von v zu v0. 2 Wenn man in allen noch nicht entdeckten Knoten eine Breitensuche startet (analog global-bfs(G)), so findet man alle Zusammenhangskomponenten von G. Bei bfs-Aufruf auf neuen Knoten zählt bfs count weiter! FG KTuEA, TU Ilmenau FG KTuEA, TU Ilmenau Wenn man in v0 startet, werden alle Knoten in der Zusammenhangskomponente von v0 entdeckt. 10 6 5 3 5 4 2 Bem. bfs-Aufrufe verändern die bfs num-Werte. Durch bfsAufrufe auf den noch unerreichten Knoten werden insgesamt alle Knoten in G erreicht! 9 7 1 ⊲ v noch nicht erreicht! ⊲ Starte bfs von v aus 3. Breitensuche in (ungerichteten) Graphen 10 9 7: for v ← 1 to n do if bfs num(v) = 0 then bfs(v) 5 2 8 5: 6: Breitensuche in Digraphen – 13 Entstehende 1 7 1 1 3 2 2. Globale Breitensuche in G: 1: procedure global-bfs(G) 2: bfs count ← 0 3: for v ← 1 to n do 4: bfs num(v) ← 0 46 FG KTuEA, TU Ilmenau AuD – 07.4.2006 47 Breitensuche in Digraphen – 14 1 1 2 2 3 1 3 2 Bsp. 1 6 2 1 7 3 1 3 2 2 4 2 2 2 1 8 1 9 11 5 1 1 1 1 1 2 12 10 3 2 1 14 1 13 1 7→ 2 8 7 3 4 6 9 11 5 10 12 14 13 Kosten für global-bfs bei Graphen: O(|V |+|E|). Speicherplatz für die Queue: O(|V |) FG KTuEA, TU Ilmenau AuD – 07.4.2006 48