Kapitel 4 Graphenalgorithmen 4.1 Definitionen Definition 4.1.1. Der Graph G = (V, E) ist über die beiden Mengen V und E definiert, wobei V die Menge der Knoten und E die Menge der Kanten in dem Graph ist. Definition 4.1.2. Ein gerichteter Graph G = (V, E) ist ein Graph von geordneten Paaren (u, v) mit u ∈ V und v ∈ V . Beispiele für Graphen sind: • Straßennetz (gerichtet) • Eisenbahn • Rechnernetz • WWW (gerichtet) • Projekt mit Teilprojekten (gerichtet) • soziales Netzwerk 4.1.1 Weg Definition 4.1.3. Ein Weg im Graphen G = (V, E) ist eine Folge von Knoten W = (v1 , ..., vn ), v1 , ..., vn ∈ V , wobei die Kante e = (vi , vi+1 ), i = 1, ..., n − 1, in der Menge E enthalten ist. Eigenschaft 4.1.4. Ein Weg W ist einfach, wenn jeder Knoten v ∈ W genau einmal besucht wurde. Eigenschaft 4.1.5. Ein Weg W beschreibt einen Kreis, wenn v1 = v n . Definition 4.1.6. Ein Graph G heißt azyklisch, wenn er keine Kreise enthält. 71 Definition 4.1.7. Der Durchmesser eines Graphen G ist das Maximum der Abständer alle Knotenpaare (vi , vj ) ∈ W . Definition 4.1.8. Ein Graph G ist zusammenhängend, wenn zwischen einem beliebigen Paar (vi , vj ), vi , vj ∈ V , ein Weg existiert. Ein gerichteter Graph ist stark zusammenhängend, wenn es für je zwei Knoten vi und vj einen Weg von vi nach vj gibt und einen Weg von vj nach vi . Definition 4.1.9. Eine Zusammenhangskomponente ist ein maximaler Teilgraph von G, der zusammenhängend und nicht erweiterbar ist. 4.1.2 Darstellungsformen Graphen können auf verschiedene Arten repräsentiert werden. Die gebräuchlichsten sind Adjazenzmatrizen, Adjazenlisten und Inzidenzmatrizen. Adjazenzmatrix Eine Adjazenzmatix <adjazent lat.; angrenzend, benachbart> ist eine n× n-Matrix, wobei n die Anzahl der Knoten in dem Graphen G = (V, E) ist. In der Matrix wird in der i-ten Zeile und in der j-ten Spalte eine 1 eingetragen, wenn e = (vi , vj ) ∈ E ist. Ist der Graph G ungerichtet, ist die Adjazenzmatrix symmetrisch. Adjazenzliste Eine Adjazenzliste ist eine Liste, die alle Knoten des Graphen G = (V, E) und zusätzlich zu jedem Knoten v ∈ V eine Liste mit seinen Nachbarn enthält. Inzidenzmatrix Eine Inzidenzmatrix ist eine n × m-Matrix, wobei n die Anzahl der Knoten und m die Anzahl der Kanten des Graphen G = (V, E) ist. Ist G ungerichtet, dann wird in der i-ten und j-ten Zeile der l-ten Spalte eine 1 eingetragen, wenn el = (vi , vj ) ∈ E. Ist G gerichtet dann enthält die Zeile zu vi eine −1 (Startknoten) und die Zeile zu vj eine 1 (Endknoten). 4.1.3 Traversierung von Graphen Zwei bekannte Varianten, wie Graphen durchlaufen werden können, sind Breitensuche und Tiefensuche. Breitensuche - BFS (engl; breath first search) In der Breitensuche werden zuerst alle Geschwisterknoten durchsucht und dann die Kinderknoten. Bemerkung. Breitensuche findet immer den kürzesten Weg 72 Tiefensuche - DFS (engl; depth first search) In der Tiefensuche werden zuerst rekursiv alle Kinderknoten durchsucht bevor die Geschwisterknoten durchsucht werden. Bemerkung. Enthält der Graph G = (V, E) einen unendlich langen Weg, ist nicht sichergestellt, dass Tiefensuche einen Weg von vi nach vj mit vi , vj ∈ V findet. Tiefensuche kann eingesetzt werden um den Weg aus einem Labyrinth zu finden, oder um Zusammenhangskomponenten in einem Graphen zu bestimmen. 4.1.4 Topologisches Sortieren Definition 4.1.10. Topologisches Sortieren ordnet die Knoten eines gerichteten, azyklischen Graphen G = (V, E) so an, dass der Knoten u vor dem Knoten v erscheint, wenn G die Kante (u, v) enthält. Beispiel. Teilaufgaben eines Projektes, die hintereinander abgearbeitet werden müssen, Etappen eines Wettkampfes die nacheinander absolviert werden müssen oder Veranstaltungen eines Studienfaches die aufeinander aufbauen. Eine topologische Sortierung des Graphen in 4.1 ist a, f, b, c, g, d, e. Abbildung 4.1: Graph für die topologische Suche 4.1.5 Teilgraph Seien G0 = (V 0 , E 0 ) und G = (V, E) zwei Graphen. Ist V 0 ⊆ V und E 0 ⊆ E dann ist G0 ein Teilgraph von G. G0 ist ein induzierter Teilgraph von G, wenn G0 alle Kanten zwischen den Knoten 0 aus V 0 enthält, die in G vorhanden sind, formal: E 0 = E ∩ V2 . 4.2 starke Zusammenhangskomponenten Definition 4.2.1. Ein induzierter Teilgraph G0 von G, heißt starke Zusammenhangskomponente falls G0 stark zusammenhängend ist und es keinen größeren Teilgraphen gibt, der G0 enthält und stark zusammenhängend ist. 73 (a) (b) (c) Abbildung 4.2: (a) Ausgangsgraph. (b) Teilgraph von (a). (c) Induzierter Teilgraph mit der gleichen Knotenmenge wie in (b). Problem 4.2.2. Gegeben ist ein gerichteter Graph G = (V, E). Gesucht sind nun die starken Zusammenhangskomponenten von G. Algorithm 4: Finde Zusammenhangskomponenten 1. Führe DFS(G) aus, wähle den Startknoten zufällig und nummeriere Knoten in DFS-Reihenfolge 2. Konstruiere GT = (V, E T ) mit E T = {(u, v)|(v, u) ∈ E} // Graph mit umgedrehten Kanten 3. Führe DFS(GT ) aus, wähle den Startknoten mir der höchsten Nummer und nummeriere Knoten in DFS-Reihenfolge // wie in Schritt 1 Eine Veranschaulichung ist in 4.3 und in 4.4 gegeben. Abbildung 4.3: Graph nach Schritt 1 Behauptung 4.2.3. u, v sind in gleicher Zusammenhangskomponente⇔ u, v in gleichem Baum von DFS(GT ). Beweis. Zuerst beweisen wir ⇒. Es ist ein Weg von u nach v und ein Weg von v nach u in G enthalten, dann ist auch ein Weg von u nach v und ein Weg von v nach u in GT enthalten. O.B.d.A. wird DFS(u, GT ) vor DFS( v, GT ) aufgerufen. 74 Abbildung 4.4: Graph nach Schritt 3 Da v vor dem Aufruf von DFS(u,GT ) noch nicht besucht wurde und es einen Weg von u nach v in GT gibt, wird v innerhalb dieses Aufrufs gefunden und gehört somit zu dem Unterbaum von u. Also, ist v in dem gleichen DFS-Baum wie u. Als nächstes Beweisen wir ⇐. Dazu werden wir zeigen, dass alle Knoten der Zusammenhangskomponente im gleichen Baum wie die Wurzel der Zusammenhangskomponente sind. Angenommen x sei die Wurzel von v. Daraus folgt, dass ein Weg von x nach v in GT enthalten ist, das heißt, es gibt einen Weg von v nach x in G. Da x die Wurzel von v ist, ist die Nummer von x größer als die Nummer von v (nach dem Schritt 1). Daraus folgt dass DFS( x, G) nach DFS( v, G) beendet wird. Dies kann nur geschehen wenn x und v verschachtelt (4.5) oder disjunkt (4.6) sind. Abbildung 4.5: verschachtelter Aufruf Abbildung 4.6: disjunkter Aufruf Abbildung 4.7: verschachtelter Aufruf (2) Jetzt müssen wir noch ausschließen, dass x und v disjunkt sind. Angenommen DFS(v,G) wird vor DFS(x,G) aufgerufen. Da der Weg v nach x in G enthalten ist, müsste der Aufruf von DFS(x,G) aus dem Aufruf von DFS(v,G) heraus 75 geschehen (siehe Abbildung 4.7) und damit auch die Nummer von v größer als die Nummer von x sein. Dies ist ein Widerspruch! Also, wurde DFS( v, G) innerhalb von DFS( x,G) aufgerufen. Das bedeutet, es gibt einen Weg von x nach v in G. Damit liegen x und v in der gleichen starken Zusammenhangskomponente. 4.3 Minimal spannende Bäume Gegeben sei ein ungerichteter, zusammenhängender Graph G = (V, E) und eine Kostenfunktion c : E → R. Gesucht ist ein spannender Baum mit minimalen Kosten. Ein Beispiel für dieses Problem ist die Elektrizitätsversorgung. Knoten sind dann die Orte, die Kosten sind die Kosten um Leitungen zu verlegen oder Abstände zwischen den Orten. Lemma 4.3.1. Der Graph G = (V, E) sei ein Baum. e = (u, v) ∈ / T , u, v ∈ V ⇒ im Graph G0 = (V, T ∪ {e}) existiert genau ein Kreis. Beweis. Für den Beweis zeigen wir zuerst, dass e einen Kreis schließt und anschließend, dass es nur einen Kreis geben kann. 1. G sei ein Baum wie oben gefordert. Dann existiert ein Weg von u nach v mit Kanten aus T . ⇒ e schließt den Kreis. 2. Es existiert nur ein Kreis: Angenommen es gäbe zwei Kreise in G. Wir betrachten die Punkte, an denen die Kreise zum ersten Mal auseinander gehen und zum ersten Mal zusammen kommen. Es existierte also schon zuvor ein Kreis zwischen diesen Knoten in G (siehe Abbildung 4.8) . Widerspruch! Abbildung 4.8: zwei Kreise Lemma 4.3.2. Gegeben G = (V, E) und ein spannender Wald (V1 , T1 ), ..., (Vk , Tk ), k S T = Ti (Wie in Abbildung 4.9). Sei e = (u, v)u ∈ V1 , v ∈ / V1 mit minimalen i=1 Kosten. Dann existiert ein spannender Baum von G, der T ∪ {e} enthält und der minimale Kosten unter Bäumen, die T enthalten, hat. Beweis. Angenommen S 0 sei ein spannender Baum, S 0 = (V, T 0 ), T ⊂ T 0 , e ∈ / T 0, 0 0 S minimal. Nach Lemma 4.3.1 hat der Graph (V, T ∪ {e}) genau einen Kreis. 76 Abbildung 4.9: spannender Wald Es existiert eine Kante e0 = (u0 , v 0 ) mit u0 ∈ V1 , v 0 ∈ / V1 (Siehe Abbildung 4.10). c(e) ≤ c(e0 ) nach Definition von e. ⇒ S = (V, T 0 ∪ {e}\{e0 }) ist zusammenhängend, kreisfrei und Kosten von S ≤ Kosten von S 0 . Abbildung 4.10: Wald mit zusätzlichen Knoten Wie findet man nun einen minimalen spannenden Baum? Idee Fange mit Wald {V1 }, {V2 }, ..., {Vn } an. Füge nacheinander Kanten mit minimalen Kosten ein, die Vi mit Vj verbinden, i 6= j. Dabei werden Kanten ignoriert, die Knoten im gleichen Baum verbinden. Als Datenstruktur wird UNION-FIND genutzt. Algorithm 5: Algorithmus von Kruskal Initialisierung: T := ∅, Q := alle Knoten, V S := {V1 }, ..., {Vn } while |V S| > 1 do e = (v, w) ist die Kante mit minimalen Kosten aus Q entferne e aus Q V = F IN D(v) W = F IN D(w) IF(V 6= W ) THEN U N ION (V, W ) T := T ∪ {e} Wegen Lemma 4.3.2 enthält T nun Kanten eines minimal spannenden Baums von G. Laufzeit Zeile 1 Prioritätsschlange hat Laufzeit O(m log(m)) mit m = |E| und V S hat die Laufzeit O(n) mit n = |V |. 77 Zeilen 3 und 4 Das Finden des Minimums dauert O(m log(m)). Zeilen 5 und 6 Es gibt O(m) UNION-FIND-Operationen. Diese haben zusammen eine Laufzeit von O(m log∗ (m)) oder genauer O(mα(2m, n)). Zeilen 8 und 9 Die Vereinigung ist bekannter Maßen in konstanter Zeit möglich, deshalb ist Laufzeit O(1). Gesamt Da die Zeilen 3 und 4 am meisten Zeit benötigen, ergibt sich eine Gesamtlaufzeit von O(m log(m)). 78