Graphen sind eine der wichtigste Modellierungskonzepte der Informatik Graphalgorithmen bilden die Grundlage vieler Algorithmen in der Praxis Zunächst kurze Wiederholung von Graphen. Dann Darstellungen von Graphen Schließlich einfache Graphalgorithmen: Breiten- und Tiefensuche, Zusammenhangskomponenten, Minimalspannende Bäume
Wiederholung Graphen Gerichtete Graphen Ein gerichteter Graph G ist ein Paar (V,E), wobei E eine endliche Menge ist und E V V. Elemente aus V heissen Knoten, Elemente aus E heissen Kanten. Entsprechend heisst V Knotenmenge und E heisst Kantenmenge von G. Kanten sind geordnete Paare von Knoten. Kanten der Form (u,u), u V, sind zugelassen und heissen Schleifen. Ist (,v) E u, so sagen wir, dass die Kante von u nach v führt. Sagen auch, dass u und v adjazent sind. Müssen dann aber noch Richtung berücksichtigen. 2
Illustration gerichteter Graph V = {,2,3,4,5,6 } E = {(,2 ), ( 2,2 ), ( 2,4 ), ( 2,5 ), ( 4,, ) ( 4,5 ), ( 5,4 ), ( 6,3 )} 2 3 4 5 6 3
Wiederholung Graphen Ungerichtete Graphen Ein ungerichteter Graph G ist ein Paar (V,E), wobei V eine endliche Menge ist und E eine Menge von 2-elementigen Teilmengen von V ist. Elemente aus V heissen Knoten, Elemente aus E heissen Kanten. Entsprechend heisst V Knotenmenge und E heisst Kantenmenge von G. Formal haben Kanten die Form {,v} mit u,v V u. Schreiben aber wir bei gerichteten Graphen Kanten als Paare (u,v), unterscheiden dabei aber nicht zwischen (u,v) und (v,u). Kanten der Form (u,u) sind nicht zugelassen. Ist ( u,v ) E, so sagen wir, dass u und v adjazent sind. 4
Illustration ungerichteter Graph V = {,2,3,4,5,6 } E = {(,2 ), (,5 ), ( 2,5 ), ( 6,3 )} 2 3 4 5 6 5
Darstellung von Graphen Adjazenzlisten () Die Adjazenzlisten-Darstellung eines Graphen G=(V,E) besteht aus einem Array Adj von V Listen. Pro Knoten u enthält Adj damit genau eine Liste Adj u. [ ] Für alle u V enthält Adj [ u] alle Knoten, die zu u Adj u enthält alle Knoten u,v. adjazent sind. Äquivalent, [ ] v, so dass ( ) E Knoten in [ u] Adj sind in beliebiger Reihenfolge gespeichert. 6
Darstellung von Graphen Adjazenzlisten (2) Ist G gerichtet, so enthalten alle Listen in Adj zusammen genau E Einträge. Ist G ungerichete, so enthalten alle Listen in Adj zusammen genau 2 E Einträge, denn eine Kante (u,v) führt zu Eintrag v in Adj [ u] und zu Eintrag Adj v. u in [ ] 7
Darstellung von ungerichteten Graphen Adjazenzlisten 2 3 5 4 2 3 4 5 2 5 / 5 3 4 / 2 4 / 2 5 3 / 4 2 / 8
Darstellung von gerichteten Graphen Adjazenzlisten 2 3 4 5 6 2 3 4 5 6 2 4 / 5 / 6 5 / 2 / 4 / 6 / 9
Darstellung von Graphen Adjazenzmatrix Für die Adjazenzmatrix-Darstellung eines Graphen nehmen wir an, dass die Knoten in V mit den Zahlen von K,, V nummeriert sind. Die Adjazenzmatrix von G ist dann eine A = ( a ij ) mit, falls ( i, j) E a ij =. 0, sonst V V Matrix Ist G ein ungerichteter Graph, so ist die Matrix A symmetrisch, d.h. für alle (i,j) gilt a = a. Adjazenmatrix benötigt immer Speicher ( ) 2 V ij ji Θ. 0
Darstellung von ungerichteten Graphen - Adjazenzmatrix 2 3 5 4 2 3 4 5 0 0 0 2 0 3 0 0 0 4 0 0 5 0 0
Darstellung von gerichteten Graphen - Adjazenzmatrix 2 3 4 5 6 2 3 4 5 6 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 4 0 0 0 0 0 5 0 0 0 0 0 6 0 0 0 0 0 2
Vergleich der Darstellungen Die Adjazenzlisten-Darstellung ist besser, wenn E 2 viel kleiner ist als V, also bei dünn besetzten Graphen. Die Adjazenzmatrix-Darstellung ist besser, wenn E etwa so groß ist wie Graphen. 2 V, also bei dicht besetzten Mit Adjazenzmatrix kann bei je zwei Knoten u,v in konstanter Zeit überprüft werden, ob ( u,v ) E. Die meisten Graphenalgorithmen in dieser Vorlesung benutzen allerdings Adjazenzlisten. 3
Breitensuche Überblick () 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. 4
Breitensuche - Überblick (2) Die Breitensuche bestimmt alle Knoten mit Abstand < k vor den Knoten mit Abstand k. Daher der Name Breitensuche. Graphensuche funktioniert in gleicher Weise bei gerichteten und ungerichteten Graphen. Nehmen an, dass Eingabegraph in Adjazenzlisten- Darstellung gegeben ist. Sagen, dass ein Knoten entdeckt wird, wenn er das erste Mal bei der Breitensuche angetroffen wird. 5
Breitensuche - Überblick (3) Wird v entdeckt, während [ u] Adj nach neuen Knoten durchsucht wird, so heisst u Vorgänger von v. Knoten sind entweder weiss, grau oder schwarz. Weiss 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. 6
Pseudocode für Breitensuche ( ) jeden Knoten u in V \ { s} do color[ u] WHITE d[ u] π[ NIL color[ u] : = Feld für Farbe von v. Initial [ s] GRAY WHITE. [ ] 0 [ s] NIL d[ u] : = Feld für bislang berechneten { } Abstand zu s. Initial. ( Q,s ) Q { } π [ u] : = Feld für Vorgänger. Initial NIL. do u Dequeue( Q) for v Adj[ u] do if color [ v ] = WHITE then color[ v] GRAY d[ v] d[ u] + π[ u Enqueue( Q,v ) color[ u] BLACK BFS G,s for 2 3 4 5 color 6 d s 7 π 8 Q 9 Enqueue 0 while 2 3 4 5 6 7 8 BFS benutzt Queue für graue Knoten. 7
8 Illustration Breitensuche () 0 r v u t s y x w Q s 0 0 r v u t s y x w Q w r
9 Illustration Breitensuche (2) 0 r v u t s y x w Q w r 0 2 2 r v u t s y x w Q r t 2 x 2
Illustration Breitensuche (3) r s 0 t u 2 3 Q= 2 2 3 v w x y 20
Breitensuche Laufzeitanalyse () Zeilen 2-4 jeweils konstante Zeit. Werden V mal O V. durchlaufen. Damit Zeit ( ) Zeilen 5-9 insgesamt konstante Zeit. Jeder Knoten wird nur einmal in Queue eingefügt und gelöscht. Schleife in Zeilen 2-7 wird für jeden Eintrag v in Adjazenzlisten nur einmal durchlaufen. Zeilen 2-7 pro Durchlauf Zeit O ( ). 2
Breitensuche Laufzeitanalyse (3) Gesamtzeit für Durchläufe der Schleife in Zeilen -8 insgesamt O ( E ). Denn Gesamtgröße Θ E. aller Adjazenzlisten ( ) Satz 5.: Bei Eingabe von Graph G=(V,E) und Quelle s besitzt Algorithmus BFS Laufzeit O ( V + E ) 22
Pseudocode für Breitensuche ( ) jeden Knoten u in V \ { s} do color[ u] WHITE d[ u] π[ NIL color[ u] : = Feld für Farbe von v. Initial [ s] GRAY WHITE. [ ] 0 [ s] NIL d[ u] : = Feld für bislang berechneten { } Abstand zu s. Initial. ( Q,s ) Q { } π [ u] : = Feld für Vorgänger. Initial NIL. do u Dequeue( Q) for v Adj[ u] do if color [ v ] = WHITE then color[ v] GRAY d[ v] d[ u] + π[ u Enqueue( Q,v ) color[ u] BLACK BFS G,s for 2 3 4 5 color 6 d s 7 π 8 Q 9 Enqueue 0 while 2 3 4 5 6 7 8 BFS benutzt Queue für graue Knoten. 23
Breitensuche Erreichbarkeit, Kürzeste Pfade () Lemma 5.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) +. Lemma 5.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 ). 24
Breitensuche Erreichbarkeit, Kürzeste Pfade (2) Lemma 5.4: Die Queue Q enthalte zu einem beliebigen Zeitpunkt des Ablaufs von BFS die Knoten ( v, K, v r ), wobei v der Kopf head [ Q] und v r das Ende tail [ Q] sei. Dann gilt [ v ] d[ v ] + und d[ v ] d[ v ],i =, K,r -. d r i i+ Korollar 5.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 ] d[ v ]. i j 25
Breitensuche Erreichbarkeit, Kürzeste Pfade (3) Satz 5.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 Insbesondere sind die von s aus erreichbaren d v <. Knoten v die Knoten mit [ ] d [ v] = δ( s,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] π v,v. von v erweitert um die Kante ( [ ] ) 26
Breitensuchbäume Betrachten nach BFS mit Eingabe G,s den Graphen G V, E mit π = ( ) π und Dann gilt π Satz 5.7: ( V, E ) G π = π π 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. π V π E π = { v V π[ v] NIL} { s}. ( π[ v ],v ) v V \ { s} : = { }. π 27