Graphenalgorithmen

Werbung
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
Herunterladen