Algorithmen auf Graphen
Inhalt:
• Repräsentation von Graphen
• Durchsuchen eines Graphen, Breitensuche und Tiefensuche
• Topologisches Sortieren
• Kürzeste Wege (Warshall Algorithmus)
• Maximaler Fluß (Ford-Fulkerson)
• Maximales Matching
Repräsentation von Graphen
Einen Graph wird durch eine Knoten- und Kantenmenge festgelegt.
Sind die Knoten mit 1,2, . . . , n durchnummeriert, so reicht es aus, die Anzahl n der Knoten anzugeben. Die Kantenmenge kann dargestellt werden durch
• eine Adjazenzliste. Sie besteht aus einem Array A[1..n] von Zeigern. Jeder Zeiger ist Ausgangspunkt einer Liste, wobei die Liste A[i] die Knoten (Zahlen) enthält, die mit Knoten i durch eine Kante verbunden sind.
• eine Adjazenzmatrix. Dies ist eine (n × n) 0/1-Matrix (oder auch boolsche Matrix) M. Das Element M[i, j] = 1 genau dann, wenn es eine Kante von Knoten i zu Knoten j gibt (M[i, j] = 0 sonst).
Adjazenzliste und Adjazenzmatrix
a b
c d e
f g h
a b c d e f g h
a 0 1 1 1 0 0 0 0
b 1 0 0 1 0 1 0 0
c 1 0 0 1 0 1 0 0
d 1 1 1 0 1 1 1 1
e 0 0 0 1 0 0 0 1
f 0 1 1 1 0 0 1 0
g 0 0 0 1 0 1 0 1
h 0 0 0 1 1 0 1 0
a b c d
b a f d
c a d f
d c a b e f g h
e d h
Repräsentation von Graphen
Die optimale Wahl der Darstellung hängt von der Anzahl der Kanten und der des Zugriffs auf die Knoten/Kanten ab.
• Adjazenzliste.
• Speicherplatz wird nur für die tatsächlich vorhandenen Kanten benötigt. Dies ist vorteilhaft für dünn besetzte Graphen.
Speicherplatz: O(kV k + kEk)
• Zugriff auf die Nachbarn eines Knotens ist effizient. Dies ist vorteilhaft, wenn der Graph in dieser Reihenfolge durchsucht wird.
• Vorgänger eines Knotens können nicht effizient gefunden werden.
Repräsentation von Graphen
• Adjazenzmatrix.
• Speicherplatz der Matrix ist O(kV k2), unabhängig von der Anzahl der Kanten.
• Test, ob eine Kante zwischen Knoten i und Knoten j existiert, ist effizient.
• Zugriff auf die Nachbarn eines Knotens ist nicht effizient, Komplexität O(n).
Beide Darstellungen eignen sich für gerichtete und ungerichtete Graphen. Ebenso können Kantengewichte verwaltet werden.
Durchsuchen eines Graphen
Häufig muß ein Graph, ausgehend von einem Knoten u, durchsucht werden. Dabei gibt es zwei unterschiedliche Strategien: Breitensuche und Tiefensuche.
Beide Suchverfahren (erzeugen implizit einen Baum und) erlauben es die Knoten in der Reihenfolge auszugeben in der sie
• zum ersten Mal besucht wurden (preorder)
• zum letzten Mal besucht wurden (postorder)
• Bei Graphen mit konstantem Grad (z.B. 2) kann ein Knoten auch nach den Knoten des “linken” und vor den Knoten des “rechten”
Nachfolgers ausgegeben werden (inorder).
Durchsuchen eines Graphen, Breitensuche
• Breitensuche (breadth-first-Search).
Im wesentlichen Dijkstras Algorithmus, wobei die Kantengewichte alle gleich 1 sind. Als Datenstruktur wird eine Schlange Q (first in, first out) verwendet. Diese enthält zunächst den Startknoten u. Es wird jeweils der erste Knoten der Schlange entnommen, dessen Nachbarn werden, sofern sie noch nicht betrachtet wurden, hinten in die Schlange einge- fügt. Um zu verhindern, dass ein Knoten mehrmals in die Schlange aufgenommen wird, wird er beim Einfügen entsprechend markiert, hier wird der Abstand zum Startknoten u in eine Feld d eingetragen.
Datenstruktur Schlange
Operationen:
• Initialisieren (ergibt leere Schlange).
• Einfügen eines Elements.
• Lesen und Entfernen eines Elements.
Die Schlange ist ein “first in, first out” (FIFO) Speicher:
• wird x vor y eingefügt, so wird x vor y entfernt.
Im Gegensatz dazu ist der Stack ein “last in, first out” (LIFO) Speicher:
• wird x vor y eingefügt, so wird x nach y entfernt.
Durchsuchen eines Graphen, Breitensuche
Breitensuche (Eingabe: Graph G = (V, E) und Knoten u ∈ V ) FOR v ∈ V DO d(v) := ∞
d(u) := 0, Q := {u}
WHILE Q 6= ∅ DO
v := erstes Element in Q entferne v aus Q
FOR v′ ∈ N(v) DO
IF d(v′) = ∞ THEN
d(v′) := d(v) + 1 und Q = Q ∪ {v′}
Die Tabelle d enthält die Abstände der Knoten zum Knoten u.
Durchsuchen eines Graphen, Tiefensuche
• Tiefensuche (depth-first-search)
Hier wird ein Pfad zuerst in die Tiefe verlängert. Dies lässt sich
rekursiv einfach formulieren. Für einen Knoten u wird die Tiefensuche nacheinander für alle Nachbarn aufgerufen.
Jeder Knoten ist zunächst weiß gefärbt. Wird er in der Tiefensuche erreicht, wird er grau, sind alle Nachbarn (abschließend) betrachtet worden, wird er schwarz.
Tiefensuche(Knoten u ∈ V ) f(u) := grau
FOR v ∈ N(u) DO
IF f(v) = weiß THEN Tiefensuche(v) f(u) := schwarz
Durchsuchen eines Graphen, Analyse
Die Komplexität (bei beiden Verfahren) ergibt sich aus der Anzahl der Zugriffe auf die Kanten und Knoten.
Jeder Knoten wird einmal in die Schlange aufgenommen bzw. durch einen rekursiven Aufruf grau gefärbt. Jede Kante wird genau einmal (für ungerichtete Graphen zweimal) betrachtet.
Die Komplexität ist daher O(kV k + kEk).
Für zusammenhängende Graphen gilt, kEk ≥ kV k − 1, daher ist die Komplexität O(kV k + kEk) = O(kEk).
Topologisches Sortieren
Eine topologische Sortierung eines gerichteten Graphen G = (V, E) ist
• eine Anordnung (Nummerierung) der Knoten V = {v1, v2, . . . , vn}, so dass
• für alle Kanten (vi, vj) gilt i < j.
Offensichtlich lassen sich Graphen, die Kreise enthalten, nicht topologisch sortieren. Es gilt:
Ein Graph ist azyklisch genau dann, wenn er sich topologisch sortieren lässt.
Topologisches Sortieren, azyklische Graphen
Beweis: (⇐) klar, denn in einer topologischen Sortierung gibt es keine Rückwärtskanten.
(⇒) G sei azyklisch. Dann gibt es einen Knoten, der keinen
Vorgänger—also keine eingehende Kante—hat. (Wenn nicht, folge den Vorgängern bis ein Kreis ensteht).
Wir sortieren G wie folgt. Bestimme Knoten v der keinen Vorgänger hat. Gib v die nächste Nummer und entferne v mit seinen
ausgehenden Kanten und sortiere den Restgraphen topologisch.
Topologisches Sortieren mit Tiefensuche
Der Beweis liefert schon ein Verfahren, um topologisch zu sortieren.
Eine topologische Sortierung ergibt sich auch aus der Tiefensuche.
Zunächst werden alle Knoten weiß gefärbt. Die Prozedur Tiefensuche wird dann solange mit einem weiß gefärbten Knoten aufgerufen, bis es keine weiß gefärbten Knoten mehr gibt. Die umgekehrte Reihenfolge, in der die Knoten schwarz gefärbt werden, ist eine topologische
Sortierung.
FOR v ∈ V DO f(v) := weiß FOR v ∈ V DO
IF f(v) = weiß THEN Tiefensuche(v)
Topologisches Sortieren mit Tiefensuche, Analyse
Um die Korrektheit zu zeigen, seien die Knoten in umgekehrter
Reihenfolge ihres “Schwarz-Werdens” nummeriert: V = {v1, . . . , vn} (d.h. vn wird als erster schwarz und v1 als letzter).
Sei (u, v) eine Kante von u nach v. Wir müssen zeigen, dass die Nummer von u kleiner ist als die von v, d.h. v muß vor u schwarz gefärbt werden.
Im Verlauf des Verfahrens wird irgendwann Tiefensuche(u) aufgerufen.
Dort wird (in der ersten Anweisung) u grau gefärbt. Da v ∈ N(u) wird in diesem Aufruf (irgendwann) die Kante (u, v) und somit der Knoten v betrachtet.
Topologisches Sortieren mit Tiefensuche, Analyse
Der Knoten v ist weiß, grau oder bereits schwarz gefärbt.
• v ist schwarz. Da u erst am Ende des Aufrufs schwarz gefärbt wird, wird v vor u schwarz.
• v ist grau. D.h. ein Aufruf Tiefensuche(v) hat bereits stattgefunden und ist noch nicht abgeschlossen, da v noch nicht schwarz ist. Es gibt also einen Pfad von v nach u (sonst wäre der Aufruf von v vor dem Aufruf von Tiefensuche(u) abgeschlossen). Mit der Kante (u, v) ensteht ein Kreis. Widerspruch.
• v ist weiß. Dann erfolgt ein rekursiver Aufruf von Tiefensuche(v).
Erst wenn dieser beendet wird und v schwarz gefärbt ist, wird u schwarz gefärbt.
Transitive Hülle
Die transitive Hülle eines Graphen G = (V, E) ist der Graph G∗ = (V, E∗) mit
(u, v) ∈ E∗ ⇔ es gibt einen Pfad von u nach v in G
E∗ ist transitiv abgeschlossen, d.h falls E∗ die Kante (u, v) und die Kante (v, w) enthält, so enthält E∗ auch die Kante (u, w).
Transitive Hülle, Breitensuche
Die transitive Hülle von G kann durch eine Breitensuche berechnet werden. Die Breitensuche berechnet ein Feld d welches den Abstand (Länge eines kürzesten Pfades) von einem Knoten u zu allen anderen Knoten berechnet. D.h. es gibt genau dann einen Pfad von u nach v, wenn nach der Breitensuche d(v) 6= ∞.
E∗ = ∅
FOR u ∈ V DO
Breitensuche(G, u) FOR v ∈ V DO
IF d(v) 6= ∞ THEN E∗ = E∗ ∪ {(u, v)}
Komplexität: O(kV k · kEk) = O(n · m), wobei n Anzahl der Knoten und m Anzahl der Kanten ist.
Transitive Hülle, Schrittweise
Gegeben sei der Graph G = (V, E) mit V = {1,2, . . . , n}.
Definiere 0/1 Variable mki,j mit mki,j = 1 genau dann, wenn Knoten j von Knoten i aus über die ersten k Knoten erreichbar ist. Also:
mki,j =
1, es gibt einen Pfad von i nach j, auf dem alle zwischen i und j liegenden Knoten aus {1,2, . . . , k} stammen
0, sonst
Als Randbedingungen erhalten wir:
m0i,j =
1, falls (i, j) ∈ E oder i = j 0, sonst
Rekursionsgleichung
mki,j lässt sich rekursiv aus mki,j−1 berechnen.
Es gibt einen Pfad von i nach j über Knoten aus {1,2, . . . , k},
• wenn es einen Pfad von i nach j über Knoten aus {1,2, . . . , k − 1}
gibt, oder
• wenn es einen Pfad
• von i nach k über Knoten aus {1,2, . . . , k − 1} und einen Pfad
• von k nach j über Knoten aus {1,2, . . . , k − 1} gibt.
Formal:
mki,j = mki,j−1 ∨ (mki,k−1 ∧ mkk,j−1).
Warshall-Algorithmus
Der Warshall Algorithmus berechnet die Adjazenzmatrix A von G∗. Warshall Algorithmus
Eingabe: Adjazenzmatrix A[1..n, 1..n]
FOR k := 1 TO n DO
FOR i := 1 TO n DO IF A[i, k] = 1 THEN
FOR j := 1 TO n DO
IF A[k, j] = 1 THEN A[i, j] := 1
Die Komplexität ist O(n3) (drei geschachtelte for-Schleifen).
Kürzeste Wege
Eine Modifikation von Warshalls Algorithmus berechnet in einem kantenbewerteten Graphen die kürzesten Wege zwischen allen Knotenpaaren.
(Beachte: Dijkstras Algorithmus berechnet die kürzesten Wege von einem Startknoten zu allen anderen Knoten).
mki,j ist jetzt die kürzeste Weglänge eines Pfades von Knoten i zum Knoten j über Knoten aus der Menge {1,2, . . . , k}.
Rekursionsgleichung:
mki,j = min{mki,j−1, mki,k−1 + mkk,j−1}.
Algorithmus von Floyd
Die Matrix D enthält jetzt beim Aufruf die Gewichte der Kanten (Entfernungen zwischen allen Knotenpaaren). Sei w : E → R+ die Bewertungsfunktion:
D[i, j] =
0, falls i = j
w(i, j), falls (i, j) ∈ E
∞, sonst Algorithmus von Floyd
Eingabe: Entfernungsmatrix D[1..n, 1..n]
FOR k := 1 TO n DO
FOR i := 1 TO n DO
Flüsse in Netzwerken
Gegeben ist ein gerichteter Graph G = (V, E) mit
• einer Quelle s ∈ V ,
• einer Senke t ∈ V ,
• einer Kapazität c : V × V → IN, wobei c(u, v) = 0 für (u, v) 6∈ E. Der Graph repräsentiert ein Netzwerk von
• Leitungen, Röhren, Straßen, etc.
Die Quelle erzeugt (Strom, Nachrichten etc.) in beliebiger Menge, die Senke nimmt in beliebiger Menge auf.
Die Kapazität entspricht dem maximalem Durchfluß von Knoten zu Knoten.
Beispiel, Netzwerk
u v
s t
w x
12
10
20
9 16
13
4
14
7
4
Flüsse in Netzwerken
In einem Netzwerk soll der Fluss von der Quelle zur Senke maximiert werden.
Für jedes Paar von Knoten (u, v) wird ein Fluss f(u, v) bestimmt, so dass
• die Kapazitäten nicht überschritten werden, d.h., f(u, v) ≤ c(u, v),
• die Symmetriebedingung f(u, v) = −f(v, u) gilt.
• das Kirchhoffsche Gesetz gilt:
∀u ∈ V − {s, t} : X
v∈V
f(u, v) = 0.
Der Betrag eines Flusses f ist |f| := P
v∈V f(s, v).
Netzwerk mit Fluss f
u v
s t
w x
12/12
10
15/20
4/9 11/16
8/13
1/4
11/14
7/7
4/4
Pfad p von s nach t
u v
s t
w x
15/20
4/9
c(w,v)=0, f(w,v)=-4 8/13
Für alle (a, b) in p ist die Restkapazität c(a, b) − f(a, b) positiv. Der Pfad kann einen zusätzlichen Fluss g = 4 übertragen.
Netzwerk mit Fluss f + g
u v
s t
w x
12/12
10
19/20
9 11/16
12/13
1/4
11/14
7/7
4/4
Flüsse in Netzwerken, Restnetzwerk
Definition. Gegeben sei ein Netzwerk G mit Kapazität c und ein
zulässiger Fluss f. Das Restnetzwerk Gf = (V, Ef) mit Restkapazität cf ist gegeben durch:
• cf(u, v) = c(u, v) − f(u, v) und
• Ef = {(u, v) | cf(u, v) > 0}
Das Restnetzwerk enthält Kanten, deren Kapazitäten durch den aktuellen Fluss bestimmt werden.
Es können neue Kanten entstehen: Kante (u, v) falls (v, u) ∈ E.
Restnetzwerk G
ffür Fluss f
u v
s t
w x
11 11
5
5
7 5 12
5
8
3
4
3 11
15
4
Flüsse in Netzwerken, Erweiterungspfad
Definition. Ein Erweiterungspfad ist ein kreisfreier Pfad p in Gf von s nach t.
Nach Definition ist cf(u, v) > 0 für alle Kanten (u, v) des Pfades p.
Die Restkapazität cf(p) des Pfades ist
cf(p) = min{cf(u, v) | (u, v) liegt in p}
Bemerkung: Der Fluss g mit
g(u, v) =
cf(p), (u, v) liegt in p
−cf(p), (v, u) liegt in p
0, sonst
Erweiterungspfad p in G
fu v
s t
w x
11 11
5
5
7 5 12
5
8
3
4
3 11
15
4
Erweiterungspfad
Lemma
• Sei G ein Netzwerk, c eine Kapazität und f ein zulässiger Fluss.
• Sei Gf das Restnetzwerk, cf die Restkapazität.
• Sei g ein zulässiger Fluss in Gf.
Dann gilt, dass f + g ein zulässiger Fluss auf G ist.
Erweiterungspfad, Beweis
Wir überprüfen, dass f + g ein zulässiger Fluss in G ist.
Kapazit¨atsbedingung: Da G zulässiger Fluss in Gf ist, gilt g(u, v) ≤ cf(u, v) = c(u, v) − f(u, v).
Daraus folgt (f + g)(u, v) =
f(u, v) + g(u, v) ≤ f(u, v) + c(u, v) − f(u, v) = c(u, v).
Symmetriebedingung:
(f + g)(u, v) = f(u, v) + g(u, v)
= −f(v, u) − g(v, u) = −(f(v, u) + g(v, u)) = −(f + g)(v, u).
Erweiterungspfad, Beweis
Kirchhoffsches Gesetz: Sei u ∈ V − {s, t}. Dann gilt X
v∈V
(f + g)(u, v) = X
v∈V
(f(u, v) + g(u, v))
= X
v∈V
f(u, v) + X
v∈V
g(u, v) = 0 + 0 = 0.
Ferner gilt für den Betrag des Flusses f + g
|(f + g)| = X
v∈V
(f + g)(s, v) = X
v∈V
(f(s, v) + g(s, v)) = |f| + |g|.
Ford-Fulkerson
Nach dem Lemma kann ein Fluss f durch einen Fluss g im Restnetzwerk vergrößert werden.
Sei f gegeben.
• Bestimme Restnetzwerk Gf
• Bestimme Erweiterungspfad p mit Restkapazität cf(p), z.B. durch Breiten- oder Tiefensuche in Gf.
• Erhöhe Fluss in G zu f + g, wobei
g(u, v) =
cf(p), (u, v) liegt in p
−cf(p), (v, u) liegt in p
0, sonst
Ford-Fulkerson
Eingabe: Graph G = (V, E) und Kapazität c : V × V → IN FOR ALL (u, v) ∈ E DO f(u, v) := 0; f(v, u) := 0
REPEAT
Berechne Restnetzwerk Gf
Suche Erweiterungspfad p in Gf
cf(p) = min{cf(u, v) | (u, v) liegt in p}
g(u, v) =
cf(p), (u, v) liegt in p
−cf(p), (v, u) liegt in p
0, sonst.
f := f + g
UNTIL es gibt keinen Pfad von s nach t in Gf Ausgabe: Fluss f
Min Cut Max Flow
Es bleibt noch zu zeigen, dass es immer einen Erweiterungspfad gibt, solange der Fluss nicht maximal ist. Dazu betrachten wir den Fluss über einen Schnitt durch das Netzwerk.
u v
s 11 t
11
1
9
7 5 12
12
3
1
@ 4
Schnitt eines Netzwerks
Definition. Sei G ein Netzwerk mit Kapazität c.
• Ein Schnitt ist eine Zerlegung der Knotenmenge V in Mengen A und B mit
• A ∩ B = ∅ und A ∪ B = V und
• s ∈ A und t ∈ B.
• Die Kapazität c eines Schnitts (A, B) ist c(A, B) = X
u∈A,v∈B
c(u, v).
• Für einen Fluss f ist der Fluss über den Schnitt (A, B):
f(A, B) = X
u∈A,v∈B
f(u, v).
Schnitt eines Netzwerks, Eigenschaften
Für jeden zulässigen Fluss f gilt:
• f(A, B) ≤ c(A, B), denn für jeden Summanden gilt f(u, v) ≤ c(u, v).
• |f| = f({s}, V − {s}).
• Dies gilt auch für jeden Schnitt A und B, d.h.,
|f| = f(A, B).
Schnitt eines Netzwerks, Eigenschaften
Behauptung: Für jeden Schnitt A und B gilt |f| = f(A, B).
Dies kann man durch Induktion zeigen.
• Behauptung gilt für kAk = 1 nach Definition. (In diesem Fall ist A = {s}).
• Sei (A, B) ein Schnitt mit kAk = n + 1.
Wähle v ∈ A − {s} und betrachte Schnitt (A′, B′) = (A − {v}, B ∪ {v}).
Nach Induktionsvoraussetzung gilt |f| = f(A′, B′). Daher folgt f(A, B) = f(A′, B′)−X
u∈A
f(u, v)+X
u∈B
f(v, u) = |f|+X
u∈V
f(v, u) = |f|
Min-Cut Max-Flow Theorem
Damit gilt für jeden zulässigen Fluss f und jeden Schnitt A und B:
|f| = f(A, B) ≤ c(A, B). Es folgt:
maxf |f| ≤ min
(A,B){c(A, B)}
Das Min-Cut Max-Flow Theorem besagt, dass es einen Schnitt mit
|f| = c(A, B) gibt.
Satz. Sei f ein zulässiger Fluss in einem Netzwerk G mit Kapazität c.
Dann sind die Aussagen (1), (2) und (3) äquivalent.
1. f ist ein maximaler Fluss.
2. Das Restnetzwerk Gf enthält keinen Erweiterungspfad.
Min-Cut Max-Flow Theorem, Beweis
Wir zeigen aus (1) folgt (2), aus (2) folgt (3), und aus (3) folgt (1).
(1)⇒(2): Wenn |f| maximal ist, kann es keinen Erweiterungspfad p in Gf geben, denn sonst könnte f durch p echt verbessert werden.
(2)⇒(3): Setze A = {u ∈ V | es gibt einen Pfad von s nach u in Gf} und B = V − A.
Dann gilt s ∈ A und nach Voraussetzung t ∈ B. Also ist (A, B) ein Schnitt.
Für alle Knoten u ∈ A und v ∈ B gilt: cf(u, v) = 0.
Mit cf(u, v) = c(u, v) − f(u, v) folgt c(u, v) = f(u, v). Daher gilt:
|f| = f(A, B) = X
u∈A,v∈B
f(u, v) = X
u∈A,v∈B
c(u, v) = c(A, B)
Min-Cut Max-Flow Theorem, Beweis
(3)⇒(1): Für alle Schnitte (A, B) und alle zulässigen Flüsse f gilt
|f| ≤ c(A, B).
Da nach Voraussetzung (3) |f| = c(A, B) gilt, muss |f| maximal sein.
Beobachtung: Aus der Implikation (2)⇒(1) des Min-Cut Max-Flow Theorems folgt:
Falls es keinen Erweiterungspfad p in Gf gibt, so ist |f| maximal.
Ford-Fulkerson, Komplexität
Die Wahl des Erweiterungspfades ist nicht festgelegt. Durch
“ungeschickte” Wahl kann die Laufzeit von der Größe des maximalen Flusses abhängen.
u
s t
v 1000
1000
1
1000 1000
Ford-Fulkerson, Komplexität
Das Restnetzwerk ergibt sich zu:
u
s t
v 1000
999
1
1 1000
999
1
Eine ungeschickte Wahl wäre hier: p = s, u, v, t mit cf(p) = 1.
Erweiterungspfade, Komplexität
Ein Erweiterungspfad kann mit Breiten- oder Tiefensuche im
Restnetzwerk bestimmt werden. Der Erweiterungspfad liefert einen zusätzlichen Fluss g. Dadurch wird der Fluss jeweils um mindestens 1 erhöht.
Komplexität des Ford-Fulkerson Algorithmus: O(|f∗| · kEk), wobei
• |f∗| der Betrag des maximalen Flusses ist, und
• O(kEk) die Komplexität ist, die bei der Suche nach einem Erweiterungspfad anfällt.
Erweiterungspfade, Edmonds-Karp Strategie
Da der Betrag des maximalen Flusses linear eingeht, ist die Komplexität (im Sinne der Bitkomplexität) exponentiell.
Der Wert von |f∗| wird durch die Kapazitäten beschränkt. Für c : V × V → {0,1} ist |f∗| durch kEk begrenzt.
Edmonds-Karp Strategie. Wähle im Restnetzwerk Gf einen Erweiterungspfad p mit minimaler Länge.
Ein Pfad minimaler Länge kann z.B. mit Breitensuche (Dijkstras Algorithmus) mit Komplexität O(kEk) bestimmt werden.
Edmonds-Karp Strategie
Behauptung. Wird jeweils ein Erweiterungspfad mit minimaler Länge ausgewählt, benötigt der Ford-Fulkerson Algorithmus nur kV k · kEk Schleifendurchläufe.
Begr ¨undung. Wir betrachten den Schichtengraph L(Gf) von Gf.
• l(v) sei der minimaler Abstand von Knoten v zur Quelle s.
• Der Schichtengraph L(Gf) enthält nur Kanten, die auf Pfaden mit minimaler Länge liegen, d.h., Kanten (u, v) mit
(u, v) ∈ E, und l(v) = l(u) + 1.
L(Gf) enthält alle Pfade minimaler Länge von s nach t.
Edmonds-Karp Strategie, Komplexität
Sei p ein Erweiterungspfad, der mit der Edmonds-Karp Strategie bestimmt wurde, d.h. p hat minimale Länge in Gf. Da p nur Kanten enthält, die auf Pfaden mit minimaler Länge liegen, ist p daher auch ein Pfad in L(Gf).
• Wird der Fluss f um cf(p) erhöht, entfällt im neuen Restnetzwerk (mindestens) eine Kante aus L(Gf).
• Für eine Kante (u, v) mit c(u, v) > cf(p) kann die Kante (v, u) hinzukommen. Falls solche Kanten hinzukommen sind diese
“rückwärts” gerichtet, denn l(u) = l(v) − 1!
• Kanten die hinzukommen, kommen nicht in L(Gf) vor. Pfade (von s nach t), die diese Kanten enthalten sind länger als p.
Edmonds-Karp Strategie, Komplexität
Sei p′ der nächste Erweiterungspfad in G′ = Gf+g.
Falls p′ auch in L(Gf) liegt, hat p′ mindestens die Länge von p. Falls p′ nicht in L(Gf) liegt, ist die Länge um mindestens 1 größer als die von p.
Die Pfadlängen bleiben also entweder gleich oder vergrößern sich.
• Da L(Gf) maximal 2kEk Kanten hat und für jeden Pfad
(mindestens) eine Kante entfällt, kann es nicht mehr als 2kEk Pfade einer Länge geben.
• Es gibt kV k unterschiedliche Pfadlängen, da eine kreisfreier Pfad jeden Knoten nur einmal enthalten kann.
Anzahl der Schleifendurchläufe ist durch kV k · 2kEk begrenzt und die Komplexität von Ford-Fulkerson ergibt sich zu O(kV k · kEk2).
Maximales Matching
• Gegeben ist ein bipartiter Graph G = (V, E).
• Gesucht ist ein maximales Matching.
G = (V, E) ist bipartit, falls
• V = V1 ∪ V2
• V1 ∩ V2 = ∅
• für alle (u, v) ∈ E gilt u ∈ V1 gdw. v 6∈ V1.
Ein Matching ist eine Teilmenge der Kantenmenge, so dass keine zwei Kanten einen Knoten gemeinsam besitzen.
Ein Matching ist maximal, wenn kein anderes Matching mehr Kanten enthält.
Bipartiter Graph, Beispiel
G = (V1, V2, E) mit V1 = {a, b, c, d, e} und V2 = {1,2,3,4,5} mit
a 1
b 2
c 3
d 4
e 5
Matching, Beispiel
G = (V1, V2, E) mit V1 = {a, b, c, d, e} und V2 = {1,2,3,4,5} mit
a 1
b 2
c 3
d 4
e 5
Matching M = {(a,1),(b,3),(c, 2)}.
Maximales Matching und Maximaler Fluss
Maximales Matching kann mit Ford-Fulkerson gelöst werden.
Reduktion: Gegeben bipartiter Graph G = (V1 ∪ V2, E).
Das Netzwerk G′ entsteht aus dem Graphen G, wobei
• In G zwei zusätzliche Knoten eingefügt werden
• eine Quelle s und
• eine Senke t.
• Die Quelle s wird mit jedem Knoten aus V1 durch eine Kante verbunden.
• Die Knoten aus V2 werden durch Kanten mit der Senke t verbunden.
• Die Kapazität aller Kanten ist 1.
Maximales Matching und Maximaler Fluss, Beispiel
a 1
b 2
s c 3 t
d 4
e 5
Alle Kanten haben Kapazität 1.
Maximales Matching und Maximaler Fluss
Sei f ein maximaler Fluss in G′. Ein maximales Matching enthält alle Kanten zwischen V1 und V2, deren Fluss f gleich 1 ist.
Reduktion liefert ein Matching. Der Fluss von der Quelle zu jedem Knoten aus V1 ist entweder gleich 0 oder 1. Ebenso ist der Fluss von jedem Knoten aus V2 zur Senke entweder gleich 0 oder 1. Daher folgt mit dem Kirchhoffschen Gesetz:
• Der Fluss zwischen Knoten aus V1 und V2 ist entweder 0 oder 1.
• Für jeden Knoten u aus V1 ist f(u, v) = 1 für höchstens einen Knoten v ∈ V2.
• Für jeden Knoten v aus V2 ist f(u, v) = 1 für höchstens einen Knoten u ∈ V1.
Maximales Matching und Maximaler Fluss
Reduktion liefert ein maximales Matching.
Angenommen das Matching wäre nicht maximal, das heißt, es gibt ein Matching M mit mehr als |f| Kanten. Wir zeigen, dass daraus folgt, dass |f| kein maximaler Fluss ist.
Betrachte Fluss g mit
• g(s, u) = g(u, v) = g(v, t) = 1 (und g(u, s) = g(v, u) = g(t, v) = −1) für alle Kanten (u, v) des Matchings M.
• g(u, v) = 0 für alle anderen Kanten.
• Da es für jeden Knoten u ∈ V1 höchstens einen Knoten v mit g(u, v) = 1 gibt und es für jeden Knoten v ∈ V2 höchstens einen Knoten u mit g(u, v) = 1 gibt, gilt das Kirchhoffschen Gesetz.