Graphenalgorithmen

Werbung
Vorlesung
Graphenalgorithmen
Sommersemester 2005
Angelika Steger
ETH Zürich
3. Mai 2006
2
Teile des vorliegenden Skriptes sind Erweiterungen des Skript zu meiner Vorlesung Effiziente Algorithmen
und Datenstrukturen II, die ich im Sommersemester 1997 an der TU München gehalten habe. Das Skript
zu meiner damaligen Vorlesung wurde von den Studenten der Vorlesung geschrieben, denen ich an dieser
Stelle nochmals für ihren Einsatz danken möchte: Markus Ebersberger, Maximilian Fischer, Alexander
Hall, Sebastian Heupel, Thomas Schickinger und Ulrich Voll.
Inhaltsverzeichnis
1 Flüsse in Netzwerken
5
1.1
Einführung und Definitionen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5
1.2
Der Algorithmus von Ford–Fulkerson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.2.1
Augmentierende Pfade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
1.2.2
Korrektheit für ganzzahlige Netzwerke, Max–Flow–Min–Cut–Theorem . . . . . . .
8
1.2.3
Anmerkungen und Erweiterung auf nichtganzzahlige Netzwerke . . . . . . . . . . .
10
Die Push-/Relabel–Methode nach Goldberg und Tarjan . . . . . . . . . . . . . . . . . . .
12
1.3
2 Matching Probleme
19
2.1
Definition und Beispiele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.2
Das ungewichtete Matchingproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.2.1
Augmentierende Pfade . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
20
2.2.2
Bipartite Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
2.2.3
Matching in allgemeinen Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . .
28
Das gewichtete Matchingproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
2.3.1
Bipartite Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
2.3.2
Exkurs: Die primal-duale Methode der linearen Programmierung . . . . . . . . . .
34
2.3.3
Allgemeine Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
2.3
3 Das Rundreiseproblem
3.1
43
Exakte Lösungsverfahren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
3.1.1
Dynamische Programmierung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
44
3.1.2
Branch and Bound . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
3.2
Das Rundreiseproblem mit Dreiecksungleichung . . . . . . . . . . . . . . . . . . . . . . . .
48
3.3
Das euklidische Rundreiseproblem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
49
4 Planare Graphen
51
4.1
Eigenschaften planarer Graphen
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
51
4.2
Planaritätstest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
52
4.3
Zeichnen von planaren Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
66
3
4
INHALTSVERZEICHNIS
5 Separatoren
69
5.1
Separatoren in planaren Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
70
5.2
Anwendungen des Separatorensatzes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
6 Beschränkte Baumweite
77
6.1
Baumzerlegung und Baumweite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
79
6.2
Algorithmische Konsequenzen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
80
6.3
Partielle k-Bäume . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
82
6.4
Bestimmung einer Baumzerlegung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
84
Kapitel 1
Flüsse in Netzwerken
1.1
Einführung und Definitionen
In diesem Kapitel betrachten wir so genannte Netzwerke N = (V, A, c, s, t). Hierbei sei
D = (V, A)
s∈V
t∈V
c : A → R≥0
ein gerichteter Graph,
die Quelle (engl.: source),
die Senke (engl.: target) und
eine nicht-negative Kapazitätsfunktion.
Intuitiv stelle man sich unter einem Netzwerk beispielsweise ein Röhrensystem vor, bei dem die Kanten
des Graphen den Rohren entsprechen und die Knoten den Kreuzungspunkten der Rohre. Es soll nun
z. B. eine Flüssigkeit von der Quelle s zur Senke t transportiert werden. Diese Flüssigkeit darf nur an
der Quelle bzw. Senke eingespeist werden bzw. abfliessen. An allen anderen Kreuzungspunkten geht
keine Flüssigkeit verloren. Jedes Rohr transportiert die Flüssigkeit nur in eine vorgegebene Richtung.
Ausserdem kann jedes Rohr nur bis zu einer gewissen Obergrenze, der Kapazität, Flüssigkeit aufnehmen.
Formal lässt sich dies wie folgt beschreiben:
Definition 1.1 Eine Abbildung f : A → R heisst s–t–Fluss, falls
1.
P
u∈Γ+ (v)
f (v, u) =
2. 0 ≤ f (a) ≤ c(a)
P
u∈Γ− (v)
∀a ∈ A
f (u, v)
∀v ∈ V \ {s, t}
(Flusserhaltung)
(Zulässigkeit)
Hier bezeichnet Γ+ (v) die von v aus erreichbaren Nachbarknoten, also Γ+ (v) := {u ∈ V : (v, u) ∈ A}.
Analog bezeichnet Γ− (v) die Menge der Knoten, von denen aus v direkt erreicht werden kann, also
Γ− (v) := {u ∈ V : (u, v) ∈ A}.
Definition 1.2 Der Wert w(f ) eines Flusses f ist definiert durch
X
X
f (u, s)
f (s, u) −
w(f ) =
u∈Γ+ (s)
u∈Γ− (s)
Anschaulich gibt also der Wert an, um wie viel die an der Quelle ins Netzwerk gepumpte Flüssigkeitsmenge
die dort abfliessende Menge übertrifft. Diese Definition ist äquivalent zur Flüssigkeitsmenge, die an der
Senke mehr zu- als abfliesst:
Proposition 1.3 Für ein Netzwerk mit gegebenem s–t–Fluss f gilt
X
X
w(f ) =
f (u, t) −
f (t, u)
u∈Γ+ (t)
u∈Γ− (t)
5
6
KAPITEL 1. FLÜSSE IN NETZWERKEN
Beweis:
Folgt unmittelbar aus
X
X
f (v, u) =
v∈V u∈Γ+ (v)
X
X
f (u, v)
v∈V u∈Γ− (v)
durch Umsortieren der Summanden und Anwendung von Teil 1 der Definition 1.1.
Definition 1.4 Ein s–t–Fluss f0 mit w(f0 ) = max{w(f ) : f ist s–t–Fluss} heisst maximaler Fluss.
In den folgenden Abschnitten betrachten wir nun das
MaxFlow-Problem:
Geg.: Ein Netzwerk mit nicht-negativer Kapazitätsfunktion N = (V, A, c, s, t)
Ges.: Bestimme einen maximalen Fluss f .
Diese Fragestellung spielt bei zahlreichen Anwendungen ein Rolle. Man denke hierbei z. B. an ein Transportnetzwerk, bei dem durch optimale Zuordnung der zu transportierenden Güter zu den einzelnen Transportwegen ein maximaler Gesamtdurchsatz erreicht werden soll. Neben solchen direkten Anwendungen
tritt das MaxFlow-Problem aber auch oft als Subproblem anderer Probleme auf1 .
Die nächste Proposition stellt sicher, dass die Suche nach einem maximalen Fluss immer sinnvoll ist.
Proposition 1.5 In jedem Netzwerk gibt es einen maximalen Fluss.
Beweis: Betrachte F = { f : f ist s–t–Fluss } ⊂ R|A| .
Diese Menge ist abgeschlossen und beschränkt. Daraus folgt, dass jede Funktion auf F , also insbesondere
auch f : F → R, f 7→ w(f ) auf F ihr Maximum annimmt.
1.2
Der Algorithmus von Ford–Fulkerson
Diesem Algorithmus liegt folgende einfache Idee zugrunde: Starte mit f ≡ 0 und vergrössere w(f ) schrittweise, solange dies möglich ist.
Dazu betrachten wir spezielle Pfade im Graphen.
1.2.1
Augmentierende Pfade
Definition 1.6 Für einen Fluss f in einem Netzwerk N heisst eine Folge s = v0 , v1 , . . . , vk−1 , vk = x
ein augmentierender s − x–Pfad, falls für alle i ∈ {0, . . . , k − 1} gilt:
1.
2.
e = (vi , vi+1 ) ∈ A und f (e) < c(e)
oder
e = (vi+1 , vi ) ∈ A und f (e) > 0
(e heisst Vorwärtskante)
(e heisst Rückwärtskante)
Anschaulich besagt dies, dass man entlang eines augmentierenden Pfades mehr Flüssigkeit transportieren
kann, als dies im aktuellen Fluss f der Fall ist. Auf den Vorwärtskanten ist die Kapazität noch nicht
erschöpft, d. h. dort kann noch mehr durchgepumpt“ werden. Auf den Rückwärtskanten liegt ein von
”
Null verschiedener Fluss entgegen des augmentierenden Pfades vor, der echt verringert werden kann.
Abbildung 1.1 zeigt ein Beispiel für dieses Vorgehen. Die Beschriftung der Kanten besteht aus Paaren
(c(e), f (e)). Entlang des gestrichelt markierten augmentierenden Pfades kann der Fluss um eins erhöht
werden. Dadurch steigt der Wert des Flusses von eins auf zwei und erreicht dadurch den Maximalwert
für diesen Graphen.
Das folgende Lemma präzisiert die Eigenschaften der augmentierenden Pfade.
1 Vgl.
hierzu spätere Kapitel der Vorlesung.
1.2. DER ALGORITHMUS VON FORD–FULKERSON
v1
1/1
t
1/1
v1
1/1
)
=
s
1/1
1/1
1/0
1/0
1/1
s
1/0
7
v2
1/1
t
v2
Abbildung 1.1: Erhöhung des Flusses entlang eines augmentierenden Pfades
Lemma 1.7 Sei f ein s–t–Fluss und s = v0 , v1 , . . . , vk−1 , vk = t ein augmentierender s–t–Pfad P . Dann
gilt:
Für jedes δ > 0 mit
δ ≤ min({c(a) − f (a) : a ∈ P, a Vorwärtskante} ∪ {f (a) : a ∈ P, a Rückwärtskante})
ist


f (a) + δ
fδ (a) = f (a) − δ


f (a)
falls a ∈ P, a Vorwärtskante
falls a ∈ P, a Rückwärtskante
sonst
ein s–t–Fluss mit Wert w(fδ ) = w(f ) + δ.
Beweis: Zu überprüfen ist die Definition 1.1:
Die Zulässigkeit folgt unmittelbar aus der Definition von fδ .
Zum Nachweis der Flusserhaltung betrachten wir einen beliebigen Knoten v ∈ V \ {s, t}:
1. Fall: v liegt nicht auf P . Hier ist nichts zu zeigen.
2. Fall: v = vi ∈ P für ein i ∈ {1, . . . , k − 1}.
Je nachdem, ob es sich bei den an v angrenzenden Kanten auf dem Pfad um Vorwärts- oder Rückwärtskanten handelt, sind vier Fälle zu unterscheiden, die in Abbildung 1.2 dargestellt sind.
s
s
s
s
+
+
v
+
v
v
+
v
t
t
t
t
Abbildung 1.2: Verschiedene Fälle bei der Modifikation von f entlang eines augmentierenden Pfades
Offensichtlich bleibt in jedem Fall die Flusserhaltung erfüllt.
w(fδ ) = w(f ) + δ folgt sofort aus der Veränderung von f auf der Kante (s, v1 ).
Die vorangegangenen Überlegungen führen schliesslich zu folgendem Algorithmus:
8
KAPITEL 1. FLÜSSE IN NETZWERKEN
Alg. von Ford–Fulkerson
(1)
Setze f ≡ 0;
(2)
Finde augmentierenden s-t Pfad P bzgl. f ;
Falls keiner existiert: Stopp, gib f aus;
(3)
Setze
δ := min({c(a) − f (a) : a ∈ P, a Vorwärtskante} ∪ {f (a) | a ∈ P, aRückwärtskante});
und


f (a) + δ
f (a) := f (a) − δ


f (a)
Zurück zu (2);
1.2.2
a ∈ P, a Vorwärtskante
a ∈ P, a Rückwärtskante
sonst.
Korrektheit für ganzzahlige Netzwerke, Max–Flow–Min–Cut–Theorem
Bevor wir die Korrektheit des Algorithmus von Ford–Fulkerson untersuchen, benötigen wir noch eine
neue Definition:
Definition 1.8 Sei N ein Netzwerk und W ⊂ V eine Knotenmenge mit s ∈ W und t 6∈ W . Dann heisst
(W, W ) ein s–t–Schnitt.
Die Kapazität des Schnitts ist definiert als
X
c(W, W ) =
c(v, u)
(v,u)∈A
v∈W,u6∈W
Zwischen Flüssen und Schnitten besteht ein direkter Zusammenhang:
Proposition 1.9 Für jeden s–t–Fluss f und jeden s–t–Schnitt (W, W ) gilt:
X
X
f (u, v) ≤ c(W, W )
f (v, u) −
w(f ) =
(u,v)∈A
u6∈W,v∈W
(v,u)∈A
v∈W,u6∈W
Beweis:
w(f )
=
X
u∈Γ+ (s)
=
X
f (s, u) −
X
v∈W u∈Γ+ (v)
=
X
(v,u)∈A
v∈W
=
(v,u)∈A
v∈W,u6∈W
≤
X
(v,u)∈A
v∈W,u6∈W
f (u, s)
u∈Γ− (s)
f (v, u) −
f (v, u) −
X
X
X
X
X
v∈W u∈Γ− (v)
f (u, v)
(u,v)∈A
v∈W
f (v, u) −
X
f (u, v)
(u,v)∈A
u6∈W,v∈W
f (v, u) ≤ c(W, W )
f (u, v)
(wegen Flusserhaltung)
1.2. DER ALGORITHMUS VON FORD–FULKERSON
9
Anschaulich besagt die Proposition 1.9, dass jeder Fluss auf dem Weg von der Quelle zur Senke die Grenze
zwischen einer Partition (W, W ) der Knoten mit s ∈ W vollständig passieren muss. Die Bilanz zwischen
dem Fluss aus W hinaus und in W hinein entspricht genau dem Fluss, der an der Quelle entsteht bzw.
an der Senke abfliesst.
Da die Ungleichung in Proposition 1.9 für alle Flüsse und alle Schnitte gilt, ergibt sich daraus unmittelbar
folgendes Korollar:
Korollar 1.10 Für jedes Netzwerk gilt
max
f s–t–Fluss
w(f )
≤
c(W, W )
min
(W,W ) s–t–Schnitt
Nun sind wir in der Lage, die folgende Aussage über die Korrektheit und Laufzeit des Algorithmus von
Ford–Fulkerson zu formulieren:
Satz 1.11 Für Netzwerke mit einer ganzzahligen Kapazitätsfunktion c : A → N0 terminiert der Algorithmus von Ford–Fulkerson nach höchstens |V |cmax Augmentierungsschritten mit einem (ganzzahligen)
maximalen Fluss, wobei cmax = max{c(s) : a ∈ A}.
Beweis: Lemma 1.7 garantiert, dass der Fluss nach jeder Iteration des Algorithmus zulässig ist. Ausserdem ist klar, dass der Fluss immer ganzzahlig ist, d. h., dass f (e) ∈ N0 ∀e ∈ A, da der Nullfluss zu
Beginn des Algorithmus diese Bedingung erfüllt und alle Operationen während der Iteration (Minimumsbildung, Addition und Subtraktion) die Ganzzahligkeit erhalten.
Da der Fluss in jedem Iterationsschritt echt erhöht wird und ganzzahlig bleibt, muss er also jedes mal
um mindestens eins wachsen. Jede von der Quelle s ausgehende Kante kann also höchstens cmax –mal an
einem augmentierenden Pfad beteiligt sein. Da jeder augmentierende s–t–Pfad eine solche Kante enthalten
muss und s weniger als |V | direkte Nachbarn hat, folgt unmittelbar die Oberschranke für die Anzahl der
Iterationen2 .
Es bleibt also nur noch zu zeigen, dass der Fluss f0 , mit dem der Algorithmus terminiert, maximal ist.
Hierzu betrachten wir W = {x ∈ V : es existiert ein augmentierender s–x–Pfad bezüglich f0 }.
Es gilt s ∈ W nach Definition und ausserdem t 6∈ W , da der Algorithmus sonst einen augmentierenden
s–t–Pfad gefunden und nicht terminiert hätte. D. h. (W, W ) ist ein s–t–Schnitt.
Nach Definition von W gilt:
1. f0 (x, v) = c(x, v)
∀(x, v) ∈ A mit x ∈ W, v 6∈ W
2. f0 (u, x) = 0 ∀(u, x) ∈ A mit u 6∈ W, x ∈ W
Wenn man diese Werte in Proposition 1.9 einsetzt, so erhält man
w(f0 ) = c(W, W ) ≥
max
f s–t–Fluss
w(f )
wobei sich die Ungleichung aus Korollar 1.10 ergibt. Daraus folgt dann unmittelbar die Behauptung.
Aus Theorem 1.11 können wir direkt folgende Verschärfung von Proposition 1.5 ableiten.
Korollar 1.12 Ist N = (V, A, C, s, t) ein Netzwerk mit ganzzahligen Kapazitäten, so existiert ein ganzzahliger maximaler Fluss.
Ergänzend wollen wir noch ein bekanntes Resultat der Graphentheorie angeben.
2 Da uns, wie immer, nur die Grössenordnung interessiert, verzichten wir auf weitere Argumente, diese Schranke noch
um eins oder zwei zu erniedrigen
10
KAPITEL 1. FLÜSSE IN NETZWERKEN
Satz 1.13 (Max–Flow–Min–Cut–Theorem)
Für jedes Netzwerk N = (V, A, C, s, t) gilt:
max
f s–t–Fluss
w(f )
=
c(W, W )
min
(W,W ) s–t–Schnitt
Beweis:
≤“ haben wir in Korollar 1.10 bereits gezeigt. Bleibt also nur noch ≥“ nachzuweisen.
”
”
Betrachte hierzu einen maximalen Fluss f0 , der nach Proposition 1.5 immer existiert. Bezüglich f0 definiere man eine Menge W0 genauso wie im Beweis von Theorem 1.11. Genau dieselbe Argumentation wie
dort liefert w(f0 ) ≥ c(W0 , W0 ).
1.2.3
Anmerkungen und Erweiterung auf nichtganzzahlige Netzwerke
Anzahl der Iterationen
Die in Theorem 1.11 angegebene Schranke für die Anzahl der Iterationen ist bis auf eine Konstante
bestmöglich. Man betrachte hierzu das Netzwerk in Abbildung 1.3.
v1
c
s
c
c
1
c
t
v2
Abbildung 1.3: Worst–case–Beispiel für Ford–Fulkerson
Wenn der Algorithmus abwechselnd die augmentierenden Pfade s, v1 , v2 , t und s, v2 , v1 , t wählt, so sind 2c
Iterationen nötig. Daraus folgt, dass der Algorithmus von Ford–Fulkerson kein effizienter, d. h. polynomieller Algorithmus ist, da die Kapazitäten mit O(log cmax ) Bits kodiert werden können. Wenn man also
hinreichend grosse Kapazitäten zulässt, so ist die Laufzeit des Algorithmus exponentiell in der Grösse der
Eingabe.
Dennoch kann der Algorithmus von Ford–Fulkerson unter gewissen Umständen in der Praxis erfolgreich
eingesetzt werden. Beispielsweise lässt sich das Problem der Suche nach einem Maximum Matching3 in
einem bipartiten Graphen auf ein MaxFlow–Problem in einem Netzwerk mit Kapazitäten c(e) = 1
transformieren. Dazu erweitert man den bipartiten Graphen um zwei neue Knoten s und t, die als Quelle
und Senke des Netzwerks dienen. Von s aus werden Kanten zu allen Knoten einer Partition gezogen und
alle Knoten der anderen Partition werden mit t verbunden. Diese neuen Kanten und alle Kanten des
ursprünglichen Graphen werden von der Quelle zur Senke gerichtet. Es ist leicht einzusehen, dass genau
die Kanten mit einem Fluss gleich eins in der Lösung des MaxFlow–Problems ein Maximum Matching
bilden. Dieses Flussproblem kann der Algorithmus von Ford–Fulkerson in O(n) Iterationsschritten lösen,
wobei n = |V |.
Nichtganzzahlige Kapazitäten: Algorithmus von Edmonds und Karp
Theorem 1.11 lässt sich leicht auf rationale Kapazitätsfunktionen erweitern, indem man die Kapazitäten
mit dem Hauptnenner durchmultipliziert und auf diese Weise ein äquivalentes Netzwerk erhält, das die
Voraussetzungen von Theorem 1.11 erfüllt.
Für irrationale Kapazitäten kann der Algorithmus von Ford–Fulkerson völlig versagen, wie das folgende
Beispiel zeigt:
3 Dieser
Begriff wird in einem späteren Kapitel genau definiert.
1.2. DER ALGORITHMUS VON FORD–FULKERSON
Beispiel 1.14 Es seien φ =
Netzwerk:
√
5−1
2 ,
ci = φi und S =
11
P∞
i=0 ci
=
1
1−φ .
Weiter betrachte man folgendes
co
s
c1
t
c2
wobei die drei horizontalen Kanten Kapazitäten c0 , c1 und c2 und alle übrigen Kanten Kapazität S haben.
Durch Induktion kann man sich davon überzeugen, dass der Ford-Fulkerson Algorithmus augmentierende
Pfade stets so wählen kann, dass sich der Fluss in de i-ten Iterationen genau ci−1 erhöht. Der Wert der
gefundenen Flüsse konvergiert somit gegen S. [Um dies einzusehen, überprüft man zunächst, dass für alle
i ∈ N gilt: ci+1 = ci−1 − ci . Die Idee ist nun, Pfade so zu wählen, dass nach i ≥ 2 Iterationen die Flüsse
über die drei horizontalen Kanten genau ci , ci−1 und 0 betragen. Für die (i + 1)te Iteration wählt man
dann einen Pfad, der die Kante mit Fluss 0 vorwärts durchläuft und die beiden anderen horizontalen
Kanten rückwärts. Der Fluss wir daher um ci erhöht und die neuen Flüsse über die horizontalen Kanten
betragen dann 0, ci−1 − ci = ci+1 und ci , was zu zeigen war.] Der Wert eines maximalen Flusses ist
jedoch 3S.
Wir suchen deshalb eine Modifikation des Algorithmus von Ford–Fulkerson, der die folgenden zwei Ziele
erreicht:
1. Der Algorithmus soll auch für irrationale Kapazitätsfunktionen funktionieren.
2. Die Laufzeit, bzw. die Anzahl der Iterationen soll nur noch von der Grösse des Graphen abhängen,
nicht aber von der Grösse der Kapazitäten.
Bei der Implementierung des Algorithmus von Ford–Fulkerson hat man noch eine wichtige Wahlmöglichkeit, nämlich die Auswahl des augmentierenden Pfades, entlang dem der Fluss erhöht wird. Edmonds und
Karp haben gezeigt, dass man durch geschickte Durchführung dieses Schritts die beiden oben genannten
Ziele erreichen kann. Ihre Variante des Algorithmus von Ford–Fulkerson wählt in jedem Iterationsschritt
einen kürzesten (bezüglich der Anzahl von Kanten) augmentierenden Pfad aus. Dieser lässt sich leicht
durch Breitensuche bestimmen.
Da der Beweis zur Laufzeit des Algorithmus von Edmonds und Karp kompliziert ist und wir ausserdem
im nächsten Kapitel einen noch schnelleren Algorithmus betrachten werden, sei hier nur das Ergebnis
ohne Beweis angegeben.
Satz 1.15 Der Algorithmus von Edmonds und Karp terminiert für jedes Netzwerk nach höchstens (nm)/2
Iterationen mit einem maximalen Fluss, wobei m = |A| und n = |V |.
12
KAPITEL 1. FLÜSSE IN NETZWERKEN
1.3
Die Push-/Relabel–Methode nach Goldberg und Tarjan
Die Idee von Goldberg/Tarjan besteht darin, am Anfang die Quelle voll aufzudrehen“, d. h. auf allen
”
Ausgängen der Quelle schöpft man die Kapazitäten voll aus. Danach wird der Fluss iterativ weiter Rich”
tung Senke“ geleitet (Push–Aktion), soweit es die Kapazitäten und die am jeweiligen Knoten verfügbare
Flüssigkeit erlauben. Wenn der Fluss irgendwann bei der Senke angekommen ist und aufgrund der beschränkten Kapazitäten ins Stocken“ gekommen ist, werden eventuell noch vorhandene überschüsse
”
zurück zur Quelle geleitet und der Hahn wieder etwas zugedreht“.
”
Für diese Methode benötigen wir die Voraussetzung, dass D = (V, A) symmetrisch ist, d. h. dass
(u, v) ∈ A =⇒ (v, u) ∈ A, damit wir die Flüssigkeit sowohl von der Quelle zur Senke, als auch wieder zurück transportieren können. Dies kann man durch Hinzufügen von Kanten (x, y) mit c(x, y) = 0
immer erreichen und stellt somit keine Einschränkung dar.
Während der Iterationen des Algorithmus betrachten wir nicht mehr echte Flüsse, sondern Pseudoflüsse
bzw. (genauer) Präflüsse. Diese Begriffe werden in den folgenden Definitionen eingeführt.
Definition 1.16 Eine Abbildung f : A → R heisst Pseudofluss, wenn gilt:
1. f (u, v) ≤ c(u, v) für alle (u, v) ∈ A und
2. f (u, v) = −f (v, u) für alle (u, v) ∈ A.
Definition 1.17 Gegeben sei ein Netzwerk mit einem Pseudofluss f . Als Überschuss (engl.: excess) ef (v)
im Knoten v bezeichnen wir
X
f (u, v)
ef (v) :=
(u,v)∈A
Hinter dieser einfachen Summe verbirgt sich im Grunde die Bilanz zwischen Zu- und Abfluss im Knoten
v. Diese kurze Formulierung wird durch den 2. Teil von Definition 1.16 ermöglicht. Fluss nach v hinein
taucht in der Summe als positiver Summand auf und Fluss aus v heraus wird im Gegenzug als negativer
Summand berücksichtigt.
Definition 1.18 Ein Präfluss (engl. preflow) ist ein Pseudofluss mit ef (v) ≥ 0 für alle v ∈ V \ {s, t}.
Zwischen einem Pseudofluss f und einem echten“ Fluss nach Definition 1.1 besteht ein enger Zusam”
menhang. Wenn man nämlich erreicht, dass alle Überschüsse abgebaut sind, d. h., dass ef (v) = 0 für alle
v ∈ V \ {s, t}, dann kann man leicht einen Fluss f ′ angeben durch
(
f (a) falls f (a) > 0
′
f (a) =
0
sonst,
Während der Algorithmus überschüssigen Fluss zur Senke oder, wenn deren Aufnahmefähigkeit erschöpft
ist, zurück zur Quelle transportiert, betrachten wir die sogenannten aktiven Knoten.
Definition 1.19 Alle Knoten mit v ∈ V \ {s, t} mit ef (v) > 0 bezeichnen wir als aktive Knoten.
Beim Abbau von überschüssigem Fluss interessieren uns Kanten, über die wir noch Fluss transportieren
können.
Definition 1.20 Die Restkapazität cf (a) einer Kante a ist definiert durch cf (a) = c(a) − f (a).
Definition 1.21 Wenn wir nur Kanten mit positiver Restkapazität betrachten, erhalten wir den Restgraph Df = (V, Af ), wobei Af = {a ∈ A | cf (a) > 0}.
1.3. DIE PUSH-/RELABEL–METHODE NACH GOLDBERG UND TARJAN
13
Als letztes benötigen wir nun noch einen Begriff, der es uns erlaubt festzulegen, wann wir über welche
Kante zusätzlichen Fluss schicken dürfen. Hierzu führen wir eine Funktion d ein, die jedem Knoten eine
“Höhe“ zuordnet. Im Algorithmus werden wir sicherstellen, dass zusätzlicher Fluss immer nur zwischen
Knoten verschickt wird, deren Höhe sich um genau den Wert 1 unterscheidet (und zwar vom höheren
zum niedrigeren Knoten). Dadurch dass man die Knoten sukzessive anhebt, kann auf diese Weise Fluss
zunächst Richtung Senke und danach überschüssigen Fluss wieder zurück zur Quelle schicken.
Definition 1.22 Gegeben sei ein Netzwerk mit Pseudofluss f . Eine Abbildung d : V → N0 mit
1. d(s) = n, d(t) = 0 und
2. d(u) ≤ d(v) + 1 für alle (u, v) ∈ Af .
heisst zulässige Markierung.
Lemma 1.23 Ist f ein Präfluss und d eine zulässige Markierung, dann gibt es in Df keinen s–t–Pfad.
Beweis: Wir führen einen Beweis durch Widerspruch. Sei also s = v0 , . . . , vl = t ein s–t–Pfad in Df .
Dann ist (vi−1 , vi ) ∈ Af für alle i ∈ {1, . . . , l} und l ≤ n − 1.
Nach Definition gilt für die Markierung:
n = d(s) = d(v0 ) ≤ d(v1 ) + 1 ≤ (d(v2 ) + 1) + 1 ≤ . . . ≤ d(vl ) + l = d(t) + l = 0 + l ≤ n − 1
Damit haben wir den gewünschten Widerspruch erhalten.
Bemerkung 1.24 Im Beweis von Theorem 1.11 (bei der Definition der Menge W ) haben wir bereits
folgende Aussage gesehen:
Wenn f ein Fluss ist, dann gilt: f maximal ⇐⇒ Df enthält keinen s–t–Pfad.
Lemma 1.25 Ist f ein Präfluss und v ein aktiver Knoten, dann gibt es in Df einen Pfad von v nach s,
d. h. Überschuss kann immer zurück zur Quelle transportiert werden.
Beweis:
Sei W = {w ∈ V : w ist in Df von v aus erreichbar}.
Wir nehmen nun an, dass s 6∈ W und führen dies zum Widerspruch.
Betrachte alle Kanten (u, w) ∈ A die über den Rand“ der Partition von W nach W hinein führen, d. h.
”
mit u 6∈ W und w ∈ W . Es gilt:
(w, u) 6∈ Af
0≤
X
w∈W
=⇒
ef (w) =
f (w, u) = c(w, u) ≥ 0
X X
w∈W u∈V
f (u, w) =
X
=⇒
X
w∈W u∈V \W
|
{z
≤0
f (u, w) = −f (w, u) ≤ 0
f (u, w) +
}
X X
w∈W u∈W
|
{z
=0
f (u, w) ≤ 0
}
Das heisst ef (w) = 0 für alle w ∈ W und damit insbesondere auch ef (v) = 0. Dies widerspricht unserer
Annahme, dass v ein aktiver Knoten ist.
Der eigentliche Algorithmus sieht folgendermassen aus:
14
KAPITEL 1. FLÜSSE IN NETZWERKEN
Basisalgorithmus
// Initialisierung
for all (u, v) ∈ A {
f (u, v) := 0;
if u = s then f (u, v) := c(u, v);
if v = s then f (u, v) := −f (v, u);
}
for all v ∈ V P
{
ef (v) = w:(w,v)∈A f (w, v);
if v = s then d(v) := n else d(v) := 0;
}
// Hauptschleife
while ( ∃ aktiver Knoten )
Führe eine (zulässige) Update-Operation durch;
Update-Prozeduren
Push(v, w)
Anwendbarkeit: v aktiv, (v, w) ∈ Af und d(v) = d(w) + 1
Sende δ := min{ef (v), cf (v, w)} Flusseinheiten von v nach w;
Relabel(v)
Anwendbarkeit: v aktiv und ∀w ∈ Γ+ (v) gilt (v, w) 6∈ Af oder d(w) ≥ d(v)
d(v) := min{d(w) + 1|w ∈ Γ+ (v) mit (v, w) ∈ Af };
Lemma 1.26 Invarianten des Basisalgorithmus sind:
a) In Relabel(v) wird d(v) um mindestens 1 erhöht.
b) f ist immer ein Präfluss und d eine zulässige Markierung.
c) Für einen aktiven Knoten v kann immer eine der Operationen Push oder Relabel ausgeführt werden.
d) d(v) ≤ 2n − 1
∀v ∈ V .
Beweis:
a) klar.
b) Wegen der Wahl von δ ist klar, dass f ein Präfluss ist. Mit Induktion über die Anzahl der Push /
Relabel Aufrufe zeigen wir, dass d eine zulässige Markierung ist.
Induktionsbeginn klar.
Induktionsannahme d ist nach k Push / Relabel Aufrufen eine zulässige Markierung.
Induktionsschluss k ; k + 1 Aufrufe. Wir betrachten die (k+1)te Ausführung einer Push / Relabel
Prozedur. Hierbei unterscheiden wir, ob dies ein Push oder ein Relabel Aufruf ist.
Relabel(v): Es wird nur d(v) geändert.
• Für (w, v) ∈ Af gilt
Ind. Ann.
d(w)
≤
dalt (v) + 1
≤
dneu (v) + 1
a)
• Für (v, w) ∈ Af gilt
dneu (v)
nach Konstruktion.
≤
d(w) + 1
1.3. DIE PUSH-/RELABEL–METHODE NACH GOLDBERG UND TARJAN
15
Push(v, w): Es gibt folgende mögliche Auswirkungen:
• (v, w) wird aus Df entfernt. Dadurch bleibt d sicherlich eine zulässige Markierung.
• (w, v) wird zu Df hinzugefügt. Zu zeigen ist in diesem Fall: d(w) ≤ d(v) + 1. Dies gilt
nach Konstruktion, da Push(v, w) nur ausgeführt wird, wenn d(v) = d(w) + 1.
c) Für alle (v, w) ∈ Af gilt d(v) ≤ d(w) + 1. Falls Push(v, w) nicht anwendbar ist, gilt d(v) < d(w) +
1 ∀(v, w) ∈ Af , d.h. Relabel(v) ist anwendbar.
d) Nach Lemma 1.25 existiert im Graphen Df ein Pfad p = (v0 = v, v1 , v2 , . . . , vl = s) von v nach s.
D.h.
l ≤ 2n − 1
d(v) = d(v0 ) ≤ d(v1 ) + 1 ≤ · · · ≤ d(vl ) + l = d(s) + |{z}
|{z}
=n
≤n−1
Als unmittelbare Folgerung erhalten wir aus Lemma 1.26:
Korollar 1.27 Der Basisalgorithmus terminiert mit einem maximalen Fluss.
Als nächstes wollen wir noch die maximale Laufzeit des Basisalgorithmus abschätzen. Dazu werden wir
zunächst Aussagen über die maximal mögliche Anzahl von Push bzw. Relabel Aufrufen herleiten.
Lemma 1.28 Die Anzahl der Relabelings ist kleiner gleich 2n2 .
Beweis: Pro Knoten v ∈ V \{s, t} kommen höchstens 2n − 1 Relabelings vor ⇒ Insgesamt sind es
maximal (n − 2) · (2n − 1) ≤ 2n2 .
Es soll nun auch eine obere Schranke für die Anzahl der Pushs gefunden werden. Dazu unterscheidet
man zwischen saturierten und nicht saturierten Pushs. Erstere schöpfen die Restkapazität einer Kante
voll aus, letztere nicht.
Lemma 1.29 Die Anzahl der saturierten Pushs ist kleiner gleich n · m.
Beweis: Wir betrachten die Kante (v, w) ∈ A. Ein saturierter Push v → w tritt auf, wenn d(v) gleich
d(w) + 1 ist. Anschliessend gilt: (v, w) 6∈ Af . Vor dem nächsten Push von v nach w muss daher ein Push
von w nach v erfolgen., d.h. d(w) muss mindestens um 2 erhöht werden und anschliessend muss d(v) um
mindestens 2 erhöht werden. Daher kann es höchstens n saturierte Pushs v → w geben.
Lemma 1.30 Die Anzahl der nicht saturierten Pushs ist kleiner gleich 2n2 m.
Beweis:
Wir betrachten das Potential φ :=
P
d(v). Wie verändert sich das Potential während
v: aktiv
eines Push bzw. Relabel Aufrufs? Wir unterscheiden hierfür drei Fälle:
nicht saturierter Push v ist danach nicht mehr aktiv, da durch den Push der gesamte Überschuss abtransportiert wurde – die Kapazität der Kante wurde ja nicht voll genutzt. w wird unter Umständen
aktiv, falls der Knoten nicht vorher schon Überschuss hatte ⇒ φ nimmt um mindestens d(v)−d(w) =
1 ab.
saturierter Push Falls vor der Ausführung des Pushs bereits ef (w) > 0 galt, ändert sich am Potential
durch den Push gar nichts. Andernfalls wird w aktiv ⇒ φ nimmt um höchstens d(w) = d(v) − 1 ≤
2n − 2 zu ; insgesamt nimmt φ bei saturierten Pushs um höchstens #saturierter Pushs · (2n − 2) ≤
nm · (2n − 2) zu.
16
KAPITEL 1. FLÜSSE IN NETZWERKEN
Relabel Wir ermitteln die Änderung des Potentials über alle, sagen wir, r Relabels hinweg. Sei di (v) ∀ i =
0 . . . r, ∀ v ∈ V ′ = V \ {s, t} die Markierung von v nach dem i-ten Relabel. Bei dem i-ten Relabel
ändert sich das Potential um folgenden Wert:
X
X
δi =
di (v) −
di−1 (v)
v: aktiv
v: aktiv
Da ein Relabel immer nur bei aktiven Knoten durchgeführt wird, ändert sich bei nicht aktiven
Knoten sicherlich nichts. Daher gilt auch
X
X
δi =
di (v) −
di−1 (v)
v∈V ′
v∈V ′
Nun summieren wir über alle Relabels auf (Anfangs sind alle Markierungen in V ′ gleich 0):
!
r
r
X
X
X
X
X
di (v) −
δi =
di−1 (v) =
dr (v) ≤ 2n2
i=1
i=1
v∈V ′
v∈V ′
v∈V ′
Durch Relabels nimmt das Potential also insgesamt höchstens um 2n2 zu.
⇒ das Potential nimmt insgesamt maximal um nm·(2n− 2)+ 2n2 ≤ 2n2 m (Ohne Einschränkung nehmen
wir an, dass m ≥ n gilt – sonst ist das Flussproblem trivial lösbar ...) durch Relabels und saturierte Pushs
zu. Da das Potential andererseits bei jedem nicht saturiertem Push um mindestens eins abnimmt, ist die
Anzahl der nicht saturierten Pushs somit kleiner gleich 2n2 m.
Aus den vorangehenden drei Lemmas folgt unmittelbar die Endlichkeit des Basisalgorithmus. Für eine
effiziente Implementierung benötigen wir nun noch ein möglichst geschicktes Verfahren für die Auswahl
der nächsten Update-Operation in der Hauptschleife. Dazu führen wir noch eine weitere Prozedur ein:
Push/Relabel(v). Die Prozedur Push/Relabel(v) führt für einen aktiven Knoten v nach Möglichkeit
eine Push, ansonsten eine Relabel Operation durch. Dazu gibt es für jeden Knoten eine Liste der
adjazenten Kanten und eine Referenz current edge auf eine dieser Kanten. Zu Beginn (; Initialisierung)
zeige current edge auf die erste Kante in der Adjazenzliste.
Push/Relabel(v)
Sei {v, w} die derzeitige current edge von v;
if (Push(v, w) anwendbar)
Push(v, w);
else {
if ({v, w} letzte Kante der Kantenliste von v) {
Mache erste Kante der Kantenliste zur current edge;
Relabel(v);
}
else {
Ersetze current edge durch die nächte Kante der Kantenliste;
weiter in der ersten Zeile;
}
}
Lemma 1.31 In Push/Relabel(v) wird Relabel(v) nur ausgeführt, wenn es auch erlaubt ist.
Beweis:
d(w) + 1
Für alle Kanten oberhalb der current edge gilt zu jedem Zeitpunkt cf (v, w) = 0 oder d(v) <
Satz 1.32 Der Basisalgorithmus mit der Push/Relabel Prozedur bestimmt einen maximalen Fluss in
Zeit O(n2 m).
1.3. DIE PUSH-/RELABEL–METHODE NACH GOLDBERG UND TARJAN
17
Beweis: Dass der Algorithmus mit einem maximalen Fluss terminiert wissen wir bereits aus Korollar 1.27. Wir müssen also nur die behauptete Laufzeit nachweisen. Dazu unterscheiden wir vier Posten:
1. Zeit für Relabels,
2. Zeit für saturierte Pushs,
3. Zeit für nicht saturierte Pushs,
4. Zeit für das Durchlaufen der Kantenlisten in Push/Relabel.
Ein Relabel hat die Laufzeit O (deg(v)). An jedem Knoten werden
2n RelaP wegen Lemma 1.26 maximal
P
bels durchgeführt ⇒ die Gesamtlaufzeit für alle Relabels ist O( n · deg(v)) = O(nm) ( deg(v) = 2m).
v
v
Ein Push hat die Laufzeit O(1), wegen Lemma 1.29 und 1.30 haben die Push Operationen insgesamt eine
Laufzeit von O(n2 m). Das Abarbeiten der Kantenliste in der Push/Relabel Routine geschieht höchstens
2n − 1 mal pro Knoten, da es maximal so viele Relabels pro Knoten gibt. Zwischen zwei Relabel-Aufrufen
wird die Adjazenzliste eines jeden Knotens genau einmal durchlaufen.
P Somit ergibt sich als Gesamtlaufzeit
für das Durchlaufen der Kantenlisten in Push/Relabel: O(n · v∈V deg(v)) = O(nm).
Damit ergibt sich folgende Gesamtlaufzeit des Basisalgorithmus:
O(nm) + O(n2 m) + O(nm) = O(n2 m)
Durch eine geschickte Auswahl des nächsten mit Push/Relabel zu bearbeitenden aktiven Knoten, kann
man die Anzahl der nicht saturierten Pushs reduzieren. Diese sind mit O(n2 m) die grössten Laufzeitfresser. Es gibt mehrere Auswahlstrategien, die einfachste (FIFO) werden wir näher betrachten. Bei der
FIFO-Strategie werden die aktiven Knoten in einer Queue nach dem first-in first-out Prinzip gehalten.
Basisalgorithmus mit FIFO-Strategie
// Initialisierung
. . . wie bisher . . .
Füge zusätzliche alle aktiven Knoten in eine Queue Q ein;
// Hauptschleife
while ( Q nicht leer ) {
Entferne den vordersten Knoten v von Q;
repeat {
Push/Relabel(v);
Falls dadurch ein Knoten w aktiv wird, füge ihn am Ende von Q an;
} until ( ef (v) = 0 oder d(v) hat zugenommen )
Falls v noch immer aktiv ist, füge v am Ende von Q an;
}
Satz 1.33 Der Basisgorithmus mit Push/Relabel und FIFO-Strategie hat Laufzeit O(n3 ).
Beweis: Wir unterteilen den Algorithmus in Phasen. In der ersten Phase werden alle Knoten abgearbeitet, die während der Initialisierung aktiv wurden. In Phase i + 1 werden die in Phase i eingefügten
Knoten abgearbeitet. Aus der Queue wird ja vorne immer ein Knoten entfernt und bearbeitet und die
dadurch neu aktiv gewordenen Knoten werden hinten eingehängt.
Wir überlegen uns zunächst, dass es maximal 4n2 Phasen gibt. Dazu betrachten wir das folgende Potential:
φ = max{d(v)|v aktiv}. Zu Beginn und am Ende ist φ = 0.
Zunächst zeigen wir, dass in einer Phase ohne Relabeling φ um mindestens eins abnimmt. Dies sieht man
folgendermassen ein. Für alle Knoten w, die durch einen Push(v, w) aktiv werden, gilt d(w) = d(v) − 1.
D.h., jeder Knoten der in der Phase aktiv wird hat einen d-Wert, der um eins kleiner ist als der d-Wert
des Knotens, der den Push initiiert. Da nach Annahme in der Phase kein Relabel durchgeführt wird,
muss die repeat/until-Schleife für v auf Grund der ersten Bedingung abgebrochen werden, der Knoten
v ist also am Ende der Phase nicht mehr aktiv. Daher nimmt φ, das ja das Maximum der d-Werte der
18
KAPITEL 1. FLÜSSE IN NETZWERKEN
aktiven Knoten ist, in einer Phase ohne Relabeling sicherlich um mindestens eins ab. Die Anzahl Phasen
ohne Relabeling ist daher beschränkt durch die gesamte Zunahme von φ. Wir schätzen wieder ähnlich
wie in Lemma 1.30 ab. Nach dem i-ten Relabel (davor und danach sind dieselben Knoten aktiv) nimmt
das Potential um
X
X
δi = max{di (v)|v aktiv} − max{di−1 (v)|v aktiv} ≤
di (v) −
di−1 (v)
v∈V ′
v∈V ′
zu, mit di und V ′ wie bei Lemma 1.30. Insgesamt ergibt sich somit eine Änderung von
!
r
r
X
X
X
X
X
di (v) −
δi ≤
di−1 (v) =
dr (v) ≤ 2n2
i=1
i=1
v∈V ′
v∈V ′
v∈V ′
D.h. die gesamte Zunahme von φ ist maximal 2n2 .
Damit haben wir also gezeigt, dass die Anzahl Phasen ohne Relabeling durch 2n2 beschränkt ist. Die Anzahl Phasen mit Relabeling ist offensichtlich durch die Anzahl Relabelings und damit gemäss Lemma 1.28
ebenfalls durch 2n2 beschränkt.
⇒ es gibt höchstens 4n2 Phasen.
Zurück zur Laufzeit:
1. Zeit für Durchlaufen der Kantenlisten in Push/Relabel: O(nm), siehe Beweis von Theorem 1.32.
2. Zeit für Relabels: O(nm), siehe Beweis von Theorem 1.32.
3. Zeit für saturierte Pushs: O(nm), siehe Beweis von Theorem 1.32.
4. Zeit für nicht saturierte Pushs: O(n3 ), da höchstens ein nicht saturierter Push pro Knoten pro
Phase auftritt und es maximal 4n2 Phasen gibt.
Ausser der FIFO-Strategie gibt es noch weitere Auswahlstrategien, beispielsweise:
• Highest
√ Label: es wird jeweils der aktive Knoten mit maximalem d-Wert betrachtet. Laufzeit:
O(n2 m)
• Excess Scaling: es wird nur Fluss von Knoten mit genügend grossem“ Überschuss zu Knoten
”
mit genügend kleinem“ Überschuss geschickt. Laufzeit: O(nm + n2 log cmax )
”
Die Analyse dieser Strategien ist etwas aufwendiger. Wir wollen daher an dieser Stelle darauf verzichten.
Der interessierte Leser sei auf das Buch Network Flows von Ahuja, Magnanti und Orlin verwiesen.
Kapitel 2
Matching Probleme
2.1
Definition und Beispiele
Betrachten wir das folgende Zuordnungsproblem. Gegeben ist eine Menge von Rechnern mit verschiedenen Leistungsmerkmalen (Speicher, Geschwindigkeit, Plattenplatz, etc.) und eine Menge von Jobs mit
unterschiedlichen Leistungsanforderungen an die Rechner. Gibt es eine Möglichkeit, die Jobs so auf die
Rechner zu verteilen, dass alle Jobs gleichzeitig bearbeitet werden können? Graphentheoretisch können
wir das Problem wie folgt formulieren: Wir symbolisieren jeden Job und jeden Rechner durch einen
Knoten und verbinden einen Job mit einem Rechner genau dann, wenn der Rechner die Leistungsanforderungen des Jobs erfüllt. Gesucht ist dann eine Auswahl der Kanten, die jedem Job genau einen Rechner
zuordnet und umgekehrt jedem Rechner höchstens einen Job. Eine solche Teilmenge der Kanten nennt
man ein Matching des Graphen.
Definition 2.1 Eine Kantenmenge M ⊆ E heisst Matching in einem Graphen G = (V, E), falls kein
Knoten des Graphen zu mehr als einer Kante aus M inzident ist, oder formal ausgedrückt, wenn
e∩f =∅
für alle e,f ∈ M mit e 6= f .
Man sagt ein Knoten v wird von M überdeckt, falls es eine Kante e ∈ M gibt, die v enthält. Ein Matching
M heisst perfektes Matching, wenn jeder Knoten durch genau eine Kante aus M überdeckt wird, oder,
anders ausgedrückt, wenn |M | = |V |/2.
Bemerkung 2.2 Ein Graph enthält im Allgemeinen sehr viele Matchings. Beispielsweise ist M = {e}
für jede Kante e ∈ E ein Matching. Die folgende Abbildung zeigt ein Matching (links) und ein perfektes
Matching (Mitte).
Nicht jeder Graph enthält jedoch ein perfektes Matching. Für Graphen mit einer ungeraden Anzahl an
Knoten ist dies klar. Es gibt aber sogar Graphen mit beliebig vielen Knoten, deren grösstes Matching aus
einer einzigen Kante besteht. Dies sind die so genannten Sterngraphen (im Bild rechts), deren Kantenmenge genau aus den zu einem Knoten inzidenten Kanten besteht.
Wir werden uns in diesem Kapitel mit der Frage beschäftigen, wie man ein bezüglich bestimmten Kriterien optimales Matching bestimmen kann. Genauer werden wir uns zunächst der Frage widmen, wie
19
20
KAPITEL 2. MATCHING PROBLEME
man ein Matching mit möglichst vielen Kanten finden kann. Im zweiten Teil dieses Kapitels verallgemeinern wir dann die Aufgabe dahingehend, dass wir als Eingabe zusätzlich zu dem Graphen noch eine
Gewichtsfunktion w : E → N eingeben und dann nach einem Matching suchen, dass a) möglichst viele
Kanten enthält und b) unter allen solchen Matchings eines mit möglichst geringem Kantengewicht. Wie
sich herausstellen wird, ist der Fall, dass der zu Grunde liegende Graph bipartit ist, wesentlich einfacher.
Wir werden daher die beiden Fälle bipartiter Graph und beliebiger Graph jeweils separat betrachten.
Formal werden wir also in diesem Kapitel die folgenden vier Probleme betrachten:
(Ungewichtetes) Matching in bipartiten Graphen
Eingabe: Ein zusammenhängender bipartiter Graph G = (A ⊎ B, E).
Ausgabe: Ein Matching M0 mit |M0 | = max{|M | : M Matching in G}.
(Ungewichtetes) Matching in beliebigen Graphen
Eingabe: Ein zusammenhängender Graph G = (V, E).
Ausgabe: Ein Matching M0 mit |M0 | = max{|M | : M Matching in G}.
Gewichtetes Matching in bipartiten Graphen
Eingabe: Ein zusammenhängender bipartiter Graph G = (A ⊎ B, E) und eine Gewichtsfunktion w :
E → N.
Ausgabe: Ein Matching M0 mit |M0 | = k und w(M0 ) = min{w(M ) : M Matching in G mit |M | = k},
wobei k = max{|M | : M Matching in G}.
Gewichtetes Matching in beliebigen Graphen
Eingabe: Ein zusammenhängender Graph G = (V, E) und eine Gewichtsfunktion w : E → N.
Ausgabe: Ein Matching M0 mit |M0 | = k und w(M0 ) = min{w(M ) : M Matching in G mit |M | = k},
wobei k = max{|M | : M Matching in G}.
Auf den ersten Blick mag die Definition des gewichteten Matchingproblems etwas artifiziell wirken. Wir
wollen uns daher zunächst die Definition etwas näher bringen. Wir
Pbeginnen mit einer Formalie: w(M )
bezeichnet das Gesamtgewicht aller Kanten in M , also w(M ) = e∈M w(e). Da wir vorausgesetzt haben, dass die Gewichtsfunktion positiv ist, wird nun auch klar warum wir nach einem Matching mit
minimalem Gewicht, aber maximal vielen Kanten suchen. Würden wir die Bedingung an die Anzahl
Kanten weglassen, wäre das leere Matching (das ja Gewicht Null hat) immer ein optimales Matching.
Genau genommen ist die Situation hier ähnlich zu der bei der Suche nach einem minimalen spannenden
Baum. Auch dort wollen wir das Gesamtkantengewicht minimieren - aber unter der Nebenbedingung,
dass die ausgewählten Kanten einen spannenden Baum bilden. Beim Matchingproblem wird also nur die
Nebenbedingung spannender Baum“ durch kantenmaximales Matching ersetzt“. Noch deutlicher wird
”
”
die Analogie, wenn der Eingabegraph G vollständig ist. Da in vollständigen Graphen immer ein perfektes Matching existiert, entspricht das Matchingproblem hier der Suche nach einem perfekten Matching
minimalen Gewichtes.
Dass wir uns bei der Eingabe auf zusammenhängende Graphen beschränkt haben, sollte nicht weiter
irritieren. Für nicht zusammenhängende Graphen ergibt sich ein optimales Matching offensichtlich durch
Vereinigung optimaler Matchings bezüglich der einzelnen Zusammenhangskomponenten. da die Zusammenhangskomponenten eines Graphens in linearer Zeit einfach bestimmt werden können, genügt es somit
das Matchingproblem für zusammenhängende Graphen zu lösen.
Zum Abschluss dieses Abschnittes wollen wir nun noch einige Anwendungsbeispiele für das Matchingproblem vorstellen.
Später ... ;-)
2.2
2.2.1
Das ungewichtete Matchingproblem
Augmentierende Pfade
Ein wichtiges Konzept für die Konstruktion eines maximalen Matchings ist das eines augmentierenden
Pfades. Augmentierende Pfade waren uns bereits bei dem Ford-Fulkerson Algorithmus begegnet. Im
Zusammenhang mit Matchings sind sie leicht anders definiert.
2.2. DAS UNGEWICHTETE MATCHINGPROBLEM
21
Definition 2.3 Sei G = (V, E) ein Graph; M ein Matching in G.
• Ein Pfad heisst M -alternierend (oder kurz alternierend), falls er abwechselnd Kanten aus M und
E \ M enthält.
• Ein Pfad heisst M -augmentierend (kurz augmentierend), falls er M -alternierend ist und beide
Endknoten nicht von M überdeckt sind.
Man macht sich leicht klar, dass ein M -augmentierender Pfad immer ungerade viele Kanten enthält,
da die Anzahl der Nicht-Matchingkanten die Anzahl der Matchingkanten gemäss Definition um Eins
übertreffen muss. Vertauscht man daher entlang eines M -augmentierenden Pfades Matching und NichtMatching Kanten, so erhöht sich die Kardinalität der Matching-Kanten um Eins. Wir formalisieren diese
Beobachtung in der folgenden Proposition.
Proposition 2.4 Ist P ein M -augmentierender Pfad für ein Matching M , dann gilt:
M ′ := M ⊕ P = (M \ P ) ∪ (P \ M )
ist ein Matching mit |M ′ | = |M | + 1.
Beweis: Wir zeigen zunächst, dass M ′ in der Tat ein Matching ist. Angenommen, dies wäre nicht der
Fall. Dann gäbe es e1 , e2 ∈ M ′ mit e1 ∩ e2 6= ∅. Folgende drei Konstellationen sind möglich:
1. e1 ∈ M und e2 ∈ M −→ Widerspruch dazu, dass M ein Matching ist.
2. e1 ∈ M und e2 ∈
/ M ⇒ e1 ∈
/ P, e2 ∈ P . Sei v der gemeinsame Knoten von e1 und e2 . Dann kann v
kein Endpunkt von P sein, da v in M überdeckt und P nach Annahme M -augmentierend bzgl. M
ist. Da e1 ∈
/ P , muss folglich von v eine weitere Kante e3 ∈ P ausgehen, die (da P alternierend ist)
in M liegen muss. Dies ist jedoch ein Widerspruch zur Voraussetzung, dass M ein Matching ist.
3. e1 ∈
/ M und e2 ∈
/ M ⇒ e1 ∈ P, e2 ∈ P −→ Widerspruch dazu, dass P M -alternierend ist.
M ′ ist also ein Matching. Für die Kardinalität von M ′ gilt:
|M ′ | = |M | − |M ∩ P | + |P \ M |.
Da P augmentierend ist, gilt |P \ M | = |P ∩ M | + 1 und somit wie behauptet |M ′ | = |M | + 1.
Proposition 2.4 besagt, dass man aus einem M -augmentierenden Pfad immer ein um Eins grösseres
Matching erhalten kann. Der folgenden Satz besagt nun, dass in der Tat noch mehr gilt: Ist M kein
kardinalitätsmaximales Matching, so gibt es immer einen M -augmentierenden Pfad, der benutzt werden
kann, um M zu vergrössern.
Satz 2.5 Ein Matching M ist genau dann (kardinalitäts-)maximal, wenn es keinen M -augmentierenden
Pfad gibt.
Beweis:
⇒“ Ergibt sich unmittelbar aus Proposition 2.4.
”
⇐“ Sei M ein Matching, das nicht maximal ist. Wir zeigen: es gibt einen M -augmentierenden Pfad.
”
Sei Mmax ein (beliebiges) maximales Matching. Betrachte den Subgraphen M ⊕ Mmax (genauer:
den durch die Kantenmenge M ⊕ Mmax induzierten Subgraphen). Es gilt
– Jeder Knoten hat Grad ≤ 2, d. h. M ⊕ Mmax ist Vereinigung von Kreisen und Pfaden.
– Jeder Kreis ist von gerader Länge und enthält die gleiche Anzahl von Kanten aus M wie aus
Mmax .
22
KAPITEL 2. MATCHING PROBLEME
– Jeder Pfad enthält abwechselnd Kanten aus M und Mmax .
Wegen |Mmax | > |M | muss es einen Pfad P geben, der mehr Kanten aus Mmax als aus M enthält.
Anfangs- und Endkanten von P gehören daher zu Mmax , d. h. die Anfangs- und Endknoten von P
sind von M nicht überdeckt. Also ist P M -augmentierend.
Aus dem Beweis von Satz 2.5 ergibt sich auch eine obere Schranke für die Länge eines kürzesten M augmentierenden Pfades. Dies werden wir in Abschnitt 2.2.2 benötigen und wollen sie daher hier noch
kurz festhalten.
Korollar 2.6 Sei Mmax ein maximales Matching und M ein Matching mit |M | < |Mmax |, in dem der
kürzeste M -augmentierenden Pfad, die Länge t hat. Dann gilt |M | ≥ |Mmax | − n/t.
Beweis: Betrachte wie im Beweis von Theorem 2.5 den Subgraphen M ⊕ Mmax. Da ein Pfad in diesem
Graphen höchstens eine Kante mehr aus Mmax als aus M enthalten kann, enthält M ⊕ Mmax mindestens
s := |Mmax | − |M | Pfade Pi (i = 1, . . . , s), die M -augmentierend sind. Die Pfade Pi sind knotendisjunkt
und haben nach Annahme alle Länge mindestens t. Es gilt daher
s·t≤
s
X
i=1
|Pi | ≤ n
und somit |Mmax | − |M | = s ≤ n/t.
Aus obigen Überlegungen ergibt sich unmittelbar der folgende
Ansatz für einen Matching-Algorithmus:
1. Starte mit einem beliebigen Matching. (Beispielsweise mit dem leeren Matching oder einem, das
der Greedy-Algorithmus gefunden hat).
2. Vergrössere das Matching sukzessive entlang augmentierender Pfade. (Wie in Proposition 2.4 beschrieben).
Zu lösen ist hier lediglich noch die Frage, wie man augmentierende Pfade effizient findet.
Diese auf den ersten Blick einfach aussehende Aufgabe ist in der Tat jedoch nicht ganz so einfach.
Zumindest führt die nahe liegende Idee, bei einem beliebigen nicht überdeckten Knoten anzufangen
und einen von dort ausgehenden alternierenden Pfad zu verfolgen, bis man auf einen weiteren nicht
überdeckten Knoten trifft, nicht notwendiger Weise zum Ziel, wie die nachfolgende Abbildung zeigt.
?
= Matching-Kanten
Das Problem hierbei ist, dass man bei der Konstruktion des augmentierenden Pfades auf Knoten treffen
kann, die man bereits besucht hat und dadurch das Anfangsstück des Pfades quasi in umgekehrter Reihenfolge nochmal durchlaufen müsste – was der Definition eines Pfades natürlich widerspricht. Man beachte
jedoch dass dieses Problem nur auftreten kann, wenn der Graph ungerade Kreise enthält. Beschränkt
man sich daher auf bipartite Graphen führte die oben angegebene Idee zur Konstruktion augmentierenden Pfade in der Tat zum Ziel, wie wir im nächsten Abschnitt sehen werden.
2.2. DAS UNGEWICHTETE MATCHINGPROBLEM
2.2.2
23
Bipartite Graphen
Die einfachste Art ein neues Problem zu lösen ist, es auf ein bereits gelöstes Problem zurückzuführen.
Im Falle des Matchingproblem in bipartiten Graphen ist dies ganz einfach: Wir konstruieren darau ein
Flussproblem:
s
A
B
t
A
B
• Richte alle Kanten von A nach B.
• Verbinde einen zusätzlichen Knoten s (Quelle) durch gerichtete Kanten mit allen Knoten in A;
verbinde alle Knoten in B durch gerichtete Kanten mit einem zusätzlichen Knoten t (Senke).
• Gebe allen Kanten Kapazität identisch Eins.
Offenbar entspricht dann ein maximales Matching im ursprünglichen Graphen genau einem (ganzzahligen)
maximalen Fluss im neuen Graphen.
Damit erhalten wir unmittelbar:
Satz 2.7 In bipartiten Graphen ist die Bestimmung eines maximalen Matchings in O(nm) Schritten
möglich.
Beweis: Überführe das Matchingproblem wie oben beschrieben in ein entsprechendes Flussproblem.
Dieses lässt sich (beispielsweise mit dem Algorithmus von Ford und Fulkerson) innerhalb der geforderten Zeitschranke lösen.
√
Als nächsten wollen wir die Laufzeit von O(nm) auf O( nm) verbessern. Der entsprechende Algorithmus
wurde 1973 von Hopcroft und Karp entwickelt. Er ist noch immer der schnellste Algorithmus, den man
für das bipartite Matchingproblem kennt.
Die zu Grunde liegende Idee ist recht einfach. Wir versuchen, wie im vorangehenden Abschnitt vorgestellt,
ausgehend von den von M nicht überdeckten Knoten in A kürzeste augmentierende Pfade zu finden —
und zwar wenn möglich mehrere gleichzeitig“.
”
Um den Algorithmus etwas genauer skizzieren zu können, benötigen wir zunächst einige vorbereitende
Hilfsaussagen.
Lemma 2.8 Sei P ein kürzester M -augmentierender Pfad für ein Matching M und Pe ein beliebiger
(M ⊕ P )-augmentierender Pfad. Dann gilt
|Pe | ≥ |P | + 2|Pe ∩ P | ≥ |P |
f := (M ⊕ P ) ⊕ Pe. Dann gilt (nach Proposition 2.4) |M
f| = |M | + 2, und M
f ⊕ M enthält
Beweis: Sei M
daher mindestens zwei knotendisjunkte M -augmentierende Pfade, sagen wir P1 und P2 .
f⊕M enthält genau die Kanten, die in genau einem der Pfade Pe und P vorkommen. Daher gilt M
f⊕M =
M
e
e
f
P ⊕ P und somit auch |P ⊕ P | = |M ⊕ M | ≥ |P1 | + |P2 | ≥ 2|P |, da P ein kürzester M -augmentierender
Pfad ist. Andererseits ist |Pe ⊕ P | = |Pe | + |P | − 2|Pe ∩ P |. Zusammen also |Pe | − 2|Pe ∩ P | ≥ |P |, woraus
die Behauptung unmittelbar folgt.
24
KAPITEL 2. MATCHING PROBLEME
Lemma 2.9 Sei M1 , . . . , Mk+1 eine Folge von Matchings und P1 , . . . , Pk eine Folge von augmentierenden
Pfaden, wobei gelte
• Pi ist ein kürzester Mi -augmentierender Pfad ( i = 1, . . . , k)
• Mi+1 = Mi ⊕ Pi ( i = 1, . . . , k)
Dann gilt
a) |Pi+1 | ≥ |Pi | (i = 1, . . . , k)
b) |Pi | = |Pj |, i 6= j ⇒ Pi und Pj sind knotendisjunkt.
Beweis:
a) Folgt direkt aus Lemma 2.8.
b) Angenommen, dies gilt nicht. Dann wähle i < j mit |Pi | = |Pj |, so dass Pi und Pj nicht knotendisjunkt sind, und j − i minimal bezüglich dieser Eigenschaften ist. Dann gilt für alle i + 1 ≤ k < ℓ ≤ j:
|Pk | = |Pℓ | und Pk und Pℓ sind knotendisjunkt. Aus der Knotendisjunktheit der Pfade Pi+1 , . . . , Pj
folgt aber, dass Pj nicht nur bezüglich Mj sondern auch bezüglich Mi+1 ein augmentierender Pfad
ist. Nach Lemma 2.8 gilt daher: |Pj | ≥ |Pi | + 2|Pi ∩ Pj |, woraus wegen |Pi | = |Pj | folgt, dass
|Pi ∩ Pj | = 0 sein muss, d. h. Pi und Pj sind kantendisjunkt.
Sei nun v beliebig ∈ V (Pi )∩V (Pj ). Da jeder Knoten aus V (Pi ) in Mi+1 = Mi ⊕Pi überdeckt ist und
zwar durch Matchingkanten, die in Pi enthalten sind, enthält jeder Mi+1 -augmentierende Pfade,
der einen Knoten von V (Pi ) enthält auch eine Kante aus Pi . Da Pj ein Mi+1 -augmentierender Pfad
ist, der nach obiger Überlegung kantendisjunkt zu Pj ist, müssen Pi und Pj auch knotendisjunkt
sein, was unserer Annahme widerspricht.
Das Lemma legt folgenden Ansatz für einen Matching-Algorithmus nahe:
BipartitesMatching
Eingabe: zusammenhängender bipartiter Graph G = (A ∪ B, E).
Ausgabe: (kardinalitäts-) maximales Matching M ⊆ E.
M = ∅;
repeat
Bestimme eine (inklusions-) maximale Menge knotendisjunkter kürzester M -augmentierenden
Pfade. Augmentiere M entlang dieser Pfade.
until (es existiert kein M -augmentierender Pfad).
Gemäss Lemma 2.9 muss die Länge eines kürzesten M -augmentierenden
Pfades in jeder Iteration der
f das Matching, das wir nach ⌈√n⌉ Iterationen erhalten haben,
Schleife zunehmen. Bezeichnen wir mit M
f-augmentierenden Pfades daher mindestens √n. Aus Korollar 2.6
so beträgt die Länge eines kürzesten M
√
f| ≥ |Mmax | − n/ n. Der Algorithmus terminiert daher spätestens nach √n weiteren Itefolgt daher |M
rationen. Wenn wir also zeigen könnten, dass man zu einem Matching M in Zeit O(m) eine maximale
Menge knotendisjunkter√kürzester M -augmentierenden Pfade bestimmen kann, hätten wir einen Algorithmus, der in Zeit O( nm) ein maximales Matching bestimmt. Solch einen Algorithmus werden wir
jetzt herleiten.
Im Folgenden sei G = (A ∪ B, E) ein zusammenhängender bipartiter Graph und M ⊆ E ein Matching
in G. Ziel ist es eine (inklusions-) maximale Menge knotendisjunkter kürzester M -augmentierender Pfade
zu bestimmen.
Hierbei gehen wir folgendermassen vor. Durch eine modifizierte Breitensuche bestimmen wir in Zeit O(m)
zunächst die Länge ℓ eines kürzesten M -augmentierenden Pfades. Zusätzlich generieren wir dabei einen
geeigneten Subgraphen von G, in dem wir in einer zweiten Phase eine maximale Menge knotendisjunkter
M -augmentierender Pfade der Länge ℓ durch Tiefensuche bestimmen können. Der geeignete“ Subgraph
”
von G ist dabei ein Graph G′ , dessen Knoten sich auf Ebenen“ (engl. layers) L0 , L1 , . . . , L2k+1 verteilen
”
für die gilt:
2.2. DAS UNGEWICHTETE MATCHINGPROBLEM
25
• L0 enthält genau die von M nicht überdeckten Knoten aus A.
• L1 enthält alle Nachbarknoten der Knoten aus L0 .
• Für alle 1 ≤ i ≤ k gilt:
– L2i enthält alle Knoten, die von Knoten aus L2i−1 über Matchingkanten erreicht werden
können.
(also Kanten
– L2i+1 enthält alle Knoten, die von Knoten aus L2i über Nicht-Matchingkanten
S
aus E \ M ) erreicht werden können und die noch nicht in j≤2i Lj enthalten sind.
• Die Mengen L1 , L3 , . . . , L2k−3 , L2k−1 enthalten nur von M überdeckte Knoten.
• L2k+1 ist entweder leer oder enthält mindestens einen von M nicht überdeckten Knoten.
• Die Kanten von G′ bestehen aus allen Matchingkanten zwischen Ebenen L2i−1 und L2i (1 ≤ i ≤ k)
und allen Nicht-Matchingkanten zwischen Ebenen L2i und L2i+1 (0 ≤ i ≤ k).
Man macht sich leicht klar, dass aus diesen Eigenschaften folgt, dass die Länge eines kürzesten M augmentierenden Pfades genau 2k+1 ist bzw. dass, falls L2k+1 leer ist, es keinen M -augmentierenden Pfad
gibt. Ist andererseits P irgendein M -augmentierender Pfad der Länge 2k + 1, dann ist P in G′ enthalten.
Für die Bestimmung einer maximalen Menge knotendisjunkter M -augmentierender Pfade können wir uns
daher auf G′ beschränken. Da wir nur an kürzesten augmentierenden Pfaden interessiert sind, wissen wir
zusätzlich, dass die zu bestimmenden Pfade genau einen Knoten von jedem Levels enthalten müssen. Wir
können uns G′ daher auch als gerichteten Graphen vorstellen, wobei die Kanten jeweils von der grösseren
zur kleineren Ebene gerichtet sind.
Die gesuchte maximale Menge knotendisjunkter M -augmentierender Pfade können wir dann wie folgt
bestimmen. Wir starten bei einem beliebigen nicht überdeckten Knoten der untersten Ebene eine Tiefensuche, die wir abbrechen sobald wir einen Knoten der obersten Ebene erreichen. Haben wir einen
Knoten der obersten Ebene erreicht, definiert uns dies einen augmentierenden Pfad, den wir zu unserer
Menge hinzufügen. Dann löschen wir alle während der Tiefensuche besuchten Knoten und starten in dem
verbliebenen Graphen von einem anderen von M nicht überdeckten Knoten der untersten Ebene erneut
eine Tiefensuche. Diesen Prozess wiederholen wir so lange, bis die unterste Ebene keinen weiteren von M
nicht überdeckten Knoten mehr enthält.
Unmittelbar einsichtig sollte sein, dass in jeder der beiden Phasen, also Aufbau des Layergraphen G′ und
Konstruktion der augmentierenden Pfade, jede Kante des Graphen höchstens zweimal angefasst wird.
Damit haben wir also in der Tat die gewünschte Laufzeit von O(m) erhalten.
Wir formulieren den Algorithmus nun noch etwas formaler.
AugmentierendePfade
Eingabe: zusammenhängender bipartiter Graph G = (A ∪ B, E), Matching M ⊆ E.
Ausgabe: (inklusions-) maximale Menge knotendisjunkter kürzester M -augmentierender Pfade
// Konstruiere Layergraph G′ = (V ′ , E ′ )
E ′ := ∅; X, L0 := ∅;
for all v ∈ A, v nicht überdeckt do
L0 := L0 ∪ {v};
for all {v, w} ∈ E do
E ′ := E ′ ∪ {(w, v)}; X := X ∪ {w};
′
V := L0 ∪ X;
while (X 6= ∅) and (X enthält nur überdeckte Knoten) do
// folge Matchingkanten von X in die Menge A
Y := ∅;
for all v ∈ X und {v, w} ∈ M do
Y := Y ∪ {w}; E ′ := E ′ ∪ {(w, v)};
′
V := V ′ ∪ Y ;
// folge Nicht-Matchingkanten von Y in die Menge B
X := ∅;
26
KAPITEL 2. MATCHING PROBLEME
for all v ∈ Y und {v, w} ∈ E \ M do
if (w 6∈ V ′ ) then { X := X ∪ {w}; E ′ := E ′ ∪ {(w, v)}; }
′
V := V ′ ∪ X;
if (X = ∅) then stop; // M ist maximales Matching;
// Starte bei jedem nicht überdeckten Knoten aus X eine Tiefensuche
P := ∅;
for all v ∈ X, v nicht überdeckt do
Starte eine Tiefensuche in v, stoppe sobald ein Knoten aus L0 erreicht wird;
if (Knoten aus L0 erreicht) then
Sei P der gefundene Pfad von v zu dem Knoten aus L0 ;
P := P ∪ {P };
Entferne alle bei der Tiefensuche besuchten Knoten aus V ′ und alle inzidenten Kanten aus E ′ ;
Gebe P aus;
Der folgende Satz fasst die vorangegangenen Überlegungen nochmals zusammen.
Satz 2.10 (Hopcroft, Karp) Der Algorithmus BipartitesMatching bei dem jede Iteration√der repeatSchleife durch den Algorithmus AugmentierendePfade realisiert wird, findet in Zeit O( nm) ein
maximales Matching.
Um den Ablauf einer Iteration des Algorithmus zu illustrieren betrachten wir den folgenden bipartiten
Graphen mit Knotenmenge A = {1, 2, 3, 4, 5, 6} und B = {a, b, c, d, e, f }. Die fett gezeichneten Kanten stellen dabei die Kanten des aktuellen Matchings M dar. Die nicht überdeckten Knoten sind dick
umrandet. Es sind dies die Knoten 1 und 4 in A und die Knoten c und e in der Menge B.
1
2
3
4
5
6
a
b
c
d
e
f
Den Aufbau des Levelgraphen beginnt man mit den nicht überdeckten Knoten in A, in diesem Fall also
mit den Knoten 1 und 4. Deren Nachbarn kommen in den nächsten Level, in dem Beispiel sind dies die
Knoten a, b und d. Alle diese Knoten sind überdeckt, wir bauen daher einen neuen Level auf, der aus den
Endknoten der Matchingkanten besteht, die die Knoten dieses Levels überdecken; im Beispiel sind dies
die Knoten 2, 3 und 6. Von diesen Knoten verfolgen wir wieder alle Nicht-Matchingkanten und erhalten
die Knoten c, e und f . Diesmal sind nicht überdeckte Knoten in der Menge enthalten und der Aufbau
des Levelgraphen ist beendet.
Level 0:
1
Level 1:
a
Level 2:
Level 3:
4
b
2
d
3
c
6
e
f
Für die Bestimmung der augmentierenden Pfade starten wir an einem (beliebigen) nicht überdeckten
Knoten im untersten Level eine Tiefensuche. Startet man in dem Knoten c könnte man beispielsweise
2.2. DAS UNGEWICHTETE MATCHINGPROBLEM
27
den Pfad (c, 2, a, 1) erhalten. Alle bei der Tiefensuche besuchten Knoten werden entfernt und es wird eine
neue Tiefensuche am Knoten e gestartet. Diesmal ergibt sich der Pfad (e, 3, b, 4). Nach Invertierung der
Kanten entlang dieser beiden Pfade ergibt sich das folgende Matching, das bereits perfekt ist.
1
2
3
4
5
6
a
b
c
d
e
f
Man beachte, dass die Auswahl der Pfade nicht deterministisch ist. Im ersten Schritt hätten wir beispielsweise auch den Pfad (c, 3, b, 4) wählen können. Die anschliessende Tiefensuche von e aus hätte dann
keinen Erfolg mehr gehabt. Der Pfad (c, 3, b, 4) stellt daher, ebenso wie die beiden Pfade (c, 2, a, 1) und
(c, 2, a, 1), eine maximale Menge knotendisjunkter kürzester augmentierenden Pfade dar. Das Beispiel
zeigt daher auch, dass solche maximalen Mengen nicht notwendigerweise die gleiche Anzahl Pfade enthalten müssen. Für die Korrektheit und Einhaltung der Laufzeitschranke des Algorithmus ist es nicht
erforderlich, dass wir eine maximale Menge mit möglichst vielen Pfaden wählen, jede maximale Menge
ist ausreichend. Der Leser möge sich an obigen Beispiel davon überzeugen, dass auch bei Auswahl des
Pfades (c, 3, b, 4) der kürzeste augmentierende in dem dadurch entstehenden Graphen aus mehr als drei
Kanten besteht.
Abschliessend wenden wir wenden uns noch kurz der Frage zu, wann ein bipartiter Graph ein perfektes
Matching enthält. Der Stern aus Bemerkung 2.2 zeigt uns bereits, dass auch in bipartiten Graphen ein
perfektes Matching nicht immer existieren muss – ganz im Gegenteil, es kann durchaus sein, dass das
grösste Matching aus nur einer Kante besteht.
Der folgende Satz von Hall, in der Literatur oft auch unter der Bezeichnung Heiratssatz“ bekannt
”
(warum?!), gibt eine notwendige und hinreichende Bedingung an, unter der ein Matching in einem bipartiten Graphen existiert, das alle Knoten einer Partition überdeckt.
Satz 2.11 (Hall) Sei G = (A ⊎ B, E) ein bipartiter Graph mit |A| ≤ |B|. Dann gilt:
Es existiert ein Matching M der Kardinalität |M | = |A| ⇐⇒ |Γ(X)| ≥ |X| für alle X ⊆ A.
Beweis:
⇒“ Dies ist unmittelbar einsichtig.
”
⇐“ Sei M ein maximales Matching in G. Setze
”
X0
X
=
=
Y
=
{u ∈ A | u nicht überdeckt }
{u ∈ A | ∃ s ∈ X0 und ∃ M -alternierender Pfad von s nach u}
{u ∈ B | ∃ s ∈ X0 und ∃ M -alternierender Pfad von s nach u}
Dann gilt offensichtlich:
– Γ(X) ⊆ Y
– Jeder Knoten in Y wird von M überdeckt (sonst gäbe es einen augmentierenden Pfad, im
Widerspruch zur Maximalität von M ) ⇒ |X \ X0 | = |Y |.
Also |X0 | + |X \ X0 | = |X| ≤ |Γ(X)| ≤ |Y |
| {z }
= |Y |
⇒
|X0 | = 0.
28
2.2.3
KAPITEL 2. MATCHING PROBLEME
Matching in allgemeinen Graphen
Dieses Problem ist, vor allem wegen der Existenz ungerader Kreise, schwieriger als das Matching in
bipartiten Graphen.
Die Grundidee der augmentierenden Pfade können wir aber übernehmen. Überlegen müssen wir uns lediglich, wie wir mit den Abschnitt 2.2.1 bereits angedeuteten Problemfall“ der ungeraden Kreise umgehen.
”
Dazu führen wir zunächst einige Begriffe ein.
Definition 2.12 Sei G = (V, E) ein Graph und M ⊆ E ein Matching. Einen ungeraden Kreis C, der
genau (|C| − 1)/2 Matchingkanten enthält, nennen wir eine Blüte (bezüglich M ). Den einzigen nicht von
diesen Matchingkanten überdeckten Knoten von C nennen wir die Knospe von C. Ein alternierender Pfad
P heisst Stiel der Blüte C, falls er in einem nicht überdeckten Knoten beginnt und mit einer Matchingkante
in der Knospe von C endet.
An obiger Zeichnung kann man sich sofort eine wichtige Eigenschaft einer Blüte verdeutlichen: Von
Startknoten des Stiels einer Blüte gibt es einen mit einer Matchingkante endenden alternierenden Pfad
zu jedem Knoten der Blüte. Dies gilt, da wir nach Betreten der Blüte in der Knopse entweder links rum“
”
oder rechts rum“ laufen können. Zur späteren Verwendung halten diese Beobachtung nochmals formal
”
fest.
Lemma 2.13 Ist C eine Blüte bezüglich eines Matchings M und P ein Stiel von C, der in einem nicht
überdeckten Knoten u beginnt, so gibt es von u zu jedem Knoten v ∈ V (C) einen alternierenden Pfad,
der in v mit einer Matchingkante endet.
Die Grundidee eines Matchingalgorithmus für beliebige Graphen ist es, wie bei bipartiten Graphen nach
augmentierenden Pfaden zu suchen. Trifft man dabei auf ein Problem“, sprich eine Blüte, so besei”
”
tigt“ man dieses Problem und beginnt danach die Suche nach einem augmentierenden Pfad von Neuem.
Das Beseitigen“ der Blüte besteht darin, dass wir alle Knoten der Blüte zu einem einzigen Knoten
”
kontrahieren. Die folgenden Zeichnung veranschaulicht dies an einem Beispiel.
Knospe
Blute
Stiel
Wir legen noch etwas Notation fest. Ist C eine Blüte, dann bezeichnen wir mit G/C denjenigen Graphen,
in dem wir alle Knoten aus V (C) und die damit inzidenten Kanten durch einen (einzigen) neuen Knoten
vC ersetzen, der genau zu den Knoten ausserhalb von C verbunden ist, zu denen mindestens ein Knoten
von C verbunden war. Mit M/C bezeichnen wir die Restriktion des Matchings M auf G/C (bei der wir
aus M alle Kanten in C entfernen und bei der letzten (Matching-)Kante des Stiels den Knoten aus C
durch den Knoten vC ersetzen.
2.2. DAS UNGEWICHTETE MATCHINGPROBLEM
29
Die für unsere Zwecke fundamentale Eigenschaft dieser Konstruktion ist, dass augmentierenden Pfade in
G/C augmentierenden Pfaden in G entsprechen.
Satz 2.14 Sei G = (V, E) ein Graph, M ⊆ E ein Matching und C eine Blüte mit Stiel S bezüglich M .
Dann gilt:
a) Ist P ein augmentierender Pfad in G/C, so entspricht dieser auf kanonische Art und Weise einem
augmentierenden Pfad in G.
b) Ist M/C ein maximales Matching in G/C, dann ist auch M ein maximales Matching in G.
Beweis: a) Enthält P den Knoten vc nicht oder ist vC Endpunkt von P , so ist die Aussage trivialerweise
richtig. Sei daher P = (u, . . . , x, vC , y, . . . , w), wobei ohne Einschränkung {x, vC } eine Matchingkante sei.
Nach Definition von G/C gibt es Knoten c1 und c2 in C, so dass {x, c1 } ∈ M und {c2 , y} ∈ E \ M
gilt. Dann ist (u, . . . , x, c1 ) ein Stiel der Blüte C und gemäss Lemma 2.13 gibt es daher in G einen
alternierenden Pfad zum Knoten c2 , der mit einer Matchingkante endet. Ergänzen wir diesen Pfad durch
den Pfad (c2 , y, . . . , w), so erhalten wir damit einen M -augmentierenden Pfad in G.
C
vC
b) Angenommen dies wäre nicht der Fall. Sei also G = (V, E) ein Graph für das es ein Matching M und
eine Blüte C gibt, so dass M nicht maximal in G ist, aber M/C maximal in G/C.
Gemäss Satz 2.5 gibt es einen M -augmentierenden Pfad P in G. Der Stiel der Blüte C ist im Allgemeinen
nicht eindeutig. Unter allen möglichen Stielen fixieren wir einen Stiel S, der die Anzahl Kanten in S, die
nicht zu P gehören minimiert.
Wir unterscheiden nun verschiedene Fälle und werden jeweils zeigen, dass – im Widerspruch zur Annahme
– auch G/C einen (M/C)-augmentierenden Pfad enthält.
1. Fall: P enthält keinen Knoten aus C. Dann wäre P auch ein M/C-augmentierender Pfad in G/C.
Widerspruch!
2. Fall: P enthält genau einen Knoten aus C. Da P alternierend ist, muss das genau die Knospe von C
sein (und der Stiel von C daher leer sein). Daraus folgt sofort, dass P auch ein augmentierender Pfad in
G/C ist. Widerspruch!
3. Fall: P enthält mindestens zwei Knoten aus C. Dann sei P1 das längste Anfangsstück von P , das genau
einen Knoten aus C enthält, und P2 das längste Endstück von P , das genau einen Knoten aus C enthält.
Es seien x1 bzw x2 diese entsprechenden Knoten aus C und x′i die Nachbarknoten von xi auf Pi .
30
KAPITEL 2. MATCHING PROBLEME
P2
P1
C
Fall 3.a: Einer der beiden Kanten {x′i , xi }, ohne Einschränkung sei dies {x′1 , x1 }, ist eine Matchingkante.
Dann muss x1 die Knospe von C sein (woraus sofort folgt, dass {x′2 , x2 } nicht ebenfalls eine Matchingkante
sein kann). Ersetzen wir nun in P1 die Kante {x′1 , x1 } durch die (Matching-)Kante {x′1 , vc } und in P2 die
Kante {x2 , x′2 } durch die Kante {vc , x′2 }, so erhalten wir hierdurch einen (M \ C)-augmentierenden Pfad
in G/C.
Fall 3.b: Beide Kanten {x′i , xi } sind keine Matchingkanten.
Ist mindestens einer der beiden Pfade Pi knotendisjunkt zum Stiel S der Blüte, so bildet – analog zu Fall
3.a – S zusammen mit diesem Pfad einen augmentierenden Pfad in G/C.
Also enthalten sowohl P1 als auch P2 Knoten des Stiels S. Zumindest einer der beiden Pfade enthält nicht
den Startknoten des Stiels. Ohne Einschränkung sei P1 dieser Pfad. Sei nun P1′ das Anfangsstück von
P1 bis zum ersten Knoten aus S. Sei z dieser Knoten. Der Knoten z ist mit einer zum Stiel gehörenden
Matchingkante {z, z ′} inzident. Diese zeigt (von z aus gesehen) entweder in Richtung Knospe oder in
Richtung Anfangspunkt.
P1
P2
z’
S
z
C
Fall 3.b.1: Die Matchingkante {z, z ′} zeigt in Richtung Anfangspunkt. Dann erhält man einen (M/C)augmentierenden Pfad für G/C, in dem man P1 bis z durchläuft und dann weiter auf dem Stiel bis zum
Anfangspunkt läuft.
P1
P2
S’
S
z z’
C
Fall 3.b.2: Die Matchingkante {z, z ′} zeigt in Richtung Knospe. Sei {z, z ′′} die andere zu z inzidente
Kante des Stiels. Diese gibt es nach Wahl von P1 . Wir betrachten nun den Stiel S ′ , den wir erhalten in
dem wir im P1′ bis z durchlaufen und ab dort entlang von S bis zur Knospe laufen. Dann gilt sicherlich
S ′ \ P ⊆ S \ P . Andererseits gehört die Kante {z, z ′′} zu S \ P aber nicht zu S ′ \ P , d.h. es gilt
|S ′ \ P | < |S \ P |, im Widerspruch zur Wahl von S. Dieser Fall kann also nicht eintreten und unser Beweis
ist damit vollständig.
Mit Hilfe von Satz 2.14 ist ein Algorithmus für das gewichtete Matchingproblem nun schnell formuliert.
Matching
Eingabe: zusammenhängender Graph G = (V, E).
Ausgabe: (kardinalitäts-) maximales Matching M ⊆ E.
M = ∅;
repeat
2.3. DAS GEWICHTETE MATCHINGPROBLEM
31
Starte in allen nicht-überdeckten Knoten eine parallele Breitensuche (analog wie bei den bipartiten Graphen). Sobald eine Blüte entdeckt wird, kontrahiere diese und starte die Breitensuche
erneut.
if (augmentierender Pfad wird gefunden) then
Augmentiere entlang des Pfades; expandiere dabei alle eventuell kontrahierten Blüten
entsprechend dem Beweis von Satz 2.14.
until (es existiert kein M -augmentierender Pfad)
Die Korrektheit des Algorithmus folgt wegen Satz 2.5 unmittelbar aus Satz 2.14. Die Laufzeit lässt
sich wie folgt abschätzen. Da in einem Graphen mit n Knoten ein maximales Matching höchstens n/2
Kanten enthält, wird die repeat-Schleife höchstens n/2 mal durchlaufen. Innerhalb jeder Iteration können
höchstens n/2 Blüten kontrahiert werden, da die Anzahl Knoten bei jeder Kontraktion um mindestens
zwei abnimmt. Für die Breitensuche benötigen wir Zeit O(m), die Augmentierung entlang eines Pfades
kostet O(n) Zeit, wobei wir pro Extraktion einer Blüte sicherlich mit Zeit O(m) auskommen. Insgesamt
erhalten wir somit:
Satz 2.15 Der Algorithmus Matching findet in Zeit O(n2 · m) ein maximales Matching.
Bemerkung 2.16 Die Laufzeit lässt sich auf zweierlei Arten noch verbessern. Zunächst kann man sich
überlegen, dass bei Verwendung geeigneter Datenstrukturen die Breitensuche nach Kontraktion eines Knotens nicht neu gestartet werden muss und daher pro Iteration insgesamt nur Zeit O(m) verbraucht – unabhängig von der Anzahl der kontrahierten Blüten. Analog kann man auch den Augmentierungsschritt in
O(m) realiseren, ebenfalls unabhängig
√ von der Anzahl Blüten. Damit ergibt sich eine Laufzeit von O(nm).
Diese lässt sich dann noch auf O( nm) verbessern, in dem man, analog zum bipartiten Fall, möglichst
viele Pfade gleichzeitig betrachtet. Die technischen Details sind hier allerdings viel, viel aufwendiger (vgl.
die Arbeiten von Micali und Vazirani (1980) und Vazirani (1994)).
2.3
Das gewichtete Matchingproblem
Ein in der kombinatorischen Optimierung sehr beliebter Ansatz für die Lösung gewichteter Probleme
ist die so genannte primal-duale Methode der linearen Programmierung. Diese ermöglicht es die Lösung
eines gewichteten Problems auf die Lösung (einer Sequenz) von ungewichteten Problemen zu reduzieren.
Dieser Ansatz kommt auch bei den meisten Algorithmen zur Lösung des gewichteten Matchingproblems
zum Einsatz.
In diesem Kapitel werden wir einen solchen Algorithmus vorstellen. Die so genannte ungarische Methode zur Lösung des gewichteten Matchingproblems in vollständigen bipartiten Graphen. Wir werden
uns dabei jedoch nicht explizit auf die primal-duale Methode beziehen, sondern den Algorithmus ohne
zusätzliche Annahmen vollständig herleiten. Einzig die Frage, wie man denn auf einen solchen Algorithmus kommt, wird dabei unbeantwortet bleiben. Um letztendlich auch diese Frage zu beantworten, stellen
wir anschliessend in einem kurzen Exkurs die Grundelemente der primal-dualen Methode vor.
Einen Algorithmus für das gewichtete Matchingproblem in allgemeinen Graphen werden wir dem Leser
schuldig bleiben (müssen), da alle hierfür bekannten Algorithmen den Rahmen der Vorlesung sprengen.
Wir werden aber in Abschnitt 2.3.3 zumindest noch einige grundlegenden Ansätze und Ideen beschreiben.
2.3.1
Bipartite Graphen
In diesem Abschnitt sei G = (A ∪ B, A × B) ein vollständiger bipartiter Graph mit |A| = |B| = n
und w : A × B → R eine Gewichtsfunktion. Zur Vereinfachung der Notation sei A = {a1 , . . . , an } und
B = {b1 , . . . , bn }. Dann können wir die Gewichtsfunktion auch als n × n Matrix W = (wij ) darstellen,
wobei wij = w(ai , bj ).
Auf der Knotenmenge A ∪ B definieren wir eine Markierungsfunktion ℓ : A ∪ B → R und nennen diese
zulässig, falls gilt
ℓ(ai ) + ℓ(bj ) ≤ w(ai , bj )
für alle 1 ≤ i, j ≤ n.
(2.1)
32
KAPITEL 2. MATCHING PROBLEME
Zu einer (zulässigen) Markierungsfunktion ℓ bezeichnen wir mit Gℓ = (V, Eℓ ) denjenigen Subgraphen von
G, der genau die Kanten enthält, bei denen (2.1) mit Gleichheit gilt. Also
Eℓ = { {ai , bj } | 1 ≤ i, j ≤ n und ℓ(ai ) + ℓ(bj ) = w(ai , bj )}.
Die folgende Proposition zeigt, dass man sich auf die Bestimmung eines perfekten Matchings in Gℓ
beschränken kann — so man die richtige“ Markierungsfunktion gewählt hat.
”
Proposition 2.17 Ist ℓ eine zulässige Markierungsfunktion und M ein perfektes Matching in Gℓ , so ist
M ein (gewichts-)minimales perfektes Matching in G.
Beweis:
Wir bestimmen zunächst das Gewicht des Matchings M . Es gilt
!
X
X X
X
w(M ) =
w(e) =
ℓ(v) =
ℓ(v),
e∈M
e∈M
v∈e
v∈A∪B
wobei die zweite Gleichheit gilt, da M nur Kanten aus Gℓ enthält, und die dritte Gleichheit aus der
Tatsache folgt, dass M ein perfektes Matching ist.
f ein beliebiges perfektes Matching in G. Dann gilt analog, wobei wir nun verwenden, dass ℓ
Sei nun M
eine zulässige Markierungsfunktion ist:
f) =
w(M
X
f
e∈M
(2.1)
w(e) ≥
X
e∈M
X
v∈e
!
ℓ(v)
=
X
ℓ(v) = w(M ).
v∈A∪B
Die Idee ist nun die folgende: Wir starten mit einer beliebigen zulässigen Markierungsfunktion (beispielsweise für alle i = 1, . . . , n mit ℓ(ai ) = min1≤j≤n w(ai , bj ) und ℓ(bi ) = 0). Für diese wird Gℓ wahrscheinlich
kein perfektes Matching enthalten. Wir bestimmen daher lediglich ein grösstes Matching in Gℓ und versuchen dann die Markierungsfunktion so zu verändern, dass zusätzliche Kanten zu Gℓ hinzugefügt werden
können – und zwar ohne die im Matching bereits vorhandenen Kanten zu verlieren.
Genauer gehen wir wie folgt vor:
GewichtetesBipartitesMatching
Eingabe: vollständiger bipartiter Graph G = (A ∪ B, A × B) mit Gewichtsfunktion w : A×B → R.
Ausgabe: (gewichts-) minimales perfektes Matching M .
Setze ℓ(ai ) := min1≤j≤n w(ai , bj ) und ℓ(bi ) := 0 für alle i = 1, . . . , n.
Bestimme zugehörigen Graphen Gℓ .
M := ∅.
repeat
repeat
S0 := {a ∈ A | a nicht von M überdeckt};
S := {a ∈ A | es gibt einen M alternierenden Pfad von einem Knoten aus S0 zu a}.
T := {b ∈ B | es gibt einen M alternierenden Pfad von einem Knoten aus S0 zu b}.
if (alle Knoten in T sind von M überdeckt) then
λ := min{w(a, b) − (ℓ(a) + ℓ(b)) | a ∈ S, b ∈ B \ T }.
Setze ℓ(a) := ℓ(a) + λ für alle a ∈ S und ℓ(b) := ℓ(b) − λ für alle b ∈ T .
Adaptiere Gℓ an die veränderte Markierungsfunktion.
until (T enthält einen nicht von M überdeckten Knoten);
Sei b0 ∈ T ein nicht von M überdeckter Knoten und P ein M -alternierender (und damit
augmentierender) Pfad von einem Knoten in S0 zu b0 .
Setze M := M ⊕ P .
until (M perfektes Matching);
Bevor wir die Laufzeit des Algorithmus betrachten, wollen wir uns zunächst von dessen Korrektheit überzeugen. Die äussere repeat-Schleife ist unkritisch: Der Knoten b0 existiert gemäss der Abbruchbedingung
2.3. DAS GEWICHTETE MATCHINGPROBLEM
33
der inneren repeat-Schleife, der Pfad P existiert gemäss der Definition von T . Zeigen müssen wir daher
lediglich, dass die innere repeat-Schleife terminiert.
Die Grundidee hier ist, dass die Markierungsfunktion so geändert wird, dass einerseits alle Matchingkanten
und alle Kanten, die bislang bei den alternierenden Pfaden, die zur Definition der Mengen S (beachte,
dass S0 ⊆ S) und T geführt haben, in Gℓ verbleiben. Dass aber andererseits mindestens eine Kante zu
Gℓ hinzugefügt wird, die in der nächsten Iteration zu einer (echten) Vergrösserung der Menge T führen
wird. Da das aktuelle Matching M nach Annahme noch nicht perfekt ist, muss daher T spätestens nach
n Iterationen der inneren repeat-Schleife einen nicht überdeckten Knoten enthalten.
Um uns davon zu überzeugen, dass der Algorithmus all die eben genannten Eigenschaften hat, unterscheiden wir vier verschiedene Kantentypen:
• Kanten zwischen S und T :
Da wir den ℓ-Wert bei allen Knoten aus S um λ erhöhen, bei allen Knoten aus T jedoch um λ
erniedrigen, bleibt die Bedingung (2.1) für alle Kanten, für die sie zuvor erfüllt war (und die somit
zu Gℓ gehören), weiterhin erfüllt.
• Kanten zwischen A \ S und B \ T :
Da der ℓ-Wert weder für Knoten aus A \ S noch für Knoten aus B \ T geändert wird, gehören auch
von diesen Kantentypen vor und nach der Änderung von ℓ die gleichen Kanten zu Gℓ .
• Kanten zwischen A \ S und T :
Für alle Werte λ > 0 werden auf Grund der Erniedrigung der ℓ-Werte der Knoten in T alle solchen
Kanten aus Gℓ verschwinden. Man beachte jedoch: Nach Definition von S und T verlaufen alle
Matchingkanten zwischen S und T oder zwischen A \ S und B \ T . Wir können hierdurch also auf
keinen Fall eine Matchingkante verlieren.
• Kanten zwischen S und B \ T :
Die wichtige Beobachtung hier ist, dass Gℓ auf Grund der Definition von S und T keine solchen
Kanten enthalten kann. (Denn sonst könnten wir einen an einem Knoten aus S endenden alternierenden Pfad zu einem Knoten in B \ T fortsetzen, im Widerspruch zur Definition von T .) Für Werte
λ > 0 könnten andererseits neue Kanten in Gℓ hinzugefügt werden. Man überzeuge sich nun, dass
im Algorithmus der Wert von λ genau so gesetzt ist, dass gilt:
ℓ bleibt zulässig und es wird mindestens eine Kante von S nach B \ T zu Gℓ hinzugefügt – die in
der nächsten Iteration dann zu einer Vergrösserung der Menge T führen wird.
Die Korrektheit (und Endlichkeit) des Algorithmus haben wir somit nachgewiesen. Wie steht es aber mit
der Laufzeit?
Einfach herleiten können wir:
• Es gibt genau n Iterationen der äusseren repeat-Schleife.
• Für jede diese Iterationen wird die innere repeat-Schleife höchstens n Mal durchlaufen, wobei in jeder
dieser Iterationen maximal Laufzeit O(n2 ) zur Bestimmung der Mengen S und T benötigt wird und
ebenfalls höchstens O(n2 ) zur Berechnung von λ. Die Aktualisierung der ℓ-Werte der Knoten geht
in Zeit O(n), während für die Aktualisierung des Graphen Gℓ wiederum O(n2 ) Schritte benötigt
werden.
Insgesamt ergibt sich somit eine Laufzeit von O(n · n · n2 ) = O(n4 ). Diese wollen wir nun noch auf O(n3 )
reduzieren. Dazu werden wir zeigen, dass wir für eine Iteration der äusseren repeat-Schleife statt mit
Laufzeit O(n · n2 ) in der Tat mit Laufzeit O(n2 ) auskommen.
Betrachten wir zunächst die Abschätzung der Laufzeit für die Berechnung der Mengen S und T . Wie wir
oben gesehen haben, nehmen die Mengen S und T in jeder Iteration zu. Wir können daher auf den alten
Mengen aufsetzen und müssen lediglich die durch die Änderung der ℓ-Werte neu hinzugekommen Kanten
von S nach B \ T weiter verfolgen. Wir benötigen daher nicht in jeder Iteration Laufzeit O(n2 ), sondern
34
KAPITEL 2. MATCHING PROBLEME
nur für alle Iterationen der inneren repeat-Schleife insgesamt Laufzeit O(n2 ). (Man kann sich das auch
so vorstellen: Insgesamt führen wir genau eine Breitensuche durch – nur eben verteilt auf verschiedene
Iterationen.)
Kritischer ist die Berechnung der Werte λ und die Aktualisierung der Graphen Gℓ . Hier benötigen wir
zur Reduzierung der Laufzeit noch eine zusätzliche Datenstruktur. Für Knoten b ∈ B \ T sei
slack[b] := min {w(a, b) − (ℓ(a) + ℓ(b))}.
a∈S
(2.2)
Zugleich halten wir uns noch eine Liste edges[b], die genau diejenigen Kanten von b in die Menge S
enthält, für die in (2.2) Gleichheit gilt. Mit Hilfe dieser Datenstruktur lässt sich λ dann in Zeit O(n)
berechnen, denn es gilt ja
λ = min slack[b]
(2.3)
b∈B\T
und auch Gℓ lässt sich in Zeit O(n) updaten, denn wir müssen ja lediglich alle Kanten aus edges[b] für
Knoten b ∈ B \ T für die in (2.3) das Minimum angenommen wird, zu Gℓ hinzufügen. (Genau genommen
müssten wir auch noch alle Kanten von T nach A \ S aus Gℓ entfernen. Aber da diese die weiteren
Breitensuche nicht tangieren, machen wir dies gesammelt nach Beendigung der repeat-Schleife.)
Für die Initialisierung der beiden Datenstrukturen slack[b] und edges[b] wird einmalig Zeit O(n2 ) benötigt.
Updaten müssen wir sie jeweils, wenn ein neuer Knoten zu S hinzugefügt wird. Pro Knoten benötigt dies
Laufzeit O(n). Da höchstens n mal ein Knoten zu S hinzugefügt werden kann, brauchen wir insgesamt
auch hier Laufzeit höchstens O(n2 ).
Damit haben wir also gezeigt: Pro Iteration der äusseren repeat-Schleife benötigen wir höchstens Zeit
O(n2 ). Somit gilt:
Satz 2.18 (Ungarische Methode) Der Algorithmus GewichtetesBipartitesMatching berechnet
bei Verwendung der Datenstrukturen slack[b] und edges[b] in Zeit O(n3 ) ein gewichtsminimales perfektes
Matching.
2.3.2
Exkurs: Die primal-duale Methode der linearen Programmierung
In der linearen Programmierung betrachtet man so genannte lineare Programme. Das ist nichts anderes als
eine Optimierungsaufgabe mit linearer Zielfunktion und linearen Nebenbedingungen. Also beispielsweise
(P )
min cT x
s.t. Ax = b
x≥0
wobei c, x ∈ Rn , b ∈ Rm und A eine m × n Matrix sei.
Der Buchstabe (P ) fungiert hier lediglich als Namensgebung und deutet an, dass wir dieses Programm
als primales Programm bezeichnen. Das dazugehörige duale Programm involviert ebenfalls die Vektoren
b und c und die Matrix A:
(D)
s.t.
max y T b
y A ≤ cT
T
Vektoren x und y, die die Nebenbedinungen aus (P ) bzw. (D) erfüllen nennt man primal bzw. dual
zulässig. Eine wichtige Eigenschaft primal/dualer Programme ist, dass der Wert des primalen Programms
immer größer gleich dem Wert des dualen Programms ist:
Lemma 2.19 Sind x und y primal bzw. dual zulässige Vektoren, so gilt cT x ≥ y T b.
2.3. DAS GEWICHTETE MATCHINGPROBLEM
Beweis:
35
Aus der Tatsache, dass x und y primal bzw. dual zulässig sind, folgt unmittelbar
(D)
(P )
cT x ≥ (y T A)x = y T (Ax) = y T b.
Beispiel 2.20 (Gewichtetes Bipartites Matching) Um das bipartite Matching Problem in einem
Graphen G = (A ∪ B, A × B) mit Gewichtsfunktion w : A × B → R als lineares Programm zu formulieren, gehen wir wie folgt vor. Wir führen für jede Kante e ∈ A × B eine Variable xe ein, die die
Werte Null oder Eins annehmen soll. Dabei sollen letztendlich die Kanten mit Wert xe = 1 genau den
Kanten eines (perfekten) Matchings entsprechen.
Damit letzteres der Fall ist, müssen wir für jeden Knoten genau eine der mit dem Knoten inzidenten
Kanten auswählen. Es muss also gelten:
X
xe = 1
für alle v ∈ A ∪ B.
e:v∈e
Minimieren wollen wir das Gewicht des Matchings, d.h. die Funktion
X
w(e) · xe .
e∈A×B
Damit erhalten wir als lineares Programm
(P )
s.t.
P
w(e) · xe
x
=
1
für alle v ∈ A ∪ B
e:v∈e e
xe ≥ 0
für alle e ∈ A × B.
min
P
e∈A×B
Das zugehörige duale Programm lautet:
P
(D)
max v∈A∪B yv
s.t. ya + yb ≤ w(e)
für alle e = {a, b} ∈ A × B.
Man beachte die Analogie zu den im vorigen Abschnitt eingeführten Notationen. Die Variablen yv , v ∈
A ∪ B entsprechen der Markierungsfunktion ℓ : A ∪ B → R und die Nebenbedingung aus (D) entspricht
genau der Zulässigkeitsbedingung (2.1). Daher ist Proposition 2.17 auch nichts anderes als Lemma 2.19
angewandt auf den Spezialfall bipartites Matching.
Eine Problematik wollen wir hier noch kurz ansprechen. In der Formulierung des primalen Programms
haben wir die Annahme xe ∈ {0, 1} durch die weit schwächere Bedingung xe ≥ 0 ersetzt, aus der zusammen mit den Bedingungen an die Summe pro Knoten sich die Bedingung 0 ≤ xe ≤ 1 ableiten lässt.
Statt der Forderung xe ∈ {0, 1} haben wir also nur die Forderung xe ∈ [0, 1] in dem Programm unterge”
bracht“. Man sagt daher auch das lineare Programm ist eine Relaxierung des eigentlich interessierenden
ganzzahligen Programms. Da durch die Relaxierung das Minimum höchstens kleiner wird (man minimiert
ja über einen grösseren Bereich), ist ein ganzzahliges Optimum des linearen Programms immer auch ein
Optimum des ganzzahligen Programms. Die Umkehrung gilt allerdings im Allgemeinen nicht. Wohl aber
in diesem speziellen Fall – wie wir später sehen werden.
Eine Konsequenz von Lemma 2.19 ist, dass der optimale (=minimale) Wert des primalen Programms
immer größer gleich dem optimalen (=maximalen) Wert des dualen Programms ist. In der Tat gilt sogar
Gleichheit:
Satz 2.21 Sind (P ) und (D) zueinander duale lineare Programme, so ist der Wert ihrer optimalen
Lösungen gleich, d.h.
min{cT x | x primal zulässig} = max{y T b | y dual zulässig}.
36
KAPITEL 2. MATCHING PROBLEME
Auf den Beweis dieser Tatsache müssen wir aus Platzgründen leider verzichten. Aus Satz 2.21 kann man
dann zusätzlich ein Kriterium ableiten, wann zwei zulässige Lösungen x und y optimal sind.
Satz 2.22 (Satz vom schwachen komplementären Schlupf ) Gegeben das Paar zueinander dualer
linearer Programme
(P )
min cT x
Ax
x
(D) max
=b
≥0
und
yT b
y T A ≤ cT .
Sei x zulässige Lösung von (P ) und y zulässige Lösung von (D). Dann gilt
x optimal für (P ) und y optimal für (D)
⇐⇒
(ci − y T A.i )xi = 0 für alle i = 1, · · · , n,
(2.4)
wobei A.i die i-te Spalte von A bezeichne.
Beweis:
⇐“ Diese Richtung folgt wegen
”
n
X
(ci − y T A.i )xi = cT x − y T Ax = cT x − y T b
i=1
sofort aus Lemma 2.19.
⇛“ Da x und y jeweils zulässige Lösungen sind und somit für alle i = 1, · · · , n gilt
”
ci − y T A.i ≥ 0
und
xi ≥ 0,
folgt diese Richtung aus der Tatsache, dass für optimale Lösungen cT x = y T b gilt.
Das Optimalitätskriterium aus Satz 2.22 kann man nun verwenden, um einen Algorithmus zur Bestimmung optimaler primaler (und dualer) Lösungen zu konstruieren. Dazu halten wir zunächst fest, dass
sich die Bedingungen des komplementären Schlupfes auch wie folgt umformulieren lassen:
(
i) y T A.i < ci ⇒ xi = 0
x optimal für (P ) und y optimal für (D)
⇐⇒
ii) xi > 0 ⇒ y T A.i = ci
Die Grundidee der primal-dualen Methode ist nun wie folgt. Wir starten mit einer beliebigen dual zulässigen Lösung y0 , die wir sukzessive in eine optimale Lösung umbauen“ wollen. Dazu verwenden wir die
”
obige Darstellung des komplementären Schlupfes. Wir definieren daher eine Menge
S := {1 ≤ i ≤ n | y0T A.i = ci },
die der Menge der Indizes i entspricht für die xi positiv sein darf. Mit Hilfe von S definieren wir die
eingeschränkten Probleme
(RP )
min
n
X
zi
und
(RD)
max
uT b
i=1
Ax + z
xi
z
=b
(
≥0
=0
≥0
i∈S
i 6∈ S
uT A.i
≤0
u
≤1
i∈S
.
(RD) ist das duale Problem zu (RP ), aus dem die Variablen mit Index i 6∈ S gestrichen wurden.
Es gilt nun: Ist y0 zulässig für (D), (x0 , z0 ) optimale Lösung von (RP ), und ist z0 ≡ 0, so gilt:
y0 ist optimal für (D) und x0 ist optimal für (P ). (Dies folgt unmittelbar aus der Tatsache, dass wegen
z0 = 0 und x0 eine zulässig Lösung für (P ) ist und daraus, dass die Bedingungen des komplementären
Schlupfes erfüllt sind.)
2.3. DAS GEWICHTETE MATCHINGPROBLEM
37
Damit ergibt sich das folgende Schema zur Bestimmung optimaler Lösungen x0 und y0 :
Primal-duale Methode
Wähle eine zulässige Lösung y0 für (D) beliebig.
Wiederhole, bis eine der Abbruchbedingungen gegeben ist:
Bestimme zugehörige eingeschränkte Probleme (RP ) und (RD)
Berechne optimale Lösung (x0 , z0 ) von (RP )
Falls z0 = 0 −→ stop: x0 und y0 sind optimal
Berechne optimale Lösung u0 von (RD)
Falls uT0 A ≤ 0 −→ stop: (P ) ist unlösbar
Bestimme neue dual zulässige Lösung: y0 ← y0 + λ0 u0 ,
cj − y0T A· j
| uT0 A· j > 0}.
wobei λ0 := min{
j
uT0 A· j
Wir wollen uns nun noch kurz überlegen, warum die primal-duale Methode funktioniert. Dazu betrachten
wir die eingeschränkten Programme (RP ) und (RD). Da die beiden Programme dual zueinander sind,
haben sie nach Satz 2.21 den gleichen optimalen Wert. Der Wert von (RP ) ist entweder Null, dann ist
z0 identisch Null und x0 die gesuchte optimale Lösung für (P ), oder er ist positiv. Dann ist der optimale
Wert von (RD) ebenfalls positiv, d.h. es gilt uT0 b > 0. Dies bedeutet aber, dass für alle y = y0 + λu0 mit
λ > 0 gilt:
y T b = (y0 + λu0 )T b = y0T b + λuT0 b > y0T b.
Wir erhalten daher für jedes λ > 0 ein y, für das das duale Programm (D) einen echt grösseren Wert
als für y0 hat. Für welche λ > 0 ist y aber auch dual zulässig? Zu prüfen ist, ob y T A ≤ cT , d.h. ob
y T A·,i ≤ ci für alle i gilt. Betrachten wir diesen Ausdruck etwas genauer:
(
≤ y0T A·,i
für i ∈ S, nach Def. von S und da u0 zulässig für (RD)
T
T
T
y A·,i = y0 A·,i +λ·u0 A·,i
T
= ci − δi + λ · u0 A·,i für i 6∈ S und einem δi > 0, nach Definition von S.
Es gibt daher ein λ > 0, so dass für alle i ∈
6 S (und damit für alle i) y T A·,i ≤ ci gilt. Im Algorithmus
wird das grösste solche λ gewählt, da dann für das zugehörige y der Wert des dualen Programm (D) um
den grösst möglichen Betrag ansteigt.
Etwas schwieriger ist es, Aussagen über die Endlichkeit des Verfahrens zu gewinnen. Zwar wissen wir,
dass sich der Wert der dualen Lösung y0 in jedem Schritt verbessert, doch könnnen wir a priori keine
Aussagen über das Mass der Verbesserung treffen. Trotzdem kann man zeigen, dass der primal-duale
Ansatz im Allgemeinen terminiert. Der Beweis dieser Aussage sprengt allerdings wieder den Rahmen
unserer Ausführungen.
Besonders interessant ist der primal-duale Ansatz, wenn sich zumindest eines der eingeschränkten Probleme (RP ) und (RD) kombinatorisch interpretieren lassen. Dann können wir unter Umständen auf
bekannte Lösungsverfahren für dieses Problem zurückgreifen und die zugehörige duale Lösung raten“.
”
Dies ist beispielsweise für das bipartite Matchingproblem der Fall.
Beispiel 2.23 (Fortsetzung von Beispiel 2.20) Das eingeschränkte primale Problem (RP ) entspricht
hier einem ungewichteten Matchingproblem: Die (Knoten-)Variablen
zv erlauben nicht überdeckte
P Knoten.
P
Ist ein Knoten v nicht überdeckt so ist die P
Summe e:v∈e xe gleich Null und die Gleichung e:v∈e xe +
zv = 1 ist daher für zv = 1 erfüllt. Da wir v zv minimieren sollen, entspricht das Problem (RP ) daher
der Bestimmung eines (kardinalitäts-)maximalen Matchings in dem Graphen GS , der durch die Kanten
e ∈ S gegeben ist. Formal
X
X
(RP ) min
zv
und (RD) max
uv
v∈A∪B
X
e:v∈e
xe
zv
xe + zv
v∈A∪B
=1
(
∀v ∈ A ∪ B
≥0
=0
∀e ∈ S
∀e 6∈ S
≥0
∀v ∈ A ∪ B
ya + yb ≤ 0
uv ≤ 1
∀{a, b} ∈ S
∀v ∈ A∪B
.
38
KAPITEL 2. MATCHING PROBLEME
Um (RP ) optimal zu lösen genügt es in dem Graphen GS ein kardinalitätsmaximales Matching M zu
bestimmen. An Hand von M kann man dann optimale Lösungen (x, z) und u für (RP ) bzw. (RD)
unmittelbar ablesen. Dazu setzen wir
(
(
1 e∈M
1 v nicht überdeckt von M
xe =
und
zv =
0 sonst
0 sonst
und


+1
uv = −1


0
es gibt einen alternierenden Pfad gerader Länge von einem nicht überdeckten Knoten v0 zu v
es gibt einen alternierenden Pfad ungerader Länge von einem nicht überdeckten Knoten v0 zu v
sonst,
(Man beachte, zu einem Knoten v kann es nicht alternierenden Pfade gerader und ungerader Länge geben,
denn dann gäbe es auch einen augmentierenden Pfad, im Widerspruch zur angenommenen Maximalität
von M ).
Man überzeugt sich leicht, dass das so definierte u eine zulässige LösungPvon (RD) ist, deren Wert der
Anzahl nicht überdeckter Knoten in A∪B entspricht. In der Tat gilt, dass
uv genau zweimal der Anzahl
nicht überdeckter Knoten in A ∪ B entspricht, da es ja für jeden gematchten Knoten mit Wert -1 auf
der anderen Seite einen “Partnerknoten“ (nämlich der über die Matchingkante erreichbare Knoten) mit
Wert +1 gibt. Zum anderen können wir Aussagen über uA·,i wie folgt herleiten. Die Spalten der Matrix A
entsprechen in diesem Beispiel den Kanten e des Graphen. Für jede Kanten e = {a, b} erhalten wir daher
den Ausdruck ua + ub und dieser muss für alle Kanten e ∈ S kleiner gleich Null sein. Wann könnte dies
verletzt sein? Nur dann wenn ua = 1 und ub = 0 (oder analog ua = 0 und ub = 1). Dies kann aber für
Kanten e = {a, b} aus S nicht der Fall sein. (Wäre eine solche Kante in S könnten wir den alternieren
Pfad zu a um die Kanten e zum Knoten b verlängern.)
Wir können daher an Hand eines kardinalitätsmaximalen Matchings in dem durch die Kanten e ∈ S
gegebenen Graphen eine optimale duale Lösung für (RD) bestimmen und somit auch die aktuelle duale
Lösung für (D) verbessern. Genau dies haben wir in dem im vorigen Abschnitt vorgestellten Algorithmus
auch getan – mit dem einzigen Unterschied, dass wir (aus Gründen der Einfachheit und Effizienz) nur
alternierende Pfade mit Startknoten in der Menge A betrachtet haben.
Beispiel 2.24 (Kürzeste Pfade) Gegeben ist ein gerichteter Graph G = (V, A, c) mit einer Kostenfunktion c : A → Z+ und zwei Knoten s, t ∈ V . Gesucht ist ein kürzester gerichteter Pfad zwischen s
und t. Wir möchten dieses Problem mit der primal-Dualen Methode lösen. Dazu müssen wir das Problem
zunächst als lineares Programm schreiben. Eine naheliegende Idee ist, einen Fluss f mit Wert 1 von
s = v1 nach t = v2 zu schicken, wobei die Kapazität auf den Kanten nicht beschränkt ist. Wir minimieren
die Gesamtkosten des Flusses, d.h. cT f . Da wir keine Kapazitätbeschränkung haben, wird der gesamte
Fluss über den billigsten Weg nach t fliessen - dieser Weg entspricht aber genau dem kürzesten s-t-Pfad.
Unser lineares Programm sieht nun folgendermassen aus.
min cT f




s.t. Af = 


f ≥0
+1
-1
0
..
.
0







Dabei bezeichnet A die Inzidenzmatrix von G, d.h.


+1 , ej verlässt den Knoten vi .
aij = −1 , ej führt in den Knoten vi hinein.


0
, sonst
2.3. DAS GEWICHTETE MATCHINGPROBLEM
39
Offensichtlich benötigen wir die Nebenbedingung für den Knoten t nicht, denn dieser Knoten schluckt
einfach den gesamten Fluss. Wir streichen also aus A die ensprechende Zeile und erhalten
min cT f
(P)


+1
 0 


s.t. Af =  . 
 .. 
0
f ≥0
und
max ys
(D)
s.t. ya − yb ≤ cab ∀(a, b) ∈ A
yt = 0.
Eine zulässing duale Lösung ist durch yv = 0 ∀v gegeben. Wir können also annehmen, dass uns zu Beginn
jeder Iteration der primal-dualen Methode eine dual zulässige Lösung y zur Verfügung steht. Sei
S = {(a, b) ∈ A : ya − yb = cab },
d.h. S enthält alle Kanten über welche man Fluss schicken kann ohne die Optimalitätsbedingungen zu
verletzen. Damit erhalten wir eingeschränke lineare Programme
min
n−1
X
zi
i=1
(RP)



s.t. Af + z = 

+1
0
..
.
f ≥0
0





fa b = 0 ∀(a, b) 6∈ S
z≥0
(2.5)
und
max us
s.t. ua − ub ≤ 0 ∀(a, b) ∈ S
(RD)
uv ≤ 1 ∀v ∈ V.
Es stellt sich nun heraus, dass (RD) sehr einfach zu lösen ist. Zunächst ist das duale Optimum entweder
0 oder 1. Das kann man wie folgt bergründen. Das primale Optimum ist 0 genau dann, wenn es einen
Pfad zwischen s und t gibt, der nur Kanten aus S benutzt (Denn damit gibt es auch einen zulässigen
s-t-Fluss). Anderenfalls kann man sich leicht überlegen, dass
(
0 , falls es einen Pfad von v nach t in S gibt.
∗
uv =
1 , sonst
zulässig für (RD) ist. Wegen uv ≤ 1 ist u∗ offensichtlich optimal. Das bedeutet aber, dass man (RD)
durch eine einfache Breitensuche bestimmen kann. Da (u∗a − u∗b ) ∈ {−1, 0, 1} erhalten wir
λ = min{cab − (ya − yb ) : u∗a − u∗b > 0}.
Sei nun W = {v ∈ V : u∗v = 0}. Man kann zeigen (Übungsaufgabe!), dass für alle v ∈ W der Wert von
yv der Länge des kürzesten Pfades von v nach t entspricht. Weiterhin kann man sich leicht überlegen,
40
KAPITEL 2. MATCHING PROBLEME
dass für alle v 6∈ W der Wert von yv gleich ist - denn wegen der Wahl von u∗ werden in jeder Iteration
alle dualen Variables zu Knoten in V \ W um den gleichen Wert erhöht. Das bedeutet, dass in jeder
Iteration der primal-dualen Methode die Menge W um den Knoten in V \ W erweitert wird, der die
geringste Distanz zu t hat. Dies ist aber genau die Idee, dessen sich der Algorithmus von Dijkstra bedient.
Tatschlich genügt es, den primal-dualen Algorithmus von einigen Ballast zu befreien um zu sehen, dass
beide Algorithmen identisch sind.
2.3.3
Allgemeine Graphen
Für allgemeine Graphen G = (V, E) mit Gewichtsfunktion w : E → R gehen wir im Prinzip ganz ähnlich
vor, wie im vorigen Abschnitt für den bipartiten Fall ausgeführt. D.h., wir stellen ein lineares Programm
und das zugehörige duale Programm auf und verwenden die primal-duale Methode. Dadurch ergibt sich
in jedem Schritt statt eines gewichteten Matchingproblems ein ungewichtetes Matchingproblem, das wir
mit Hilfe des in Abschnitt 2.2.3 entwickelten Algorithmus lösen können.
Wir beginnen daher mit dem linearen Programm
P
(P )
min e∈E w(e) · xe
P
für alle v ∈ V
s.t.
e:v∈e xe = 1
xe ≥ 0
für alle e ∈ E.
Das zugehörige duale Programm lautet:
P
max v∈V yv
s.t. yu + yv ≤ w(e)
(D)
für alle e = {u, v} ∈ E.
Die Problematik hier ist, dass im Fall von allgemeinen Graphen eine optimale Lösung von (P ) nicht
notwendigerweise ganzzahlig sein muss. Betrachten wir dazu das folgende Beispiel:
2
1
5
1
1
1
3
2
1
4
1
1
2
2
6
Die Zahlen an den Kanten seinen hierbei das Gewicht der Kante. Ein gewichtsminimales perfektes Matching ist beispielsweise
1
5
3
2
Betrachten wir andererseits
4
6
2.3. DAS GEWICHTETE MATCHINGPROBLEM
41
1
5
4
3
2
6
wobei wir allen gestrichelten Kanten den Wert 1/2 geben und den übrigen Kanten den Wert Null. Dann
sieht man leicht, dass der so definierte Vektor eine zulässige Lösung für (P ) ist, dessen Wert echt kleiner
als der Wert eines gewichtsminimalen perfekten Matchings ist.
Wie können wir die Problematik fassen? Betrachten wir dazu eines der Dreiecke in der Zeichnung. Da ein
Dreieck aus ungerade vielen Knoten besteht, wissen wir, dass es in jedem perfekten Matching eine Kanten
geben muss, die das Dreieck nach aussen“ verbindet. Dies ist in der gefundenen nichtganzzahligen Lösung
”
nicht der Fall. Fügen wir daher für alle Knotenmengen X ⊂ V mit |X| ungerade eine Ungleichung der
Form
X
xe ≥ 1
e:|e∩X|=1
zu (P ) hinzu, würden wir zumindest in obigem Beispiel alle nichtganzzahligen optimalen Lösungen ausschliessen. Wie man zeigen kann, ist dies auch allgemein der Fall.
42
KAPITEL 2. MATCHING PROBLEME
Kapitel 3
Das Rundreiseproblem
Eines der bekanntesten kombinatorischen Optimierungsprobleme ist das so genannte Rundereiseproblem
oder auch kurz TSP, von engl. travelling salesman problem.
Rundreiseproblem (tsp)
Eingabe: Ein vollständiger Graph G = (V, V2 ) mit Längenfunktion ℓ : V2 → R≥0 .
Ausgabe: Ein Hamiltonkreis H mit ℓ(H) = min{ℓ(H ′ ) : H ′ Hamiltonkreis in G}.
(Ein Hamiltonkreis in einem Graphen ist ein Kreis, der jedem Knoten des Graphen enthält.)
Oftmals betrachtet man das Problem auch für Graphen mit E 6= V2 . Dies ist keine echte Verallgemeinerung, da man beispielsweise jede nicht in dem Graphen vorhandene Kante zu dem Graphen hinzufügen
könnte und mit einem entsprechend hohen Gewicht versehen könnte. Beispielsweise führt ein Gewicht
von |V | · maxe∈E ℓ(e) + 1 dazu, dass man eine der neu hinzugefügten Kanten höchstens dann nimmt, wenn
der ursprüngliche Graph keinen Hamiltonkreis enthält.
Formalisiert man dieses Argument, so erhält man unmittelbar:
Satz 3.1 Das Rundreiseproblem ist NP-schwer.
Beweis: Wir reduzieren das NP-vollständige Problem Gegeben ein Graph G = (V, E), enthält G einen
”
Hamiltonkreis?“ auf das Rundreiseproblem.
Dies erreichen wir, in dem wir einen gegebenen Graphen G = (V, E) durch einen vollständigen Graphen
e = (V, V ) auf der gleichen Knotenmenge ersetzen und als Gewichtsfunktion die Funktion
G
2
ℓ:e→
(
1 e∈E
2 sonst
e ℓ) die Länge einer kürzesten TSP-Tour in dem Graphen G,
e
verwenden. Bezeichnen wir nun mit tsp(G,
so gilt offenbar
G enthält Hamiltonkreis
⇐⇒
e ℓ) = n(= |V |).
tsp(G,
D.h., jeder Algorithmus für das Rundreiseproblem löst insbesondere auch das NP-vollständige Entscheidungsproblem ob ein Graph einen Hamiltonkreis enthält.
Eine einfache Abwandlung dieses Beweises zeigt sogar, dass das Rundreiseproblem nicht einmal gut
approximiert werden kann.
Satz 3.2 Für alle c ∈ N gilt: Für das Rundreiseproblem gibt es keinen polynomiellen Approximationsalgorithmus mit Güte ≤ c, ausser es gilt P = N P .
43
44
KAPITEL 3. DAS RUNDREISEPROBLEM
Beweis:
funktion
Wir gehen analog vor wie im letzten Beweis, allerdings verwenden wir diesmal die Längen(
1
e∈E
ℓ:e→
1 + cn sonst.
e
Dann gilt für jeden Hamiltonkreis H in G:
Ist H ein Hamiltonkreis in G, so ist ℓ(H) = n. Ist andererseits H kein Hamiltonkreis in G, so ist
ℓ(H) ≥ (n − 1) · 1 + (1 + cn) = (c + 1)n.
Jeder Approximationsalgorithmus für das Rundreiseproblem mit Güte c muss daher einen Hamiltonkreis
in G ausgeben, falls ein solcher existiert.
3.1
Exakte Lösungsverfahren
Im Hinblick auf Satz 3.1 ist es nicht weiter verwunderlich, das die besten bekannten Lösungsverfahren
für das Rundreiseproblem exponentielle Laufzeit haben. Dennoch stellt sich die Frage wie schnell diese
sind.
3.1.1
Dynamische Programmierung
Ein triviales√Durchprobieren aller möglichen Hamiltonkreise führt zu einem Algorithmus mit Laufzeit
O(n!) = O( n(n/e)n ).
Mit einer dynamischen Programmierung geht es viel schneller, allerdings erkauft man sich, wie wir gleich
sehen werden, den Laufzeitvorteil mit zusätzlichem Speicherbedarf.
Wie bei der dynamischen Programmierung üblich, besteht der Haupttrick des Algorithmus darin, sich
eine geeignete, rekursiv berechenbare Funktion auszudenken. Hier wählt man: (im Folgenden gelte o.E.
V = {1, . . . , n})
f (i, S) := Länge eines kürzesten Pfades von 1 nach i, der als innere Knoten
genau die Knoten aus S enthält.
Offenbar gilt:
1. f (i, {j}) = ℓ(1, j) + ℓ(j, i) für alle 1 < i 6= j ≤ n,
2. f (i, S) = minj∈S [f (j, S \ {j}) + ℓ(j, i)] für alle 2 ≤ i ≤ n und S ⊆ V \ {1, i} und
3. tsp(G, ℓ) = min1≤i≤n [f (i, V \ {1, i}) + ℓ(i, 1)].
Damit erhalten wir unmittelbar den folgenden Algorithmus für die Berechung der minimalen Länge einer
Rundreise:
TSP (Dynamische Programmierung)
Eingabe: vollständiger Graph mit V = {1, . . . , n} und Gewichtsfunktion ℓ :
Ausgabe: Länge eines kürzesten Hamiltonkreises.
for all 2 ≤ i 6= j ≤ n do
f (i, {j}) := ℓ(1, j) + ℓ(j, i);
for all 2 ≤ s ≤ n − 2 do
for all S ⊂ {2, . . . , n} mit |S| = s do
for all i ∈ {2, · · · , n} \ S do
f (i, S) = minj∈S (f (j, S \ {j}) + ℓ(j, i));
return min1≤i≤n [f (i, V \ {1, i}) + ℓ(i, 1)].
V
2
→ R.
3.1. EXAKTE LÖSUNGSVERFAHREN
45
Wie bei der dynamischen Programmierung üblich, kann man den Algorithmus leicht so modifizieren, dass
man statt der Länge einer minimalen Tour auch die Tour selbst erhält. Man muss sich dazu nur jeweils
merken, für welchen Index das Minimum angenommen wird.
Damit erhalten wir:
Satz 3.3 Mit Hilfe
dynamischen Programmierung lässt sich das Rundreiseproblem in Laufzeit O(n2 2n )
√ der
n
und Speicher O( n2 ) lösen.
Beweis: Von der Korrektheit haben wir uns schon überzeugt, wir müssen daher nur noch die behaupteten Komplexitätsschranken nachweisen.
Die Laufzeit lässt sich leicht durch
n−2
X n
· n · n + n) = O(n2 2n )
O(n +
s
s=2
Pn
abschätzen, da bekanntlich 2n = s=0 ns . Für die Abschätzung des Speicherbedarfs stellen wir zunächst
fest, das es jeweils genügt, die Werte für zwei aufeinanderfolgende Werte von s vorzuhalten. Der Speicherbedarf lässt sich daher durch
√
n
n
n
n
O(n · max (
+
)) = O(n · max
) = O(n ·
) = O( n · 2n )
2≤s≤n−2
1≤s≤n 2
s−1
s
⌊n/2⌋
2n
abschätzen, wobei die letzte Gleichung aus n2 = Θ( √
) folgt, was sich wiederum leicht unter Verwendung
n
der Stirlingformel herleiten lässt.
3.1.2
Branch and Bound
So genannte Branch and Bound“ Verfahren kommen in der Praxis bei vielen NP-schweren Optimie”
rungsverfahren zum Einsatz. Die grundsätzliche Idee ist hier, das zu Grunde liegende Problem rekursiv
in immer einfachere Probleme zu zerlegen. Beim Rundreiseproblem wählt man sich beispielsweise beliebig
(oder gemäss geeigneter Heuristiken) eine Kante e und unterscheidet die beiden Fälle:
e gehört zum optimalen Hamiltonkreis
und
e gehört nicht zum optimalen Hamiltonkreis.
Auf diese Weise erhält man aus dem Ausgangsgraphen G zwei Graphen G1 und G2 , wobei in G1 = G,
die Kante e aber bereits als Kante des Hamiltonkreises feststeht, und G2 = G \ e.
Mit beiden Graphen kann man nun rekursiv so weiter verfahren, d.h. eine Kante e′ auswählen und
die beiden Fälle e′ gehört zum optimalen Hamiltonkreis und e′ gehört definitiv nicht zum optimalen
Hamiltonkreis unterscheiden.
Man überlegt sich schnell, dass dieses Verfahren im Allgemeinen nicht sehr effizient sein wird, entspricht
die Komplexität dieses Verfahrens doch der Größe des dabei entstehenden Binärbaumes. Letzterer hat
Tiefe |E| und enthält somit 2|E| Knoten.
Die aus praktischer Sicht essentielle Idee besteht daher bei diesem Ansatz in dem zweiten Teil (→
Bound“) des Names. Hierunter versteht man Folgendes. Zu jedem Graphen bestimmt man eine möglichst
”
gute untere Schranke für die beste noch erzielbare Lösung. Ist diese Schranke schlechter als eine bereits
bekannte Lösung, so muss dieser Ast des Baumes nicht weiter betrachtet werden.
Betrachten wir diesen Ansatz für das Rundreiseproblem. Wir benötigen hierfür eine für jeden Graphen
effizient berechenbare, möglichst gute untere Schranke für die Länge eines minimalen Hamitonkreises.
46
KAPITEL 3. DAS RUNDREISEPROBLEM
Gerne wählt man hier den folgenden Ansatz: Für jeden Knoten wählen wir die beiden billigsten Kanten
aus und berechnen dann die Summe der Kantenlängen aller ausgewählten Kanten. Klar ist: Dieser Wert
ist kleiner gleich der doppelten Länge eines kürzesten Hamiltonkreises. (Dies sieht man wie folgt: Wählt
man in dem Hamiltonkreis für jeden Knoten die beiden billigsten (=einzigen) inzidenten Kanten aus, so
erhält man hier als Summe die doppelte Länge des Hamiltonkreises).
Betrachten wir ein Beispiel:
4
1
a
5
3
1
2
b
4
c
3
d
f
2
1
1
e
2
Als untere Schranke erhalten wir hier (Knoten in alphabetischer Reihenfolge):
1
((1 + 1) + (1 + 3) + (1 + 1) + (1 + 2) + (1 + 1) + (2 + 2)) = 8.5.
2
Als erste Zerlegungskante wählen wir e = {a, b}. Wir erhalten die beiden Graphen mit den unteren
Schranken
2
b
5
4
c
3
d
a
b
3
1
4
4
1
a
f
1
2
e
d
2
(2+4+2+3+2+4)/2=8.5
4
c
3
2
1
5
3
1
1
f
2
1
e
2
(3+7+2+3+2+4)/2=10.5
wobei die fett gezeichnete Kante {a, b} andeutet, dass diese Kante für den Hamiltonkreis fest ausgewählt
wurde.
Auf diese Art verfahren wir nun weiter, wobei wir folgenden Heuristiken verwenden:
• Wir zerlegen jeweils denjenigen Graphen, der aktuell die kleinste untere Schranke hat.
• In diesem Graphen wählen wir als Zerlegungskante die/ein beliebige der kürzesten Kanten des
Graphen.
• Hat ein Knoten bezüglich der fest ausgewählten Kanten bereits Grad 2, so werden allen anderen zu
ihm inzidenten Kanten gelöscht.
• Kanten, die mit bereits ausgewählten Kanten einen (Nicht-hamitonschen) Kreis erzeugen, werden
gelöscht.
• Entsteht durch das Löschen von Kanten ein Knoten vom Grad zwei, so werden die beiden mit
diesem Knoten inzidenten Kanten fest ausgewählt.
Damit ergibt sich der folgende Baum:
b
5
3
1
2
4
c
3
f
2
1
1
d
3.1. EXAKTE LÖSUNGSVERFAHREN
4
1
a
e
2
1 (2+4+2+3+2+4) = 8.5
2
\
/
4
3
b
5
3
c
4
c
3
2
e
5
3
1
2
f
1
1
d
a
b
1
2
4
4
1
a
1
d
e
2
2
1 (3+7+2+3+2+4) = 10.5
2
1 (2+4+2+3+2+4) = 8.5
2
\
/
1
a
b
5
3
2
3
e
1
1
1
a
b
5
c
f
1
4
3
e
2
4
c
2
1
d
2
1
d
1
a
1
a
5
c
3
2
1
d
f
e
d
d
1
13
f
2
e
3
d
2
5
4
c
f
2
1
e
2
1 (3 + 9 + 2 + 3 + 2 + 4) = 11.5 1 (3+7+4+3+3+4) = 12
2
2
5
e
4
c
3
d
2
12
1
2
2
1
d
f
b
3
1
2
4
c
4
1
a
c
2
4
b
3
1
f
2
1
e
2
1 (3+4+4+4+3+4) = 11
2
47
13
4
3
e
b
3
c
f
4
1
1
b
1
a
14
e
e
\
/
b
2
1
d
1
f
2
1
1 (6+9+4+3+2+6) = 14
2
a
5
f
3
e
1 (3 + 4 + 4 + 3 + 2 + 4) = 10
2
\
/
2
c
2
1 (2 + 5 + 4 + 4 + 2 + 4) = 10.5
2
11
d
b
1
b
3
2
2
a
4
1
a
f
1
3
e
4
5
5
4
c
\
/
b
3
f
3
e
\
4
1
a
5
c
1
d
b
1
2
1 (3+7+2+3+2+4) = 10.5
2
/
b
3
2
1 (3+4+4+3+2+4) = 10
2
\
1
1
d
a
f
2
1
2
1 (2+5+2+3+2+4) = 9
2
a
3
e
4
c
2
4
5
3
1
2
f
1
d
b
5
2
/
a
4
c
2
1
1
d
f
4
4
b
3
4
c
\
/
1
a
1
f
2
1
48
3.2
KAPITEL 3. DAS RUNDREISEPROBLEM
Das Rundreiseproblem mit Dreiecksungleichung
Von einem Rundreiseproblem mit Dreiecksungleichung spricht man, wenn die Längenfunktion ℓ :
die Dreiecksungleichung erfüllt, wenn also
ℓ(u, w) ≤ ℓ(u, v) + ℓ(v, w)
V
2
→R
für alle u, v, w ∈ V.
Man überzeugt sich leicht davon, dass die im Beweis von Satz 3.1 konstruierte Längenfunktion die Dreieckungleichung erfüllt. Es gilt daher:
Satz 3.4 Das Rundreiseproblem mit Dreiecksungleichung ist NP-schwer.
Im Gegensatz zum allgemeinen Rundreiseproblem ist das Rundreiseproblem mit Dreiecksungleichung
jedoch verhältnismäßig gut approximierbar. In der Tat erhalten wir aus der Tatsache, dass man in einem gewichteten Graphen einen minimal spannenende Baum effizient berechnen kann, leicht einen 2Approximationsalgorithmus. Wie dies geht veranschaulicht die folgende Abbildung:
Wir laufen also den Spannbaum aussen herum“ ab, wobei wir Pfadstücke, die bereits besuchte Knoten
”
enthalten, abkürzen. In der Abbildung sind wir beim Knoten oben links losgelaufen und haben den Baum
im Gegenuhrzeigersinn umlaufen.
Was können wir nun über die Länge des so gefundenen Hamiltonkreises sagen? Ohne Abkürzungen
würden wir jede Kante des Spannbaums genau zweimal durchlaufen. Auf Grund der Dreiecksungleichung
ist die Abkürzungskante“ höchstens so lang wie das ausgelassene Pfadstück entlang des Baumes. Der
”
gefundene Hamiltonkreis hat somit eine Länge, die höchstens doppelt so lang ist, wie die Länge des
minimal spannenden Baumes.
Da ein Hamiltonkreis, in dem man eine beliebige Kanten entfernt hat, einen Spannbaum darstellt, gilt
mst(G, ℓ) ≤ tsp(G, ℓ)
und somit
alg(G, ℓ) ≤ 2 mst(G, ℓ) ≤ 2 tsp(G, ℓ).
Der oben beschriebene Algorithmus stellt daher, wie zuvor behauptet, in der Tat einen 2-Approximationsalgorithmus dar.
Wie können wir diesen Algorithmus noch verbessern? Klar ist, wollen wir aus dem Baum einen Hamiltonkreis gewinnen, so müssen wir zumindest an Knoten mit ungeradem Grad, und somit insbesondere an
den Bättern des Baumes, eine Kante doppelt durchlaufen. Erinnern wir uns nun noch daran, dass man in
3.3. DAS EUKLIDISCHE RUNDREISEPROBLEM
49
einem Graphen in dem jeder Knoten geraden Grad hat eine Eulertour, d.h. einen geschlossenen Kantenzug, der jede Kante genau einmal enthält, effizient berechnen kann, so haben wir bereits alle Ideen für den
Approximationsalgorithmus von Christofides, den besten derzeit bekannten Approximationsalgorithmus,
zusammen.
Approximationsalgorithmus nach Christofides
Eingabe: vollständiger Graph mit V = {1, . . . , n} und Gewichtsfunktion ℓ : V2 → R, die die
Dreiecksungleichung erfüllt.
Ausgabe: Hamiltonkreis H mit ℓ(H) ≤ 23 tsp(G, ℓ).
1. Bestimme einen minimal spannenden Baum T .
2. Sei Vodd := {v ∈ V | v hat in T ungeraden Grad}.
3. Bestimme in dem durch Vodd induzierten Graphen G[Vodd ] ein minimales perfektes Matching M .
4. Bestimme in dem (Multi-)Graphen T ∪ M eine Eulertour E.
5. Wandle die Eulertour in einen Hamiltonkreis um, in dem entsprechende Abkürzungen eingefügt werden.
Satz 3.5 Der Approximationsalgorithmus von Christofides berechnet in Zeit O = (n3 ) einen Hamiltonkreis, der höchstens 1.5 mal so lang wie ein minimaler Hamitonkreis ist.
Beweis: Betrachten wir zunächst die Laufzeit. Die Berechnung eines minimal spannenden Baumes
lässt sich unter Verwendung von Fibonacci Heaps in O(m + n log n) realisieren. Für die Berechnung eines
minimalen perfekten Matchings müssen wir O(n3 ) veranschlagen (siehe Abschnitt 2.3.3), die Berechnung
einer Eulertour geht wiederum in Zeit O(m).
Nun zur Güte. Wir haben uns bereits überlegt, dass
mst(G, ℓ) ≤ tsp(G, ℓ).
Was können wir nun über das Gewicht des minimalen Matchings M sagen? Dazu überlegen wir uns
zunächst, dass wir aus jedem Hamiltonkreis in G einen höchstens genauso langen Hamiltonkreis in G[Vodd ]
erhalten können, in dem wir einfach jedes Pfadstücke, mit inneren Knoten aus V \ Vodd durch eine
entsprechende Abkürzungskante ersetzen, die wegen der Dreiecksungleichung höchstens so lang wie das
ersetzte Pfadstück ist. Somit gilt:
tsp(G[Vodd ], ℓ) ≤ tsp(G, ℓ).
Da in jedem Graphen die Anzahl Knoten mit ungeradem Grad gerade ist, enthält der minimale Hamiltonkreis in G[Vodd ] gerade viele Kanten. Wir können ihn daher in zwei perfekte Matchings zerlegen, von
denen das kürzere eine Länge von höchsten 21 tsp(G[Vodd ], ℓ) hat. Daher gilt:
ℓ(M ) ≤
1
tsp(G[Vodd ], ℓ)
2
und somit
1
3
ℓ(H) ≤ ℓ(T ∪ M ) = ℓ(T ) + ℓ(M ) ≤ mst(G, ℓ) + tsp(G[Vodd ], ℓ) ≤ tsp(G, ℓ).
2
2
3.3
Das euklidische Rundreiseproblem
Einen Spezialfall des Rundreiseproblems mit Dreicksungleichung erhält man, wenn die Längenfunktion
ℓ sich geometrisch interpretieren lässt. Unter dem euklidischen Rundreiseproblem versteht man entsprechend das folgende Problem: Gegeben n Punkte x1 , . . . , xn ∈ R2 in der Ebene setzen wir ℓ(xi , xj ) :=
||xi − xj ||2 , wobei ||xi − xj ||2 den (euklidischen) Abstand der beiden Punkte xi und xj bezweichne.
Überraschenderweise lässt sich das euklidische Rundreiseproblem wesentlich besser lösen, wie 1996 Arora
und Mitchell unabhängig voneinander gezeigt haben. Der Beweis des folgenden Satzes sprengt allerdings
den Rahmen dieser Vorlesung.
50
KAPITEL 3. DAS RUNDREISEPROBLEM
Satz 3.6 (Arora 1996, Mitchell 1996) Für das euklidische Rundreiseproblem gibt es ein polynomielles Approximationsschema.
Wir schliessen dieses Kapitel mit einem kurzen Überblick über den Komplexitätsstatus des Rundreiseproblems
positiv
negativ
TSP
O(n2 2n )
6∈ AP X
∆-TSP
Güte 3/2
6∈ P AS
eukl. TSP
PAS
6∈ F P AS
wobei die nagativen Resultate natürlich auf der Annahme P 6= N P beruhen.
Kapitel 4
Planare Graphen
Formal ist ein Graph durch Angabe seiner Knoten- und Kantenmengen vollständig beschrieben. Eine
anschaulichere Vorstellung erhält man andererseits meist erst dann, wenn man den Graphen zeichnet.
Um die Zeichnung übersichtlich zu halten, wird man dabei versuchen, die Anzahl der Schnittpunkte
von Kanten möglichst gering zu halten. Besonders übersichtlich wird die Zeichnung, wenn man solche
Überkreuzungen von Kanten völlig vermeiden kann.
Definition 4.1 Ein Graph heisst planar, wenn man ihn so zeichnen (man sagt auch: in die Ebene
einbetten) kann, dass sich keine Kanten kreuzen. Ein ebener Graph ist ein planarer Graph zusammen
mit seiner Darstellung in der Ebene.
Streng mathematisch gesehen ist dies noch keine Definition. Dazu müssten wir zuvor noch präzise definieren, was es heisst, einen Graphen zu zeichnen“ bzw. was Kreuzungen“ sind. Dies kann man tun,
”
”
allerdings nicht ohne beträchtlichen Aufwand. Wir werden uns in diesem Kapitel daher mit der Verwendung der aus der Anschauung offensichtlichen Begriffe und Tatsachen begnügen.
4.1
Eigenschaften planarer Graphen
Bevor wir uns der algorithmischen Frage zuwenden, wie man testen kann, ob ein gegebener Graph planar
ist, wollen wir zunächst noch einige Eigenschaften von planaren Graphen festhalten.
Wir betrachten zunächst einige Beispiele. Für den K4 findet man leicht eine planare Einbettung. Für
den K5 andererseits werden sämtliche Versuche ihn planar darzustellen spätestens an der letzten Kante
fehlschlagen. Er ist nicht planar. Als zweites Beispiel betrachten wir noch die so genannten vollständig
bipartiten Graphen Km,n , die aus zwei Mengen mit m bzw. n Knoten bestehen, wobei jeder Knoten in der
ersten Menge zu jedem Knoten in der zweiten Menge benachbart ist, während alle Knoten innerhalb der
gleichen Menge untereinander nicht benachbart sind. Wieder gilt: Für den K2,3 (und analog für K2,n , n
beliebig) findet man leicht eine planare Einbettung, für den K3,3 ist dies andererseits bereits nicht mehr
möglich.
K5
K2,3
K3,3
K4
planar
nicht planar
planar
nicht planar
Ebene Darstellungen planarer Graphen sind im Allgemeinen nicht eindeutig. Allerdings gelten gewisse
Invarianten. Beispielsweise wird in jeder Darstellung die Anzahl der Gebiete gleich sein. (Für die Definition
eines Gebietes verwenden wir wiederum eine anschauliche Definition: die zusammenhängenden Teile, die
man erhält, wenn man die Ebene entlang der Kanten zerschneidet.) Für den K4 erhält man vier Gebiete
(das äussere Gebiet zählt man mit), unabhängig davon wie man ihn zeichnet. Allgemein gilt:
51
52
KAPITEL 4. PLANARE GRAPHEN
Satz 4.2 (Eulersche Polyederformel) Sei G = (V, E) ein zusammenhängender ebener Graph. Dann
gilt
#Gebiete = |E| − |V | + 2.
Der Beweis folgt leicht durch Induktion über die Anzahl der Kanten.
Aus der eulerschen Polyederformel kann man leicht eine obere Schranke für die Anzahl Kanten eines
planaren Graphen ableiten.
Satz 4.3 Für jeden planaren Graphen G = (V, E) mit |V | ≥ 3 Knoten gilt
|E| ≤ 3|V | − 6.
Beweis: Ohne Einschränkung dürfen wir annehmen, dass G zusammenhängend ist. Wir betrachten
eine Einbettung von G. R seien die durch die Einbettung entstehenden Gebiete. Jedes Gebiet wird
von mindestens 3 Kanten begrenzt und jede Kante begrenzt höchstens zwei Gebiete. Daraus folgt, dass
3|R| ≤ 2|E|. Und zusammen mit der eulerschen Formel erhalten wir
2
|E| ≥ |R| = |E| − |V | + 2.
3
Daraus folgt aber, dass
1
|E| ≤ |V | − 2.
3
Multiplizieren wir nun beide Seiten mit 3, so erhalten wir das gewünschte Resultat.
Aus Satz 4.3 folgt, dass der K5 nicht planar ist. Der K5 hat nämlich 52 = 10 Kanten aber nur 5 Knoten
und 10 3 · 5 − 6. Mit einem ähnlichen Argument kann man zeigen, dass der K3,3 nicht planar ist. (Hier
verwendet man, dass der K3,3 bipartit ist und in einem bipartiten planaren Graphen alle Gebiete von
mindestens vier Kanten begrenzt werden müssen.)
Die beiden Graphen K5 und K3,3 sind in gewisser Weise die kleinsten nicht-planaren Graphen. Nichtplanare Graphen gibt es natürlich viele. Beispielsweise ist jeder Graph, der einen K5 oder einen K3,3 als
Teilgraphen enthält, ebenfalls nicht planar. Auch wenn wir ein oder mehrere Kanten des K5 oder des K3,3
durch Pfade ersetzen, ist der dadurch entstehende Graph, den man auch als Unterteilung des K5 bzw. des
K3,3 bezeichnet, ebenfalls nicht planar. Der polnischen Mathematiker Kazimierz Kuratowski (1896–
1980) konnte andererseits zeigen, dass wir damit auch schon alle Arten, einen nicht-planaren Graphen zu
erzeugen, beschrieben haben.
Satz 4.4 (Kuratowski) Ein Graph G ist genau dann planar, wenn er weder eine Unterteilung des K5
noch des K3,3 als Teilgraphen enthält.
Satz 4.4 ermöglicht unmittelbar einen Test auf Planarität. Allerdings ist dessen Laufzeit miserabel: Da wir
nicht nur auf den K5 und den K3,3 testen müssen, sondern auch auf alle beliebig grossen Unterteilungen,
erhalten wir so a priori nur einen exponentiellen Algorithmus. Ein effizienteres Verfahren werden wir im
nächsten Abschnitt herleiten.
4.2
Planaritätstest
In vielen Fällen ist nicht unmittelbar zu entscheiden, ob es sich bei einem gegebenen Graphen um einen
planaren Graphen handelt. Ziel dieses Abschnittes ist es daher, einen effizienten Algorithmus zu beschreiben, der einen beliebigen Graphen G = (V, E) als Eingabe erhält und als Ausgabe eine mögliche
Einbettung von G liefert, falls G planar ist, bzw. erkennt, dass G nicht planar ist. Dabei soll eine Laufzeit
von O(|V |) erreicht werden. Es sei darauf hingewiesen, dass hier keine Versuche unternommen werden, eine möglichst “schöne” Einbettung zu finden. Hierfür gibt es spezielle Algorithmen. Einen solchen werden
wir im nächsten Abschnitt vorstellen.
4.2. PLANARITÄTSTEST
53
Ohne Beschränkung der Allgemeinheit wird im folgenden angenommen, dass es sich bei G um einen
2-fach zusammenhängenden Graphen handelt. Andernfalls kann der Graph zunächst an seinen Artikulationsknoten zerlegt und die Komponenten einzeln auf Planarität getestet werden. Aus den Einbettungen
der Komponenten kann man dann auf einfache Weise eine Einbettung für den Gesamtgraphen erhalten.
Zudem können wir nach Satz 4.3 annehmen, dass die Bedingung m ≤ 3n − 6 erfüllt ist. Ansonsten ist
der Graph ja auf keinen Fall planar.
Definition 4.5 Sei G = (V, E) ein Graph, der einen Kreis C enthält (ein solcher existiert, da wir
2-fach Zusammenhang vorausgesetzt hatten). Ein Segment ist eine Komponente von V \ C, E \ C2
zusammen mit allen von dort ausgehenden Kanten.
Die Verankerungen eines Segmentes sind die Knoten von C, an denen eine Kante des Segmentes endet.
Zwei Segmente Si und Sj heissen überlappend, falls sie mindestens drei gemeinsame Verankerungen
haben oder es paarweise verschiedene Verankerungen a, b von Si und c, d von Sj gibt, so dass diese auf
dem Kreis C in der Reihenfolge a, c, b, d vorkommen.
C
S1
Nebenstehende Skizze veranschaulicht diese Begriffe. Bei S1 bis
S5 (incl. der ausgehenden Kanten) handelt es sich um Segmente
bezüglich C. Die markierten Punkte auf C stellen die Verankerungen der Segmente dar. überlappend sind beispielsweise die
Segmente S1 und S2 (drei gemeinsame Verankerungen), S3 und
S5 sowie S4 und S5 . Intuitiv gesprochen sind zwei Segmente also genau dann überlappend, wenn man sie nicht beide auf einer
Seite des Kreises (also innen oder aussen) einbetten kann, ohne
dass sich Kanten kreuzen.
S2
S3
S4
S5
Lemma 4.6 Sei G ein Graph mit einem Kreis C und den Segmenten S1 , . . . , Sk . Gilt C + Si planar
∀ i = 1, . . . , k und Si und Sj überlappen sich nicht ∀ 1 ≤ i < j ≤ k, so ist G planar und es gibt eine
Einbettung, in der alle Segmente ausserhalb von C liegen (oder alle innerhalb).
Beweis:
Wir führen den Beweis per Induktion über die Anzahl der Segmente k.
k = 0: klar.
k − 1 ⇒ k: Seien 0, . . . , ℓ − 1 die Knoten des Kreises C (in dieser Reihenfolge).
Wähle zwei Knoten des Kreises i0 , i1 ∈ {0, . . . , ℓ − 1} mit kleinstmöglichem Abstand, so dass ein
Segment Sj0 existiert, für das alle Verankerungen in {i0 , . . . , i1 } liegen. [Achtung: Wir fordern nicht,
dass i0 < i1 . Falls i0 > i1 , so rechnen wir modulo ℓ.] Falls es mehrere solche Sj0 gibt, wähle eines
mit maximal vielen Verankerungen. Unser Ziel ist es, die Induktionsannahme auf die Segmente
S1 , . . . , Sj0 −1 , Sj0 +1 , · · · Sk anzuwenden und dann zu argumentieren, dass man auch das Segment
Sj0 noch einbetten kann. Dazu zeigen wir zunächst:
Für alle Segmente Sj mit j 6= j0 gilt:
Sj enthält keine Verankerung aus {i0 + 1, . . . , i1 − 1}.
Wir zeigen die Behauptung mit einem Widerspruchsbeweis. Angenommen, Sj enthält doch so eine
Verankerung. Dann sind drei Fälle zu unterscheiden:
1. Fall: Sj enthält auch eine Verankerung ausserhalb von {i0 , . . . , i1 }
54
KAPITEL 4. PLANARE GRAPHEN
i1
Sj
Sj
0
⇒ Widerspruch, da Sj0 und Sj überlappen.
i0
2. Fall: Sj enthält keine Verankerung ausserhalb von {i0 , . . . , i1 } und i0 oder i1 ist keine Verankerung von Sj
i1
Sj
Sj
0
⇒ Widerspruch zur Wahl von i0 , i1 .
i0
3. Fall: i0 und i1 sind Verankerungen von Sj . Da Sj und damit auch Sj0 (wir haben das Segment
mit maximal vielen Verankerungen gewählt) eine weitere Verankerung in {i0 , . . . , i1 } hat, folgt
i1
Sj
⇒ Widerspruch, da Sj0 und Sj überlappen.
Sj
0
i0
(Fortsetzung des Induktionsbeweises:)
C + (S1 + · · · + Sj0 −1 + Sj0 +1 + · · · + Sk ) sind planar nach der Induktionsannahme. Ausserdem ist
C + Sj0 planar nach Voraussetzung.
Da alle Verankerungen von Sj0 innerhalb des Intervalls {i0 , . . . , i1 } liegen und kein anderes Segment eine Verankerung {i0 − 1, . . . , i1 − 1} enthält, kann man beide Einbettungungen problemlos
zusammenfügen und erhält so eine Einbettung für C + (S1 + · · · + Sk ).
Damit ist der Induktionsschritt abgeschlossen und Lemma 4.6 gezeigt.
Korollar 4.7 Sei G ein Graph mit einem Kreis C und den Segmenten S1 , . . . , Sk .
Dann gilt:
G planar
⇔
(1) C + Si planar ∀ i = 1, . . . , k und
(2) ∃ Partition {1, . . . , k} = I1 ∪ I2 , so dass sich
keine zwei Segmente aus der gleichen Menge
überlappen.
Beweis:
Zu zeigen sind wieder beide Richtungen:
“⇒”: Klar: wähle für I1 die Menge der innen liegenden Segmente und für I2 die aussen liegenden Segmente.
“⇐”: Wende Lemma 4.6 zweimal an: erst auf die Segmente in I1 (bette diese aussen ein), dann auf die
Segmente in I2 (bette diese innen ein).
4.2. PLANARITÄTSTEST
55
Damit folgt die Aussage.
Aufbauend auf Korollar 4.7 kann man (mit einigem Aufwand) den Satz von Kuratowski (→ Satz 4.4)
beweisen. Wir überlassen dies dem Leser.
Lemma 4.8 Sei C ein Kreis, S ein Segment und P ein Pfad auf C, der alle Verankerungen von S
enthält.
Dann gilt:
⇔
C + S planar
(1) P + S planar und
(2) es gibt eine Einbettung von P + S, in der P
zum Rand des äusseren Gebietes gehört.
Beweis:
Die Richtigkeit dieser Aussage ist nach folgender Skizze unmittelbar einsichtig:
C
P
S
Lemma 4.8 liefert also eine Möglichkeit, den auf Planarität zu testenden Graphen zu verkleinern, wovon
im folgenden Gebrauch gemacht werden wird.
Idee für einen Planaritätstest
Die bisherigen überlegungen führen zu einer ersten Idee, wie sich ein Planaritätstest für einen Graphen
G realisieren lässt:
• Wähle Kreis C beliebig, bestimme die Segmente Si und entsprechende Pfade Pi .
• Verifiziere rekursiv, dass Si + Pi (hat weniger Kanten als G!) planar ist und es eine Einbettung gibt,
in der Pi aussen liegt.
• Bestimme den Überlappungsgraphen U G der Segmente Si :
Knoten von U G
Kanten von U G:
=
ˆ
Segmente Si
Si und Sj werden genau dann durch eine Kante verbunden,
wenn Si und Sj überlappen.
• Verifiziere, ob U G bipartit ist. Ist dies der Fall, so ergeben sich aus den beiden bipartiten Knotenmengen von U G die Segmente, die innen bzw. aussen eingebettet werden müssen, und G ist damit
planar (vgl. Abbildung 4.1).
Unglücklicherweise ist die erzielbare Laufzeit bei diesem Vorgehen zwar polynomiell aber noch nicht,
wie erwünscht, linear. Schon alleine der Überlappungstest zur Erzeugung von U G hat, so der Kreis θ(n)
Segmente induziert, eine Laufzeit von θ(n2 ).
56
KAPITEL 4. PLANARE GRAPHEN
innere
Segmente
äussere
Segmente
UG
Abbildung 4.1: Bipartiter Überlappungsgraph
Folgende Verbesserungen sind daher angebracht:
(1) geschicktere Durchführung der Rekursion und
(2) Überlappungsgraph nicht explizit konstruieren!
Kernidee zur Umsetzung dieser Forderungen ist es, dafür zu sorgen, dass die Segmente in einer bestimmten (geschickten!) Reihenfolge erzeugt werden. Die im Anschluss aufgeführten Punkte sollen diesen
Ansatz zunächst zusammenhängend skizzieren, wobei einige ergänzende Laufzeitbetrachtungen eingeflochten sind. Abschliessend werden die einzelnen Phasen des geschilderten Planaritätstests dann konkret
an einem Beispielgraphen demonstriert werden.
Verbesserte Vorgehensweise
• Bestimme einen DFS-Baum für G und berechne dabei auch die Felder
dfs[v] =
low[v] =
low2[v] =
dfs-Nummer, wie bisher
min {dfs[v], dfs[w] | w durch ≥ 0 Baumkanten abwärts und genau
eine Rückwärtskante von v aus erreichbar}
min {dfs[v], dfs[w] | dfs[w] 6= low[v], w durch ≥ 0 Baumkanten
abwärts und genau eine Rückwärtskante von v aus erreichbar}
[D.h., low2[v] gibt den zweitkleinsten dfs-Wert an, der durch
≥ 0 Baumkanten abwärts und genau eine Rückwärtskante
von v aus erreichbar ist bzw. den dfs-Wert von v, falls ein
entsprechender Knoten nicht existiert.]
⇒ Laufzeit O(n) [Erzielbar mit einer geeignet modifizierten Tiefensuche. Diese hat wegen m ≤
3n − 6 und somit O(m) = O(n) in planaren Graphen Laufzeit O(n).]
• Richte Kanten:
– Baumkanten abwärts
– Rückwärtskanten aufwärts
• Gewichte die Kanten folgendermassen:

falls (v, w) Rückwärtskante
 2 · dfs[w]
2 · low[w]
falls (v, w) Baumkante und low2[w] ≥ dfs[v]
c(v, w) =

2 · low[w] + 1 falls (v, w) Baumkante und low2[w] < dfs[v]
• Erzeuge für alle v ∈ V eine Adjazenzliste der ausgehenden Kanten, aufsteigend sortiert nach deren
Gewicht c(.).
4.2. PLANARITÄTSTEST
57
⇒ Laufzeit O(n) [Werfe zunächst alle Kanten gemäss ihres Gewichtes in einen Bucket der Grösse
2n (→ O(n)), hole sie dann gemäss absteigendem Gewicht heraus und verteile sie auf die (anfangs
leeren) Adjazenzlisten (→ O(n)).]
• Markiere jede Kante als “neu” (d.h. unbetrachtet).
• Bestimme einen Kreis C:
v := hWurzel des DFS-Baumesi;
w := erster Nachbar von v in der Adjazenzliste von v;
markiere (v, w) als “benutzt”; C := {(v, w)};
while (w 6= hWurzel des DFS-Baumesi)
{
v := w;
w := Endknoten der ersten noch unbenutzten Kante in Adjazenzliste von v;
markiere (v, w) als “benutzt”; C := C + (v, w);
}
Gib Kreis C aus;
⇒ C besteht aus Baumkanten und genau einer Rückwärtskante (Beweis üA).
• Als nächstes werden die Segmente mit folgendem Algorithmus in “kleinen Teilen”, genauer als
Folge von Pfadstücken, ausgegeben. Die zu Grunde liegende Idee ist hier, dass sich hinter diesem
Ansatz die oben erwähnte Rekursion versteckt: Das erste ausgegebene Pfadstück des Segments läuft
von einem Knoten v des Kreises C in das Segment, durchläuft dort eine Folge von Baumkanten
und endet mit einer Rückwärtskante wiederum am Kreis C. Zusammen mit einem entsprechenden
Pfadstück des Kreises C erhalten wir auf diese Weise einen neuen Kreis – und testen rekursive, ob
sich alle seine Segmente planar einbetten lassen.
v := hKnoten mit grösster dfs-Nummer in Ci;
// dies ist Knoten v am Ende des vorigen Algorithmus
while (v 6= hWurzel des DFS-Baumesi)
{
while (es gibt “neue” Kanten in Adjazenzliste von v)
{
w := Endknoten der ersten noch unbenutzten Kante in Adjazenzliste von v;
markiere (v, w) als “benutzt”; P := {(v, w)};
while (dfs[v] < dfs[w])
{
// (v, w) ist eine Baumkante
v := w;
w := Endknoten der ersten noch unbenutzten Kante in Adjazenzliste von v;
markiere (v, w) als “benutzt”; P := P + (v, w);
}
Gib Pfad P aus;
}
v := Vorgänger von v;
}
58
KAPITEL 4. PLANARE GRAPHEN
Bemerkung 4.9 Sei S ein Segment bezüglich C und v die Verankerung von S mit grösster DFS-Nummer
(vgl. Abbildung 4.2). Dann treffen folgende Beobachtungen zu:
• S wird über eine Baumkante (v, w) von v aus betreten und vollständig ausgegeben, bevor der
Algorithmus S wieder verlässt.
• S besteht aus dem Subbaum Tw des DFS-Baumes und allen von dort ausgehenden Rückwärtskanten.
• Sei u der Endknoten des ersten ausgegebenen Pfades. Dann enthält S nur Verankerungen aus Puv ,
wobei Puv der Pfad des DFS-Baumes (bzw. des Kreises C) ist, der u und v verbindet.
u
C
v
w
Tw
Abbildung 4.2: Skizze zu Bemerkung 4.9
Lemma 4.10 Seien S1 , . . . , Sℓ die ersten ℓ Segmente, die vom Algorithmus ausgegeben werden und Pℓ =
(v, . . . , u) der erste Pfad von Sℓ , der ausgegeben wird. Weiter sei eine Einbettung von C + S1 + · · · + Sℓ−1
gegeben. Dann gilt:
Sℓ lässt sich genau dann nicht aussen (innen) hinzufügen, wenn es ein aussen (innen) eingebettetes
Segment Si mit i ∈ {1, . . . , ℓ − 1} gibt, das eine Verankerung zwischen u und v besitzt.
Beweis: Aufgrund der Arbeitsweise des Algorithmus zur Ausgabe der Pfade und den Beobachtungen
aus Bemerkung 4.9, können die Baumkanten der bereits vollständig ausgegebenen Segmente S1 , . . . , Sℓ−1
nur von den Knoten ausgehen, die in nachstehender Skizze gekennzeichnet sind:
u
C
v
}
Baumkanten der Segmente S1 , . . . , Sℓ−1 können nur hier beginnen
Sl
Angenommen, es gibt ein Segment Si mit i ∈ {1, . . . , ℓ − 1}, das eine Verankerung innerhalb des Pfades
Puv des DFS-Baumes (bzw. des Kreises C) besitzt. Dann sind folgende Fälle zu unterscheiden:
1. Fall: Die Baumkante, über die Si betreten wird, beginnt unterhalb von Knoten v
4.2. PLANARITÄTSTEST
59
u
v
⇒ Sℓ und Si überlappen.
Sℓ
Si
2. Fall: Die Baumkanten, über die Sℓ und Si betreten werden, beginnen im gleichen Knoten v und der
erste Pfad von Si , der ausgegeben wurde, endet oberhalb von Knoten u
u
v
Sℓ
⇒ Sℓ und Si überlappen.
Si
3. Fall: Die Baumkanten, über die Sℓ und Si betreten werden, beginnen im gleichen Knoten v und der
erste Pfad von Si , der ausgegeben wurde, endet ebenfalls in Knoten u (beachte, dass der Pfad nicht
unterhalb von u enden kann, ansonsten wäre Sℓ vor Si ausgegeben worden).
Damit muss auch Sℓ eine zusätzliche Rückwärtskante haben, die zwischen u und v endet, sonst
wäre Sℓ vor Si ausgegeben worden (aus diesem Grund brauchten wir das Feld low2[.] !), also folgt
60
KAPITEL 4. PLANARE GRAPHEN
u
⇒ Sℓ und Si überlappen.
v
Sℓ
Si
Damit ist ein eindeutiges Kriterium gezeigt, das angibt, wann sich eine gegebene Einbettung um ein
Segment erweitern lässt, ohne die Planarität zu verletzen.
Verbesserte Vorgehensweise (Fortsetzung)
• Der Algorithmus “erkennt”, wenn der erste Pfad eines Segmentes ausgegeben wird. Daraufhin
schickt er den derzeitigen Stand (die derzeitige Einbettung) auf einen Stack und macht rekursiv mit dem gerade ausgegebenen Pfad zusammen mit einem Teil des alten Kreises als neuen Kreis
weiter.
Es werden folgende Datenstrukturen verwendet:
Li
Lo
: Liste der Pfade, die innen eingebettet werden
: Liste der Pfade, die aussen eingebettet werden
Diese Listen sind aufgeteilt in Blöcke, für die die Einbettung eines Pfades bereits die Einbettung
aller übrigen vorschreibt. Durch diese Form der Organisation kann für jeweils eine ganze Gruppe von
Pfaden das ändern des Ortes der Einbettung von innen nach aussen und umgekehrt (“flippen”) durch
Pointer-Manipulationen in konstanter Zeit bewerkstelligt werden. Auf die genaue Ausführung der
zugehörigen Details wollen wir an dieser verzichten. Der interessierte Leser kann sie beispielsweise
in Mehlhorn, Data structures and algorithms 2: Graph algorithms and NP-Completeness, Springer
Verlag, 1984, nachlesen. Zusammenen mit den bereits angeführten Laufzeitbetrachtungen ergibt
sich dann:
4.2. PLANARITÄTSTEST
61
a
a
b
b
c
c
d
d
e
e
f
f
g
g
Abbildung 4.3: a) Beispielgraph
b) berechneter DFS-Baum
Satz 4.11 Der Planaritätstest lässt sich mit Laufzeit O(n) implementieren.
Damit ist das eingangs formulierte Ziel, einen Planaritätstest mit linearem Laufzeitverhalten anzugeben,
erreicht. Der verbleibende Teil dieses Abschnitts ist einem ausführlichen Beispiel gewidmet. Dazu soll
der 2-fach zusammenhängende Graph aus Abbildung 4.3a auf Planarität getestet und gegebenenfalls eine
mögliche Einbettung gefunden werden.
Zunächst werden mit Hilfe einer modifizierten Tiefensuche die Felder dfs[.], low[.] und low2[.] für den
gegebenen Graphen bestimmt. Nehmen wir für unser Beispiel an, dass
a
b
c
d
e
f
g
• −→ • −→ • −→ • −→ • −→ • −→ •
als DFS-Baum ermittelt wurde (vgl. Abbildung 4.3b), dann ergeben sich für oben genannte Felder die
Werte aus der folgenden Tabelle, wie man leicht überprüft:
Knoten
a
b
c
d
e
f
g
dfs[.]
1
2
3
4
5
6
7
low[.]
1
1
1
1
2
3
4
low2[.]
1
2
2
2
3
4
5
Entsprechend dem Resultat der Tiefensuche werden nun die Baumkanten abwärts, die Rückwärtskanten
aufwärts gerichtet, sowie die Kantengewichte bestimmt. Man erhält dann den in Abbildung 4.4 wiedergegebenen Graphen.
Nächster Schritt ist die Bestimmung eines Kreises C. Aufgrund der aufsteigend sortierten Adjazenzlisten
ergibt sich dieser zu
a
b
c
a
• −→ • −→ • −→ • .
Die drei beteiligten Kanten gelten jetzt als benutzt. Offenbar existiert bezüglich dieses Kreises lediglich
ein einziges Segment S, das über die Baumkante (c, d) betreten wird, wie Abbildung 4.4 (rechts) zeigt.
Da alle Verankerungen des Segmentes auf dem Pfad P = (a, b, c) liegen, ist nach Lemma 4.8 der gesamte
Graph also bereits dann planar, wenn P + S planar ist und es eine Einbettung gibt, in der P zum Rand
des äusseren Gebiets gehört.
62
KAPITEL 4. PLANARE GRAPHEN
a
2
b
Kreis C
2
c
Baumkante
4
6
5
e
6
8
7
f
(c,d)
4
3
d
Nur ein Segment:
2
2
8
10
9
g
Abbildung 4.4: gewichteter und gerichteter Graph (links) und initiales Segment (rechts)
In der vorliegenden algorithmischen Umsetzung erfolgt die Ermittlung von S durch die Ausgabe von
Pfaden. Der Algorithmus startet hierzu in Knoten c und wählt zunächst die Kante (c, d), weil dies die
einzige unbenutzte adjazente Kante zu c ist. Da es sich um eine Baumkante handelt, werden nun die von d
ausgehenden Kanten betrachtet und die Rückwärtskante (d, a) benutzt, denn diese weist das geringste
Gewicht auf. Damit ist mit
c
d
a
• −→ • −→ •
der erste Pfad von Segment S bestimmt.
Aus diesem Pfad und einem Teil des Kreises C erhält man nun für die Rekursion
a
b
c
d
a
• −→ • −→ • −→ • −→ •
als neuen Kreis C ′ . Also lautet die Aufgabe im Rekursionsschritt wie folgt:
a
b
c
1. Rekursion: Finde planare Einbettung von Abbildung 4.5 (links), so dass • −→ • −→ • zum Rand
des äusseren Gebietes gehört.
Der gegenüber der Ausgangssituation verkleinerte Graph besitzt zwei Segmente bezüglich des Kreises C ′ .
Zum einen ist dies die Rückwärtskante (d, b), zum anderen der Teilbaum, der über die Baumkante (d, e)
betreten wird, zusammen mit allen davon ausgehenden Rückwartskanten, siehe Abbildung 4.5 (rechts).
4.2. PLANARITÄTSTEST
63
a
b
1. Segment:
Rückwärtskante (d,b)
c
2. Segment:
d
Baumkante
(d,e)
e
f
g
Abbildung 4.5: Problemgraph für die 1. Rekursion (links) und aktuelle Segmente (rechts)
In analoger Weise ergeben sich die Teilprobleme für die restlichen Rekursionsschritte:
b
c
d
2. Rekursion: Finde planare Einbettung von Abbildung 4.6 (links), so dass • −→ • −→ • zum Rand
des äusseren Gebietes gehört.
c
d
e
3. Rekursion: Finde planare Einbettung von Abbildung 4.7 (links), so dass • −→ • −→ • zum Rand
des äusseren Gebietes gehört.
d
e
f
4. Rekursion: Finde planare Einbettung von Abbildung 4.8, so dass • −→ • −→ • zum Rand des
äusseren Gebietes gehört.
Wie in Abbildung 4.8 zu sehen ist, ist hier der Punkt erreicht, an dem kein weiterer rekursiver Aufruf
mehr erforderlich ist, da der soweit reduzierte Graph bereits der gewünschten Einbettung entspricht.
Daher wird nun der Rekursionsstack abgearbeitet. Sozusagen “rückwärts” werden jetzt die jeweils vor
dem Rekursionsschritt beiseite gelassenen Pfade zu der Einbettung hinzugefügt. In unserem Fall verläuft
dies erfolgreich, wie in Abbildung 4.9 dargestellt. Damit ist gezeigt, dass für den Beispielgraphen eine
planare Einbettung existiert.
64
KAPITEL 4. PLANARE GRAPHEN
b
c
1. Segment:
Rückwärtskante (e,c)
d
2. Segment:
e
Baumkante
(e,f)
f
g
Abbildung 4.6: Problemgraph für die 2. Rekursion (links) und aktuelle Segmente (rechts)
c
d
1. Segment:
Rückwärtskante (f,d)
e
f
2. Segment:
Baumkante
g
Abbildung 4.7: Problemgraph für die 3. Rekursion (links) und aktuelle Segmente (rechts)
d
e
f
g
Abbildung 4.8: Problemgraph für die 4. Rekursion
(f,g)
4.2. PLANARITÄTSTEST
65
d
c
e
b
d
f
g
c
e
f
d
g
a
e
b
f
g
c
d
e
f
g
Abbildung 4.9: Abschliessende Erzeugung der Einbettung
c
f
d
a
b
g
e
Abbildung 4.10: Alternative Einbettung für den Beispielgraphen
66
KAPITEL 4. PLANARE GRAPHEN
Es bietet sich hier an, nochmals die Bemerkung vom Beginn dieses Abschnitts aufzugreifen. Dort wurde
gesagt, dass wir uns damit begnügen wollen, eine mögliche Einbettung zu finden, nicht jedoch eine
besonders “schöne”. Entsprechend kann man auch für den vorgestellten Beispielgraphen Einbettungen
finden, die weitaus schlichter ausfallen, wie Abbildung 4.10 zeigt.
4.3
Zeichnen von planaren Graphen
Bei den Anwendungen planarer Graphen in der Informatik (z.B. der Visualisierung von Strukturen oder
Objekten) steht der algorithmische Aspekt im Vordergrund. In jedem einschlägigen Lehrbuch findet man
Verfahren, die in Zeit O(|V | + |E|) testen, ob ein Graph G = (V, E) planar ist, und falls ja, diesen auch
in die Ebene einbetten. Will man andererseits zusätzlich ästhetische Aspekte berücksichtigen, stösst man
auf ein Forschungsgebiet, in dem noch zahlreiche Probleme ungelöst sind. Ein Grund hierfür ist, dass es
schon schwierig ist, überhaupt zu beschreiben, was man gerne hätte. Zum Beispiel sind die folgenden vier
Abbildungen alles planare Einbettungen des Würfels Q3 .
Welches hiervon die richtige, schönste oder anschaulichste ist, hängt vom Kontext und nicht zuletzt auch
vom Geschmack des Betrachters ab. Ein naheliegendes solches Kriterium ist der Wunsch, den Graphen
so zu zeichnen, dass alle Kanten geradlinig sind. Hierfür wollen wir nun noch einen Algorithmus angeben.
Eine Fàry-Einbettung eines planaren Graphen G ist ein Einbettung von G in die Ebene, so daß alle
Kanten Geraden sind. Ferner wird natürlich verlangt, daß sich diese Kanten nicht kreuzen. Im folgenden
werden wir uns überlegen ob jeder planare Graph eine solche Einbettung hat, und wie man sie berechnen
kann. Wir nehmen an, daß wir bereits über eine, im Prinzip beliebige Einbettung von G verfügen. Ohne
Einschränkung erweiteren wir diese zu einer Triangulierung, d.h. jedes innere Gebiet ist ein Dreieck. Wenn
es gelingt, eine Fàry-Einbettung für Triangulierungen zu finden, sofindet man auch eine Fàry-Einbettung
für beliebige planare Graphen. Es genügt nämlich, die gegebene Einbettung um einige Kanten zu einer
Triangulierung zu erweitern, dann eine Fàry-Einbettung zu konstruieren und schließlich die künstlichen
Kanten wieder zu entfernen.
Eine Indizierung v1 , ..., vn der Knotenmenge heißt kanonische Ordnung, falls
1. Sei Gk−1 ⊆ G der, von {v1 , ..., vk−1 } induzierte Subgraph. Die Begrenzung des äußeren Gebiets
∂(Gk−1 ) ist ein Kreis, der die Kante {v1 , v2 } enthält.
2. Der Knoten vk liegt im äußeren Gebiete von Gk−1 . Ferner ist vk zu mindestens zwei aufeinanderfolgenden Knoten auf ∂(Gk−1 ) \ {v1 , v2 } verbunden.
Man kann beobachten, daß durch die kanonische Ordnung im Prinzip eine Reihenfolge vorgegeben ist,
in der man die Knoten iterativ hinzufügen kann. Intuitiv betrachtet kann man auf diese Weise schon
’fast’ eine schöne Einbettung finden. Im nächsten Abschnitt werden wir zeigen, daß dies - mit einigen
zustzlichen Verschiebungen - tatschlich möglich ist.
Lemma 4.12 Sei G = (V, E) ein eingebetteter Graph. Eine kanonische Ordnung von V kann man in
Zeit O(n2 ) berechnen.
Beweis: Zunächst wähle man sich mit {v1 , v2 } eine beliebe Kante der Begrenzung des äußeren Gebietes
der Einbettung von G. Sei Gn = G. Dann wählt man iterativ einen beliebigen Knoten vk ∈ ∂(Gk ) aus,
für den keine seiner adjazenten Kanten ein Sehne von ∂(Gk ) ist. Dann setzt man Gk−1 = V \ {vk , ..., vn }.
Es bleibt zu zeigen, daß es einen solchen Knoten gibt. Sei {u1 , ..., um } = ∂(Gk ) und sei {ui , uj }, j > i + 1
eine Sehne mit j − i minimal. Dann ist ui+1 nicht adjazent zu ui , ui+1 , ..., uj adjazent, denn sonst gäbe
es eine kürzere Sehne. Andererseits kann ui+1 wegen Planarität nicht adjazent zu den anderen Knoten
auf dem Kreis sein.
4.3. ZEICHNEN VON PLANAREN GRAPHEN
67
Der Algorithmus [Fraysseix, Pach und Pollack 1990] konstruiert, gegeben eine kanonische Ordnung
v1 , .., vn der Knoten, die Fàry-Einbettung auf ein 2n − 4 mal n − 2 Gitter iterativ. Nehmen wir an,
wir haben ein eine Fàry-Einbettung des Graphen Gk = G[{v1 , ..., vk }] konstruiert. Seien
v1 = w1 , w2 , . . . , wm = v2
die Knoten der Begrenzung des äußeren Gebietes von Gk . Dann sollen für alle k ≥ 3 folgende Invarianten
gelten:
1. pos(v1 ) = (0, 0) und pos(v2 ) = (2k − 4, 0).
2. x(w1 ) < x(w2 ) < . . . < x(wm ).
3. Eine Kante {wi , wi+1 } hat Steigung +1 oder −1.
vk
vk
wl
wr
wl
wr
Abbildung 4.11: Einfügen von vk .
Sei wl (wr ) der linkeste (rechteste) Nachbar von vk auf ∂(Gk−1 ). Will man die verlangten Invarianten
nicht verletzen, so gibt es einen naheliegenden für die Position von vk : Der Schnittpunkt der Graden mit
Steigung 1 durch wl mit der Geraden mit Steigung −1 durch wr . Leider kann es vorkommen, daß eine
oder beide Geraden nicht nur durch wl bzw. wr gehen, sondern auch noch andere Knoten auf ∂(Gk−1 ).
Um dies zu vermeiden genügt es, alle Punkte rechts von wl um 1 und alle Punkte rechts von wr und
wr selbst um 2 nach rechts zu verschieben (Abbildung 4.11). Man kann nun leicht überprüfen, daß zum
einen keine der Invarianten verletzt ist und zum anderen die Einbettung noch eine Fàry-Einbettung ist.
Wir erhalten also den folgenden einfachen Algorithmus:
Algorithm 4.13 Fàry-Einbettung
pos(v1 ) := (0, 0), pos(v2 ) := (2, 0) and pos(v3 ) := (1, 1).
M (v1 ) = {v1 , v2 , v3 }, M (v2 ) = {v2 , v3 } and M (v3 ) = {v3 }.
∂(G3 ) ← {v1 , v3 , v2 } =: {w1 , w2 , w3 }.
for k = 4 to n do
∂(Gk ) = {v1 = w1 , . . . , wm = v2 }.
Sei wl (wr ) der linkeste (rechteste) Nachbar von vk .
Schiebe alle Knoten in M (wl+1 ) um 1 nach rechts.
Schiebe alle Knoten in M (wr ) um 1 nach rechts.
pos(vk ) ist der Schnittpunkt der Geraden durch wl mit Steigung +1 und der Geraden durch wr mit
Steigung −1.
∂(Gk ) = {v
(1 = w1 , . . . , wl , vk , wr , . . . , wm = v2 }.
M (wi ) ∪ {vi } , i ≤ l
M (wi ) ←
.
M (wi )
,i ≥ r
M (vk ) = M (wl+1 ) ∪ {vk }.
end for
Die Laufzeit ist offensichtlich O(n2 ), da man in jeder Iteration jede Kante höchstens einmal betrachten
muß.
68
KAPITEL 4. PLANARE GRAPHEN
Die Laufzeit des Algorithmus läßt sich auf O(n log n) verbessern. Zum einen kann man mit einem geeigneten Markierungsverfahren (siehe Orginalliteratur) eine kanonische Ordnung in Zeit O(n) finden. Zum
anderen ist es nicht unbedingt nötig die x-Koordinaten nach jeder Iteration anzupassen. Statt dessen
speichern wir die Position implizit in einem Vektor πk , welchen wir in jeder Iteration in Zeit O(1) updaten. Angenommen, wir haben bereits πk−1 berechnet und seien i1 , ..., im die Indizes der Nachbar von vk .
Dann fügen wir k links von i2 und n + k links von im in πk−1 ein und erhalten so πk . Die Funktion
σ(j, k) = |{i : j < i, i steht vor j in πk }
zählt die Anzahl von Knoten, die (zeitlich) nach und (örtlich) vor vj eingefügt wurden. Das bedeutet,
daß der Knoten vj genau σ(j, n) mal nach rechts geschoben wird. Sei x0 (vj ) die x-Koordinate, an der vj
eingefügt wurde und sei xk (vj ), die (virtuelle) Position von vj nachdem vk eingefügt wurde. Dann gilt:
xk (vj ) = x0 (vj ) + σ(j, k),
x0 (vj ) und y(vj ) sind Funktionen von xj (vl ) und xj (vr ), wobei vl und vr den linkesten bzw. rechtesten
Nachbar von vj bezeichnen. Es bleibt zu zeigen, daß man σ(j, k) in Zeit O(log n) berechnen kann. Dies
erreicht man, indem man ein äquivalentes geometrisches Zählproblem formuliert. Dazu sei durch
S = {(j, i) : an Stelle i in πn steht j oder n + j}
eine Punktmenge gegeben. Um σ(j, k) zu berechnen, genügt es die Punkte aus S zu zählen, welche im
Rechteck
R(j, k) = {(x, y) : j + 1 ≤ x ≤ k, 1 ≤ y ≤ πn−1 (j)}
liegen, wobei πn−1 (j) die Position von j in πn ist. Dies ist mit geeigneten Algorithmen und Datenstrukturen
in Zeit O(log n) möglich.
Kapitel 5
Separatoren
Mit so genannten Divide-and-Conquer-Methoden lassen sich etliche Optimierungsprobleme einfach lösen.
Ein essentielles Hilfsmittel hierfür ist ein Verfahren, das eine gegebene Instanz eines Problems in zwei
mehr oder weniger unabhängige Teile zerlegt. Dabei ist zu beachten, dass es für die meisten Algorithmen, die nach dem Divide-and-Conquer Prinzip arbeiten, vorteilhaft ist, wenn die Aufteilung möglichst
gleichmässig ist. Ein bekanntes Beispiel ist der Sortieralgorithmus Quicksort. Hier lässt sich die Laufzeit
von O(n log n) nur erreichen, wenn die zu sortierende Sequenz in zwei etwa gleich grosse Teile aufgeteilt
wird.
Für Graphenprobleme stellen Separatoren einen geeigneten Teilungsbegriff dar. Allgemein ist ein Separator in einem Graphen eine Teilmenge der Knotenmenge des Graphen, nach deren Entfernung aus dem
Graphen dieser in mehrere Komponenten zerfällt.
Wir interessieren uns hier vor allem für eine Zerlegung in zwei etwa gleich grosse Komponenten:
C
* C "klein"
* A, B beide "gross"
* keine Kanten zwischen A und B
A
B
Definition 5.1 Sei 0 < α < 1 und f (n) eine Funktion und G = (V, E) ein Graph auf n Knoten. Eine
Menge C ⊆ V heisst (f (n), α)-Separator, falls
• |C| ≤ f (|V |)
• G[V \C] in Komponenten zerfällt, die alle Grösse ≤ α|V | haben.
Im Allgemeinen haben Graphen keine kleinen Separatoren. Um dies einzusehen betrachte man beispielsweise den Kn . Aus diesem Grund beschränken wir uns hier auf die Bestimmung von Separatoren in
“dünnen” Graphen. Genauer betrachten wir zunächst Bäume und danach planare Graphen.
Satz 5.2 Jeder Baum T besitzt einen (1, 21 )-Separator.
Beweis: Wir wählen v0 so, dass die grösste Komponente in T − v0 minimal ist. Wir wollen nun zeigen,
dass v0 der gesuchte Separator ist. Dazu nehmen wir das Gegenteil an, nämlich, dass es eine Komponente
X in T − v0 mit |X| > 12 n gibt. Wir betrachten dann den (eindeutig bestimmten) Nachbarn v1 von v0 in
X. Für die grösste Komponente in T − v1 gilt offenbar, dass sie
≤ max{|X| − 1, n − |X|} < |X|
ist. Daraus folgt sofort der Widerspruch.
69
70
KAPITEL 5. SEPARATOREN
X
v0
v1
Abbildung 5.1: Skizze zum Beweis von Satz 5.2
Anhand des Beweises lässt sich auch einfach ein Algorithmus mit linearer Laufzeit zum Bestimmen eines
(1, 12 )-Separator angeben. Wir überlassen die Details dem Leser als Übungsaufgabe. Auch die folgende
gewichtete Version von Satz 5.2 lässt sich nach dem gleichen Prinzip beweisen:
Satz 5.3 Sei T = (V, ET ) ein Baum und w : V → R≥0 eine Gewichtsfunktion. Dann kann man in
linearer Zeit einen Knoten v0 ∈ V finden, so dass für alle Komponenten T ′ von T \ v0 gilt:
X
v∈T ′
5.1
w(v) ≤
1X
w(v).
2
v∈T
Separatoren in planaren Graphen
Wir wollen uns jetzt mit Separatoren in planaren Graphen beschäftigen. Wir wissen bereits, dass ein
planarer Graph G einen Knoten mit Grad höchstens 5 besitzt. Also enthält jeder planare Graph auf
mindestens 5 Knoten eine trennende Menge der Grösse höchstens 5. Wir wollen aber den Graphen in
etwa gleich grosse Komponenten zerlegen. Dadurch wird die Aufgabe erheblich erschwert.
Im Folgenden wollen wir folgenden Satz beweisen:
√
Satz 5.4 Jeder planare Graph auf n Knoten besitzt einen ( 8n, 32 )-Separator und ein solcher lässt sich
in Zeit O(n) bestimmen.
Zum Beweis des Satzes sind noch einige Vorüberlegungen nötig. Zunächst benötigen wir noch eine Definition.
Definition 5.5 Der Durchmesser eines Graphen G = (V, E) ist der längste kürzeste Abstand zwischen
zwei Knoten, oder formal
diam(G) = maxu,v∈V (dist(u, v)),
wobei dist(x, y) die Länge eines kürzesten Pfades zwischen x und y angibt.
Desweiteren spielt folgendes Lemma eine zentrale Rolle beim Beweis obigen Satzes.
5.1. SEPARATOREN IN PLANAREN GRAPHEN
71
C(e)
e
Abbildung 5.2: Skizze zum Beweis von Lemma 5.6
Lemma 5.6 Sei G = (V, E) ein planarer Graph und T = (V, ET ) ein spannender Baum in G mit
Durchmesser s. Dann besitzt G einen (s + 1, 23 )-Separator und ein solcher lässt sich in O(n) bestimmen.
Beweis: Sei G in die Ebene eingebettet und o. E. trianguliert, das heisst, jedes Gebiet wird von genau
drei Kanten berandet. Dazu fügen wir einfach solange Kanten ein, bis der Graph trianguliert ist. Dies geht
in Zeit O(n) (Übungsaufgabe!). Offensichtlich ist ein Separator des neuen Graphen auch einer des alten.
Sei e ∈ E\ET eine Kante. ET ∪ e enthält dann genau einen Kreis C(e) mit höchstens s + 1 Kanten und
ebenso vielen Knoten. Mit int(C(e)) und ext(C(e)) bezeichnen wir die Anzahl der Knoten im Inneren
bzw. im Äusseren von C(e).
Wir suchen nun eine Kante e, so dass sowohl int(C(e)) als auch ext(C(e)) ≤ 23 n
Dazu beschreiben wir ein Verfahren, das ausgehend von einer Kante e ∈ E\ET mit int(C(e)) > 32 n eine
Kante e′ konstruiert, so dass
• Das Innere von C(e′ ) echt im Inneren von C(e) enthalten ist.
• ext(C(e′ )) ≤ 23 n.
Anzumerken bleibt noch, dass gelten kann int(C(e′ )) = int(C(e)). Dann enthält das Innere von C(e′ )
aber zumindest eine Fläche weniger als C(e).
Da int(C(e)) nur O(n) viele Flächen (Euler’sche Formel) enthält, terminiert dieser Algorithmus nach
linear vielen Schritten und liefert C(e) als gesuchten Separator.
Nun müssen wir uns noch der Bestimmung von e′ widmen.
Sei e = {x, y} und z der dritte Knoten des Gebiets im Inneren, das e enthält. Da int(C(e)) > 0 können
nicht sowohl {x, z} als auch {y, z} Kanten aus C sein. Bei Verwendung einer geeigneten Datenstruktur
kann man z in O(1) bestimmen. Dazu speichert man zu jedem Knoten die inzidenten Kanten in einer
zyklischen Liste in der Reihenfolge, wie sie in der Einbettung im Gegenuhrzeigersinn auftreten.
z
x
y
x
e’
y
y
x
x
y
e’
z
z
z
Skizze zu Fall 1
Skizze zu Fall 2a
Skizzen zu Fall 2b
Abbildung 5.3: Skizzen zu den folgenden Fällen
Ausgehend von obiger Abbildung unterscheiden wir die folgenden Fälle:
72
KAPITEL 5. SEPARATOREN
Fall1.
Genau eine der Kanten {x, z} oder {y, z} ist in C(e) enthalten. Sei {x, z} diese Kante. Wenn wir nun
e′ := {y, z} wählen, so umfasst der neue Kreis genau eine Fläche weniger. (Man beachte, dass {y, z} keine
Baumkante sein kann!)
Fall2.
Weder {x, z} noch {y, z} ist in C(e) enthalten. Daraus ergeben sich mehrere Möglichkeiten.
Wir betrachten zunächst den Fall, dass {x, z} in ET oder {y, z} in ET enthalten ist. Dann folgt, dass z
im Inneren von C(e) liegt, wobei o. E. {x, z} in ET liegt. Also können wir wieder e′ = {y, z} wählen.
Nun betrachten wir den Fall, dass sowohl {x, z} als auch {y, z} nicht in ET enthalten sind. Wir nehmen
nun an, dass int(C({x, z})) ≥ int(C({y, z})), dann gilt:
2
n
3
<
=
≤
und somit
int(C(e))
int(C({x, z})) + int(C({y, z})) + C({x, z}) ∩ C({y, z}) − 1
2int(C({x, z})) + C({x, z})
1
ext(C({x, z})) = n − int(C({x, z})) − C({x, z}) ≤ n − n −
{z
}
|
3
≥
1 2
2 [ 3 n−|C({x,z})|]
1 2
C({x, z}) ≤ n.
2
3
Somit ergibt sich, dass e′ = {x, z} die gewünschten Eigenschaften hat.
Jetzt müssen wir uns noch um den Aufwand kümmern, den wir betreiben müssen, um zu zeigen, dass
int(C({x, z})) ≥ int(C({y, z})) oder umgekehrt. Wir wollen dies in O(1) bestimmen. Dies gelingt uns
aber i.a. nicht, denn für eine spezielle Kante e kann der Aufwand sehr hoch sein. Im Folgenden sehen
wir aber, dass wir durch einen geschickte amortisierte Laufzeitanalyse trotzdem die gewünschte Schranke
einhalten können.
Für die Bestimmung von z benötigen wir für alle Fälle 2b zusammen nur O(n), da jede Baumkante
höchstens einmal durchlaufen wird.
Damit können wir uns jetzt der Bestimmung von e′ zuwenden. Hierbei genügt es entweder int(C) oder
ext(C) zu bestimmen (vgl. Fall 2b). Des weiteren lässt sich int(C(·)) berechnen, indem man die Baumkanten im Inneren zählt. Also verfolgen wir die Baumkanten abwechselnd im Inneren von int(C({x, z}))
und int(C({y, z})), solange bis wir ein Gebiet vollständig durchlaufen haben. Wichtig für die Laufzeit
ist, dass die in diesem Gebiet liegenden Baumkanten später nie mehr behandelt werden. Wie wir leicht
sehen können ist der Aufwand für das andere Gebiet höchstens genauso gross.
Also ergibt sich auch hier ein Aufwand für alle Fälle von Fall 2b zusammen von O(n).
Nach diesen Vorüberlegungen können wir zum Beweis von Satz 5.4 zurückkehren.
Beweis: Ohne Beschränkung der Allgemeinheit sei G zusammenhängend. Wähle v0 ∈ V beliebig als
Wurzel und teile die Knoten von G in Mengen Li = {v ∈ V |dist(v0 , v) = i}. Weiter sei l = max{i|Li 6= 0}
der maximale Abstand eines Knotens aus G zu v0 .
√
Falls nun 2l + 1 ≤ 8n, dann garantiert Lemma 3.15 den gesuchten Separator.
p
S
Anderenfalls setzen wir s = ⌈ n2 ⌉ und Sj := {Li |i ≡ j mod s}. Wir wählen nun einen Index j0 so, dass
Sj0 die kleinste Menge Sj ist. Für diese gilt dann sicherlich |Sj0 | ≤ ⌊ ns ⌋. Wenn wir nun die Komponenten
von G\Sj0 betrachten, können wir zwei Fälle unterscheiden.
1.Fall:
Falls alle Komponenten ≤ 23 n sind, dann sind wir wegen ⌊ ns ⌋ ≤
2.Fall:
√ √
2 n fertig.
5.1. SEPARATOREN IN PLANAREN GRAPHEN
73
vo
L1
L2
Li
Abbildung 5.4: Skizze zum Beweis
Es gibt eine (und nur eine!) Komponente > 32 n. Wir kontrahieren die Knoten von Sj0 in dem Level
oberhalb dieser Komponente. Dadurch entsteht ein BFS-Baum mit Tiefe ≤ s − 1 und Durchmesser
≤ 2(s − 1). Aus dem vorherigen Lemma folgt daher, dass diese Komponente einen Separator der Grösse
≤ 2s − 1 hat.
√
Damit hat G einen Separator der Grösse ≤ ⌊ ns ⌋ + 2s − 1 ≤ 8n. Um die letzte Ungleichung einzusehen,
p
schreibe man s als s = n/2 + δ für ein 0 ≤ δ < 1 und überzeuge sich davon, dass
p
√
n
n
+ 2s − 1 = p
+ 2( n/2 + δ) − 1 ≤ 8n
s
n/2 + δ
für alle 0 ≤ δ < 1.
Da wir die Mengen Li aus dem in linearer Zeit berechenbaren BFS-Baum ablesen können und zur Berechnung des Separators gemäss Lemmas 5.6 ebenfalls nur Aufwand O(n) benötigen, lässt sich insgesamt
der gesuchte Separator ebenfalls in linearer Zeit bestimmen.
√
Bemerkung 5.7 Man kann sogar zeigen, dass es in jedem planaren Graph einen ( 8n, 23 )-Separator
gibt, für den die Knoten des Separators in G einen Kreis bilden.
Abschliessend wollen wir noch folgende Verschärfung von Satz 5.4 zeigen:
Satz 5.8 Sei G = (V, E) ein planarer Graphqauf n Knoten und ǫ = ǫ(n) eine beliebige Funktion, so dass
1
ǫ ≤ 1 und ǫn ≥ 24. Dann enthält G einen ( 24n
ǫ , ǫ)-Separator und ein solcher kann in Zeit O(n log ǫ )
bestimmt werden.
p
Beweis: Wir setzen s = ⌈ ǫn
6 ⌉ und wenden folgendes Verfahren an, das eine wiederholte Anwendung
des vorigen Algorithmus darstellt.
1.Schritt
Wir verwenden wie im Beweis von Satz 5.4 eine Breitensuche um von einem beliebigen Knoten v0 ∈ V
aus eine Menge Sj0 zu bestimmen, so dass |Sj0 | ≤ ⌊ ns ⌋ und alle Komponenten von G[V \Sj0 ] in planare
Graphen mit Durchmesser ≤ 2s − 2 eingebettet werden können. Dann setzten wir C := Sj0 .
2.Schritt
Solange es Komponenten H in G[V \C] der Grösse ≥ ǫn gibt, bestimmen wir mit Hilfe von Lemma 5.6
wie im Beweis von Satz 5.4 eine Menge C ′ der Grösse ≤ 2s − 1, so dass H nach Entfernen von C ′ in
Komponenten der Grösse ≤ 32 |V (H)| zerfällt. Dann setzen wir C := C ∪ C ′
Nun bleibt noch zu zeigen, dass C höchstens die angegebene Grösse hat und dass die geforderte Laufzeit
eingehalten wird. Dazu partitionieren wir alle Komponenten, die im Laufe des Algorithmus auftreten wie
folgt.
N0 := Menge aller Komponenten ≤ ǫn
74
KAPITEL 5. SEPARATOREN
Ni := Menge aller Komponenten >
3 i−1
2
ǫn und ≤
3 i
2
ǫn für 1 ≤ i ≤ log 32 1ǫ .
Falls im Laufe des Algorithmus eine Komponente H aus Ni in kleinere zerfällt, so haben diese höchstens
2
3 |V (H)| Knoten und gehören daher nicht zu Ni . Also sind die Komponenten in Ni paarweise knotendisjunkt, woraus folgt, dass die gesamte Laufzeit, die wir benötigen um Komponenten in Ni zu separieren
linear in n ist. Daher beträgt die Gesamtlaufzeit O(n · log 1ǫ ).
Nun müssen wir noch die Grösse von C abschätzen. Da die Komponenten in Ni knotendisjunkt sind, gilt
i−1
3
|Ni |
ǫn ≤ n
2
Also gibt es höchstens ⌊
2 i−1 1
3
ǫ⌋
Komponenten in Ni . Also ist
1
r
ǫ
∞ i−1
2
j 2 i−1 1 k
X
X
2
n 3
n 1
24n
|C| ≤
= + (2s − 1) ≤
,
+
(2s − 1) ≤ + (2s − 1)
s
3
ǫ
s
ǫ
3
s
ǫ
ǫ
i=1
i=1
jnk
log 3
wobei man die Gültigkeit der letzten Ungleichung ähnlich wie im Beweis von Satz 5.4 nachrechnet (hier
benötigt man die Voraussetzung ǫn ≥ 24).
5.2
Anwendungen des Separatorensatzes
Separatoren finden vor allem bei der Entwicklung von Divide-and-Conquer Verfahren ihre Anwendung.
Gemäss Definition zerlegt ein Separator den Graphen in zwei Teile die beide um mindestens einen Faktor, beispeilsweise 2/3, kleiner sind. Wendet man den Separatorsatz daher rekursiv auf die jeweils neu
entstehenden Komponenten an, so terminiert dieses Verfahren nach spätestens O(log n) Runden. Problematischer ist im Allgemeinen der Conquer“ Schritt, bei dem die Lösungen der einzelnen Teile wieder
”
zusammen gesetzt werden müssen.
√ Dieser ist meist exponentiell in der Grösse des Separators. Für die im
vorigen Abschnitt vorgestellten n-Separatoren wird man daher auf diese Weise meist keine polynomiellen Algorithmen erhalten. Andererseits erhält man damit quasi per Konstruktion sofort subexponentielle
Algorithmen, was für NP-vollständige Probleme durchaus nicht offensichtlich ist.
In diesem Abschnitt wollen wir die obigen Bemerkungen an einem Beispiel genauer ausführen.
(Planar) Independent Set Problem
Gegeben: Ein (planarer) Graph G = (A ⊎ B, E).
Gesucht: Eine kardinalitätsmaximale unabhängige Menge in G, d.h., eine möglichst grosse Menge
X ⊆ V , so dass der von X induzierte Subgraph G[X] keine Kante enthält.
Für dieses Problem ist bekannt, dass es NP-schwer ist.
Satz 5.9 Sowohl Independet Set als auch Planar Independet Set sind NP-schwer.
Es gilt aber:
Satz 5.10 In planaren Graphen kann man in Laufzeit 2O(
stimmen.
√
n)
einen maximale unabhängige Menge be-
Für den Beweis dieses Satzes betrachten wir den folgenden Algorithmus, der die zu Beginn dieses Abschnittes skizzierten Ideen formalisiert:
5.2. ANWENDUNGEN DES SEPARATORENSATZES
75
Algorithmus PlanarIndSet(G)
Eingabe: planarer Graph G = (V, E)
Ausgabe: eine maximale unabhängige Menge I
if |V (G)| ≤ 1 then
I := V (G)
else
I := ∅;
p
Berechne einen ( 8|V (G)|, 23 )-Separator C von G, so dass G[V \ C] in nichtadjazente Mengen
A und B der Grösse höchstens 32 |V (G)| zerfällt.
for all S ⊆ C, S unabhängig do
IA := PlanarIndSet(G[A \ Γ(S)]);
IB := PlanarIndSet(G[B \ Γ(S)]);
if |S| + |IA | + |IB | > |I| then I := S ∪ IA ∪ IB ;
PlanarIndSet := I;
Beweis: Die Korrektheit von Algorithmus PlanarIndSet(G) folgt sofort aus folgender Überlegung.
Wir betrachten eine (beliebige) maximale unabhängige Menge X0 und einen Separator C, der den Graphen in zwei Komponenten A und B zerlegt. Dann ist A ∩ X0 eine maximale unabhängige Menge in
A \ Γ(C ∩ X0 ), denn jede grössere unabhängige Menge in A \ Γ(C ∩ X0 ) würde zusammen mit (C ∪ B) ∩ X0
eine grössere (als X0 ) unabhängige Menge für G ergeben, im Widerspruch zur Wahl von X0 . Da der Algorithmus alle Teilmengen von C betrachtet, betrachtet er insbesondere auch die Menge C ∩ X0 und die
Korrektheit des Algorithmus für G folgt daher aus der Korrektheit des Algorithmus für G[A \ Γ(C ∩ X0 )]
und G[A \ Γ(C ∩ X) ]. Da die beiden letzteren Graphen weniger Knoten als G haben folgt die Korrektheit
von PlanarIndSet(G) somit durch Induktion über |V (G)|.
Betrachten wir nun die Laufzeit von PlanarIndSet(G). Dazu bezeichnen wir mit t(n) die Worst-CaseLaufzeit für einen Graphen auf n Knoten, wobei wir ohne Einschränkung annehmen, dass t(n) monoton
steigend ist. Nach Konstruktion des Algorithmus gilt offenbar:
t(n) ≤ O(n) + 2
√
8n
2
· O(n) · 2t( n).
3
√
(Der erste O(n)-Term entspricht der Zeit für die Bestimmung des Separators, der Faktor 2 8n beschränkt
die Anzahl der Teilmengen von C, der zweite O(n)-Term schätzt die Zeit für die Berechnung der beiden
Graphen G[A \ Γ(S)] und G[B \ Γ(S)] ab.)
Schätzt man die O(·)-Terme durch geeignete Konstanten c1 und c2 ab, so erhält man
t(n) ≤ c1 n + 2c2 n · 2
Wählt man n0 und c3 ≥ 1 gross genug, so dass
(c1 + 2c2 )n ≤ 2(4−
√
8n
√ √
8) n
2
· t( n).
3
für alle n ≥ n0
und
t(n) ≤ c3
für alle n < n0 ,
so kann per Induktion über n leicht nachrechnen (Übungsaufgabe!), dass
t(n) ≤ c3 2 1−
4
√
2/3
√
n
.
76
KAPITEL 5. SEPARATOREN
Kapitel 6
Beschränkte Baumweite
Welche Eigenschaften charakterisieren einen Baum. Nun zunächst einmal seine Kreisfreiheit. Hier wollen
wir jedoch drei andere Eigenschaften in den Vordergrund stellen:
(1) In jedem Baum gibt es einen (1, 12 )-Separator (vgl. Lemma 5.2).
(2) Für viele Optimierungsprobleme kann man auf Bäumen einen dynamischen Programmierungsansatz
wählen und erhält einen Algorithmus mit linearer Laufzeit.
(3) Es gibt eine Reihenfolge v1 , . . . , vn der Knoten des Baumes, so dass für alle 2 ≤ i ≤ n gilt: In dem
von den Knoten v1 , . . . , vi induzierten Graphen G[{v1 , . . . , vi }] hat der Knoten vi Grad genau 1.
Betrachten wir diese Eigenschaften etwas genauer:
Eigenschaft (3) ist eine unmittelbare Folgerung aus der Tatsache, dass jeder Baum ein Blatt enthält,
dessen Entfernung wiederum zu einem Baum führt.
Eigenschaften (1) und (2) zeigen, dass Optimierungsprobleme auf Bäumen vielfach effizient lösbar sind,
wobei die Eigenschaft (1) eine top-down Strategie anwendet, während der Eigenschaft (2) eine bottom-up
Strategie zu Grunde liegt. Wir illustrieren dies für das Problem eine maximale unabhängige Menge zu
finden.
Eigenschaft (1) erlaubt einen rekursiven Ansatz:
Algorithmus TreeIndSet(T )
Eingabe: Baum T = (V, E)
Ausgabe: eine (kardinalitäts-)maximale unabhängige Menge I
if |V (T )| ≤ 1 then
I := V (T )
else
1
Berechne einen
S(1, 2 )-Separator x von T . Seien T1 , . . . , Tℓ die Teilbäume in T \ x.
Iin := {x} ∪ 1≤i≤ℓ TreeIndSet(Ti \ Γ(x));
S
Iout := 1≤i≤ℓ TreeIndSet(Ti );
if |Iin | ≥ |Iout | then return (Iin ) else return (Iout ).
77
78
KAPITEL 6. BESCHRÄNKTE BAUMWEITE
Die Korrektheit ist offensichtlich, als Laufzeit erhält man O(n2 ). Um letzteres einzusehen stelle man
sich den Berechnungsbaum vor. Jeder Knoten des Graphen kommt in höchstens einem der Teilbäume
T1 , . . . , Tℓ vor. Für jeden der Bäume Ti werden zwei rekursive Aufrufe gestartet: TreeIndSet(Ti )
und TreeIndSet(Ti \ Γ(x)). Auf der ersten Rekursionsebene kommt daher jeder Knoten des Graphen
höchstens zweimal vor, auf der zwieten Rekursionsebene höchstens viermal und analog auf der k-ten
Rekursionsebene höchstens 2k mal. Für die Bestimmung der Separatoren benötigt man daher in der kten Ebene Laufzeit c2k n, wobei c eine geeignet gewählte Konstante ist. Da sich die Grösse des grössten
Baumes in jeder Ebene halbiert, gibt es insgesamt höchstens log2 n viele Ebenen. Die Laufzeit lässt sich
daher wie folgt abschätzen:
log2 n
X
k=1
log2 n
k
c2 n = O(n ·
X
k=1
) = O(n2 ).
Den dynamische Programmierungsansatz aus Eigenschaft (2) kann man für dieses Problem wie folgt
umsetzen:
Wir wählen einen beliebigen Knoten r ∈ V (T ) als Wurzel des Baumes. Dies definiert für jeden Knoten
x ∈ V (T ) einen eindeutigen Unterbaum Tx , der alle Knoten unterhalb von x in dem im Knoten r
aufgehängten“ Baum enthält. Weiter bezeichne Γsuc (x) die Menge der Nachfolger von x im gewurzelten
”
Baum T . Wir definieren nun zwei Funktionen win , wout : V → N0 wie folgt:
:= max{|S| | S ⊆ V (Tx ), S unabhängig, x ∈ S},
:= max{|S| | S ⊆ V (Tx ), S unabhängig, x 6∈ S}.
win (x)
wout (x)
Offensichtlich ist max{win (r), wout } die Kardinalität einer maximalen unabhängigen Menge in T .1
Die Werte w(x) kann man andererseits leicht bottom-up mässig berechnen, denn es gilt:
win (x)
wout (x)
=
=
(
(
1,
P
1 + y∈Γsuc (x) wout (y),
0,
P
falls x ein Blatt ist
sonst
falls x ein Blatt ist
y∈Γsuc (x) max{win (y), wout (y)}, sonst.
Ziel dieses Kapitels ist es, ein Konzept einzuführen, das den Begriff eines Baumes verallgemeinert. Genauer, werden wir zu jedem k ∈ N eine Klasse von Graphen definieren, die sozusagen k-nahe an Bäumen
sind.
1 Wie bei der dynamischen Programmierung üblich, ist es (notatiell) einfacher, nur die Kardinalität einer optimalen
Lösung zu berechnen. Für die Berechnung der optimalen Lösung muss man sich zusätzlich zu den Werten win (x) und
wout (x) merken, für welches S jeweils das Maximum angenommen wurde.
6.1. BAUMZERLEGUNG UND BAUMWEITE
79
Die entsprechenden Definitionen, man spricht hier von der so genannten Baumweite eines Graphen führen
wir in Abschnitt 6.1 ein. In Abschnitt 6.2 zeigen wir, dass für jedes konstante k ∈ N die Klasse der Graphen
mit Baumweite ≤ k ganz ähnliche Eigenschaften haben wie Bäume. Genauer zeigen wir, dass für diese
Klassen ganz ähnliche Eigenschaften wie die oben beschriebenen Eigenschaften (1) und (2) gelten. In
Abschnitt 6.3 zeigen wir dann, dass wir auch eine Verallgemeinerung der Eigenschaft (3) hätten verwenden
können, um genau die gleichen Klassen der k-baumnahen“ Graphen zu definieren.
”
6.1
Baumzerlegung und Baumweite
Definition 6.1 Ein Tupel (T, W) heisst Baumzerlegung eines Graphen G = (V, E), falls gilt:
• T ist ein Baum,
• W = (Wx )x∈V (T ) mit Wx ⊆ V ,
S
• x∈V (T ) Wx = V ,
• für alle e = {u, v} ∈ E gibt es ein x ∈ V (T ) mit u, v ∈ Wx ,
• für alle v ∈ V gilt: T [{x ∈ V (T ) | v ∈ Wx }] ist zusammenhängend.
Anschaulich kann man sich die fünf Bedingungen aus der Definition einer Baumzerlegung wie folgt klar
machen:
• T ist ein Baum, daher der Name Baumzerlegung,
• jedem Knoten x des Baumes ist eine Teilmenge Wx der Knotenmenge V des Graphen G zugeordnet,
• jeder Knoten des Graphen G ist in mindestens einer Knotenmenge des Baumes enthalten [Knotenüberdeckungsbedingung],
• für jede Kante des Graphen G gibt es (mindestens) einen Knoten x des Baumes, dessen Knotenmenge Wx beide Endknoten der Kante enthält [Kantenüberdeckungsbedingung],
• für jeden Knoten v des Graphen induzieren die Knoten des Baumes, deren Knotenmenge den Knoten
v enthält, einen zusammenhängenden Teilbaum [Zusammenhangsbedingung].
a
a
c
c
b
b
d
e
b
b
d
d
e
d
e
e
f
f
Abbildung 6.1: Beispiel einer Baumzerlegung
Abbildung 6.1 zeigt ein Beispiel einer Baumzerlegung (rechts) eines Graphen G (links).
80
KAPITEL 6. BESCHRÄNKTE BAUMWEITE
Man überlegt sich leicht, dass es zu jeden Graphen G = (V, E) eine Baumzerlegung gibt. Man könnte
beispielsweise einfach einen Baum auf nur einem Knoten t wählen und diesem als Knotenmenge Wt die
gesamte Knotenmenge V zuweisen. Dann sind alle Bedingungen von Definition 6.1 erfüllt – aber eigentlich
hat man nichts wirklich spannendes oder aussagekräftiges konstruiert. Man ist daher an Baumzerlegungen
interessiert, bei denen die Mengen Wx möglichst klein sind. Entsprechend definiert man:
Definition 6.2 Die Baumweite einer Baumzerlegung (T, W) entspricht der Kardinalität der grössten
Knotenmenge minus Eins. Formal:
tw(T, W) := max (|Wx | − 1).
x∈V (T )
Die Baumweite eines Graphen G = (W, E) entspricht der kleinsten Baumweite einer Baumzerlegung des
Graphen G. Formal:
tw(G) :=
min
tw(T, W).
(T,W) Baumzerlegung von G
Wieso die minus Eins in der Definition der Baumweite? Ganz einfach, man möchte, dass (normale) Bäume
Baumweite 1 haben. Und da es für jede Kante des Graphen eine Knotenmenge des Baumes geben muss,
die beide Endknoten enthält, muss es in jeder Baumzerlegung eines nichtleeren Graphen Knotenmengen
der Kardinalität ≥ 2 geben. In der Tat kann man für Bäume aber immer eine Baumzerlegung finden,
in der jede Knotenmenge Wx genau zwei Knoten enthält. Abbildung 6.2 zeigt an einem Beispiel wie das
geht: Man wählt für jede Kante des Baumes G = (V, E) einen Knoten der Baumzerlegung, der genau die
beiden Knoten der Kante enthält. Bäume haben also Baumweite 1.
Wir schliessen diesen Abschnitt mit der Beobachtung, dass man für einen Graphen mit Baumweite k
immer eine Baumzerlegung finden kann, die nicht zu viele Knoten enthält. Zunächst überlegen wir uns
hierfür, dass wir ohne Einschränkung davon ausgehen können, dass eine Baumzerlegung nur Kanten {x, y}
enthält mit Wx 6⊆ Wy , denn ansonsten könnte man diese Kante durch einen einzigen Knoten ersetzen
(die beiden Knoten also zu einem Knoten kontrahieren), ohne die Eigenschaften der Baumzerlegung zu
zerstören.
Lemma 6.3 Ist G ein Graph und (T, W) eine Baumzerlegung mit Baumweite k mit Wx 6⊆ Wy für alle
Kanten {x, y} des Baumes, so gilt |V (T )| ≤ |V (G)|.
Beweis: Wir wählen einen beliebigen Knoten r ∈ V (T ) als Wurzel und ordnen jedem Knoten x ∈
V (T ) \ r einen Knoten v ∈ V (G) wie folgt zu: v ∈ Wx \ Wparent(x) , wobei parent(x) den (eindeutig bestimmten) Vorgänger von x in dem an r gewurzelten ( aufgehängten“) Baum T bezeichne. Den Knoten
”
v gibt es, wegen der Annahme Wx 6⊆ Wy für alle Kanten {x, y} in E(T ). Aus der Zusammenhangsbedingung folgt weiter, dass alle gewählten Knoten paarweise verschieden sein müssen, und dass keine
der ausgewählten Knoten in Wr vorkommen kann. Es gilt also |V (T )| − 1 ≤ |V (G) \ Wr |, woraus die
Behauptung unmittelbar folgt.
6.2
Algorithmische Konsequenzen
Lemma 6.4 Ist G ein Graph und (T, W) eine Baumzerlegung für G, so gilt:
a) Für jede Kante {x, y} in T ist Wx ∩ Wy ein Separator in G.
b) Für jeden Knoten x in T ist Wx ein Separator in G.
Beweis: a) Die Kante {x, y} zerlegt den Baum T in zwei disjunkte Teilbäume Tx und Ty , wobei x ∈ Tx
und y ∈ Ty . Setzt man
[
[
Vx :=
Wz
und
Vy :=
Wz ,
z∈Tx
z∈Ty
so folgt aus der Definition der Baumzerlegung sofort, dass Vx ∩ Vy = Wx ∩ Wy und dass es zu Knoten
v ∈ Vx \ (Wx ∩ Wy ) und w ∈ Vy \ (Wx ∩ Wy ) keinen Knoten z ∈ T geben kann mit {v, w} ⊆ Wz . (Denn
z müsste zu Tx oder Ty gehören und dann müsste wegen der Zusammenhangsbedingung der Definition
der Baumzerlegung die Menge Wx ∩ Wy auch einen der beiden Knoten v und w enthalten.) Insbesondere
kann G somit keine Kante zwischen Vx \ (Wx ∩ Wy ) und Vy \ (Wx ∩ Wy ) enthalten.
6.2. ALGORITHMISCHE KONSEQUENZEN
81
a
c
b
b
a
c
b
b
d
d
d
e
e
Abbildung 6.2: Bäume haben Baumweite 1
b) Der Beweis folgt analog zu dem Beweis in a), in dem man alle Teilbäume T ′ in T \ x betrachtet.
Satz 6.5 Ist (T, W) eine Baumzerlegung eines Graphen G mit Baumweite k, so kann man in Zeit
O(|V (T )|) einen (k + 1, 21 )-Separator in G bestimmen.
Beweis: Wir wählen einen beliebigen Knoten r ∈ T als Wurzel von T und definieren eine Gewichtsfunktion w : V (T ) → N0 wie folgt. Für r setzen wir w(r) := |Wr |. Für alle übrigen Knoten x ∈ T \ r
bezeichne parent(x) den (eindeutig bestimmten!) Vorgänger von x in dem am Knoten r aufgehängten“
”
Baum T . Wir setzen dann w(x) := |Wx \ Wparent(x) |. Beachte, dass auf Grund der Zusammenhangsbedingung in der nachPDefinition der Baumzerlegung jeder Knoten v ∈ V insgesamt genau einmal gezählt
wird. Es gilt daher x∈T w(x) = |V |.
Nach Satz 5.3 kann man in linearer Zeit einen Knoten x0 ∈ T finden, so dass das Gesamtgewicht
P
1
′
überz∈T ′ w(z) eines jeden Teilbaumes T in T \ x0 höchstens 2 |V | ist.
P
S Da man sich leicht davon
′
zeugt, dass für jeden Teilbaum T in T \ x0 die Anzahl Knoten in ( z∈T ′ Wz ) \ Wx0 durch z∈T ′ w(z)
beschränkt ist, folgt hieraus zusammen mit Lemma 6.4 sofort die Behauptung.
Geht man ähnlich wie in Algorithmus PlanarIndSet(G) aus Abschnitt 5.2 vor, so kann man aus Satz 6.5
folgern, dass man in Graphen mit Baumweite höchstens k eine maximale stabile Menge in Zeit O(nk+1 )
berechnen kann, so eine entsprechende Baumzerlegung bekannt ist. Zusammen mit den Resultaten aus
Abschnitt 6.4 (in dem wir zeigen werden, dass man eine Baumzerlegung effizient berechnen kann) folgt
daher, dass für jedes konstante k ∈ N in Graphen mit Baumweite höchstens k eine maximale stabile
Menge in polynomieller Zeit berechnet werden kann.
Verwendet man statt Satz 6.5 und Divide-and-Conquer eine dynamische Programmierung lässt sich Laufzeit dramatisch verbessern: statt O(nk+1 ) benötigt man damit nur O(n), wobei allerdings die im Gross-Oh
verborgene Konstante exponentiell von k abhängt.
Um dies einzusehen, gehen wir ähnlich vor, wie in dem in der Einleitung des Kapitels vorgestellten
Algorithmus für Bäume.
82
KAPITEL 6. BESCHRÄNKTE BAUMWEITE
Gegeben sei also ein Graph G und eine Baumzerlegung (T, W). Wir wählen einen Knoten r ∈ V (T ) als
Wurzel beliebig aus Dies definiert für jeden Knoten x ∈ V (T ) einen eindeutigen Unterbaum Tx , der alle
Knoten unterhalb von x in dem im Knoten r aufgehängten“ Baum enthält. Weiter bezeichne Γsuc (x)
”
die Menge der Nachfolger von x im gewurzelten Baum T . Für jeden Knoten x ∈ V (T ) definieren wir für
alle Mengen S ⊆ Wx :
[
Wy , S̃ unabhängig, S ⊆ S̃},
w(x, S) := max{|S̃| | S̃ ⊆
y∈V (Tx )
Offensichtlich ist maxS⊆Wr w(r, S) die Kardinalität einer maximalen unabhängigen Menge in G und man
kann die Werte w(x, S) rekursiv bottom-up mässig berechnen, denn es gilt:


0,
falls S nicht unabhängig



|S|,
falls x ein Blatt ist und S unabhängig
X
w(x; S)
=

max
(w(y,
S
)
−
|S
∩
S
|),
sonst
|S|
+
y
y

Sy ⊆Wy



y∈Γsuc (x) S∩Wy ⊆Sy
Sy ∩Wx ⊂Sy
Der Aufwand für einen Knoten x ist 2k (für die Anzahl Teilmengen S ⊆ Wx ) mal deg(x) · 2k . Der
Gesamtaufwand lässt sich somit durch O(4k · |E(T )|) = O(4k · |V (T )|) = O(4k · |V (G)|) abschätzen
(wobei die letzte Gleichheit aus Lemma 6.3 folgt). Wir haben also gezeigt:
Satz 6.6 In Graphen G, für die eine Baumzerlegung (T, W) mit Baumweite k bekannt ist, lässt sich eine
(kardinalitäts-)maximale unabhängige Menge mit der dynamischen Programmierung in Zeit O(4k ·|V (G)|)
berechnen.
Ähnliche Ansätze funktionieren auch für viele andere NP-vollständige Probleme.
6.3
Partielle k-Bäume
Eigenschaft (3) der Einleitung dieses Kapitels können wir verwenden, um eine Verallgemeinerung der
Klasse der Bäume der erzielen.
Definition 6.7 Ein Graph G = (V, E) ist ein k-Baum, falls es eine Reihenfolge v1 , . . . , vn der Knoten
von G gibt, so dass gilt:
(i) n ≥ k + 1 und G[{v1 , . . . , vk+1 }] ist eine (k+1)-Clique und
(ii) für alle k + 2 ≤ i ≤ n gilt:
In dem von den Knoten v1 , . . . , vi induzierten Subgraphen G[{v1 , . . . , vi }] bildet die Nachbarschaft
von vi eine k-Clique.
Ein Graph G = (V, E) ist ein partieller k-Baum, falls es einen k-Baum G0 = (V, E0 ) gibt, so dass G
Subgraph von G0 ist.
Alternativ kann man sich die Definition eines k-Baumes wie folgt veranschaulichen. Einen k-Baum erhält
man, in dem man mit einer (k+1)-Clique beginnt und dann sukzessive Knoten so hinzufügt, dass man
sie vollständig mit einer k-Clique des bereits konstruierten Graphen verbindet.
1-Bäume sind genau die Bäume im klassischen Sinne. Intuitiv sind daher k-Bäume um so baum-ähn”
licher“, je kleiner k ist. Dies werden wir später noch genauer formalisieren. Zunächst jedoch noch eine
Anmerkung zur Definition. Die Forderung, dass Γ(vi ) in G[{v1 , . . . , vi }] eine Clique bildet, ist für die Bedeutung der k-Bäume absolut essentiell. Würde man beispielsweise statt dessen lediglich fordern, dass vi
in G[{v1 , . . . , vi }] Grad höchstens k hat, würde man eine wesentlich grössere Klasse erhalten, die bereits
für kleine k überhaupt nicht mehr baum-ähnlich“ sind. Beispielsweise wäre dann jedes Gitter bereits ein
”
2-Baum – was überhaupt nicht der Intuition entspricht.
6.3. PARTIELLE K-BÄUME
83
Aus der Definition eines k-Baumes folgt sofort:
Lemma 6.8 Für jeden partiellen k-Baum G = (V, E) gilt |E| ≤ k|V |.
Beweis: Offenbar genügt es die Behauptung
für k-Bäume zu zeigen. Wir zeigen dies durch Induktion
über n = |V |. Für n = k + 1 ist |E| = k+1
≤
k(k
+ 1). Für den Induktionsschritt beachte man, dass aus
2
der Induktionsannahme folgt, dass für G′ := G \ vn gilt: |E(G′ )| ≤ k|V (G′ )|. Wegen |V (G′ )| = |V (G)| − 1
und |E(G)| = |E(G′ )| + k folgt daraus sofort die Behauptung.
Satz 6.9 Sei G = (V, E) ein Graph. Dann sind äquivalent:
(i) G ist ein partieller k-Baum.
(ii) G hat Baumweite ≤ k.
Beweis: Wir halten zunächst fest, dass es genügt den Satz für zusammenhängende Graphen G zu
beweisen.
⇐=“: Sei G ein Graph und (T, W) eine Baumzerlegung mit Baumweite k. Wir definieren nun einen
”
Graphen GT = (VT , ET ) in dem wir auf jeder Menge Wx der Baumzerlegung eine Clique bilden:
[ Wx .
GT :=
2
x∈T
Gemäss Definition der Baumzerlegung ist VT = V und es gilt E ⊆ ET . Zu zeigen ist also lediglich, dass
GT ein partieller k-Baum ist. Dies zeigen wir durch Induktion über die Kardinalität t = |V (T )| der
Knotenmenge der Baumzerlegung (T, W).
Für t = 1 ist GT eine (k+1)-Clique und die Behauptung somit richtig. Für den Beweis des Induktionsschrittes t ⇒ t + 1 wählen wir ein beliebiges Blatt x0 in T und setzten T ′ := T \ x0 . Nach Induktionse T ′ auf der Knotenmenge von
annahme ist GT ′ ein partieller k-Baum und es gibt daher einen k-Baum G
e
GT ′ , so dass GT ′ Subgraph von GT ′ ist.
Es sei y0 der (eindeutig bestimmte!) Nachbar von x0 in T . Wir unterscheiden zwei Fälle. Falls Wx0 = Wy0 ,
so ist GT = GT ′ und GT also ein partieller k-Baum. Andernfalls gilt für jeden Knoten w ∈ Wx0 \ Wy0 :
w 6∈ Wz für alle z ∈ T \ x0 . Daher ist w in GT nur mit Knoten aus Wx0 verbunden. Da G nach Annahme
zusammenhängend ist, kann Wx0 ∩ Wy0 nicht leer sein. Sei u derjenige Knoten aus Wx0 ∩ Wy0 der in
eT ′ als letztes eingefügt wurde. Dann ist (Wx0 ∩ Wy0 ) \ {u} ⊆ Γ e (u). Dies bedeutet
den k-Baum G
GT ′
e T ′ (u) eine (k+1)-Clique mit allen Knoten aus Wx0 ∩ Wy0 enthält. Wir können daher
insbesondere, dass G
e T erweitern, in dem wir die Knoten w1 , . . . , wℓ aus Wx0 \ Wy0 in
eT ′ zu einem k-Baum G
den k-Baum G
e
beliebiger Reihenfolge so an GT ′ anfügen können, dass die Nachbarschaft von wi jeweils eine k-Clique ist,
die alle Knoten aus {w1 , . . . , wi−1 } ∪ (Wx0 ∩ Wy0 ) enthält. Nach Konstruktion ist GT ein Subgraph des
eT , somit ist GT ein partieller k-Baum, was zu zeigen war.
k-Baumes G
=⇒“: Da jede Baumzerlegung für einen Graphen G auch automatisch eine Baumzerlegung für alle
”
Subgraphen von G darstellt, genügt es die Aussage für k-Bäume zu zeigen. Sei also G = (V, E) ein kBaum und v1 , . . . , vn eine Reihenfolge der Knoten von V gemäss Definition 6.7. Wir zeigen nun durch
Induktion über i:
Für alle k + 1 ≤ i ≤ n gilt: Für Gi := G[{v1 , . . . , vi }] gibt es eine Baumzerlegung (Ti , Wi ) mit Baumweite
k, so dass es für alle 1 ≤ j ≤ i einen Knoten xj ∈ T gibt, so dass {vj }∪ΓGj (vj ) ⊆ Wxj . (Hierbei bezeichne
ΓGj (v) die Nachbarschaft von v in dem Graphen Gj .)
Die Induktionsverankerung für i = k + 1 folgt unmittelbar in dem wir als Tk+1 einen Baum auf einem
Knoten x wählen und diesem Knoten als Knotenmenge die Menge Wx := {v1 , . . . , vk+1 } zuordnen. Für
den Beweis des Induktionsschrittes von i nach i + 1 betrachten wir die Nachbarschaft von vi+1 in Gi+1 .
Nach Definition eines k-Baumes bildet diese Nachbarschaft eine k-Clique in Gi . Die Nachbarn seien
vj1 , . . . , vjk , wobei 1 ≤ j1 < · · · < jk ≤ i. Nach Induktionsannahme gibt es in der Baumzerlegung (Ti , Wi )
einen Knoten x′ mit {vjk } ∪ ΓGjk (vjk ) ⊆ Wx′ . Wir konstruieren nun eine Baumzerlegung (Ti+1 , Wi+1 ) für
Gi+1 in dem wir zu Ti einen zusätzlichen Knoten x hinzufügen, den wir mit dem Knoten x′ verbinden.
Als Knotenmenge Wx wählen wir Wx = {vi+1 } ∪ ΓGi+1 (vi+1 ).
84
KAPITEL 6. BESCHRÄNKTE BAUMWEITE
Nachzuprüfen ist nun, dass (Ti+1 , Wi+1 ) in der Tat die gewünschte Baumzerlegung für Gi+1 bildet. Man
sieht schnell ein, dass der einzig kritische Fall die Zusammenhangsbedingung aus Definition 6.1 ist. Dass
diese gilt, sieht man wie folgt ein. Sei v ein beliebiger Knoten aus Wx . Für v = vi+1 kommt v in keiner
anderen Menge Wy vor. Es ist also nichts zu zeigen. Für v = vjk gilt v ∈ Wx′ nach Wahl von x′ . Für alle
übrigen v ∈ Wx \ {vi+1 , vjk } ist v ∈ ΓGjk (vjk ), da nach Definition vjk derjenige Nachbar von vi+1 ist,
der den höchsten Index hat. Somit gilt v ∈ Wx′ und die Zusammenhangsbedingung ist daher für jeden
Knoten v ∈ Wx erfüllt.
6.4
Bestimmung einer Baumzerlegung
In diesem Abschnitt wollen wir uns der Frage zuwenden, wie man zu einem gegebenen Graphen eine
Baumzerlegung mit möglichst kleiner Baumweite bestimmt.
Dazu halten wir zunächst ohne Beweis fest, dass dieses Problem in voller Allgemeinheit schwierig ist.
Satz 6.10 Das Problem Gegeben ein Graph G = (V, E) und ein k ∈ N, ist die Baumweite von G
”
höchstens k?“ ist NP-vollständig.
In diesem Abschnitt werden wir uns daher mit einer einfacheren Variante des Problems beschäftigen. Zum
einen werden wir nur Graphen mit konstanter Baumweite betrachten. Zum anderen werden wir uns damit
zufrieden geben, nicht eine Baumzerlegung mit minimaler Baumweite zu berechnen, sondern wir geben
uns für Graphen mit Baumweite < k mit mit Baumzerlegungen mit Baumweite ≤ 3k zufrieden. Man
beachte, dass dies ausreicht, um die Algorithmen aus Abschnitt 6.2 anzuwenden: Es verschlechtert sich
zwar die Laufzeit, aber polynomielle Algorithmen bleiben polynomiell und lineare Algorithmen bleiben
linear.
Um den zu konstruierenden Algorithmus genauer beschreiben zu können benötigen wir zunächst noch
den Begriff eines S-Separators.
Definition 6.11 Sei G = (V, E) und S ⊆ V . Eine Menge C ⊆ V heisst S-Separator, falls es eine
Partition von V \ C in Mengen A und B gibt, so dass E ∩ A × B = ∅ (also G keine Kante zwischen A
und B enthält) und |A ∩ S| ≤ |B ∩ S| ≤ 21 |S|.
Lemma 6.12 Ist G = (V, E) ein Graph mit Baumweite k, dann gibt es für jede Menge S ⊆ V einen
S-Separator C der Grösse |C| ≤ k + 1.
Beweis: Wie gehen ganz analog zum Beweis von Satz 6.5 vor. D.h., wir wählen einen beliebigen Knoten
r ∈ T als Wurzel von T und definieren eine Gewichtsfunktion w : V (T ) → N0 wie folgt. Für r setzen wir
w(r) := |Wr ∩ S|. Für alle übrigen Knoten x ∈ T \ r sei w(x) := |(Wx ∩ S) \ Wparent(x) |, wobei parent(x)
den (eindeutig bestimmten!) Vorgänger von x in dem am Knoten r gewurzelten Baum T bezeichne.
Beachte,
dass nach Definition jeder Knoten v ∈ S insgesamt genau einmal gezählt wird. Es gilt daher
P
x∈T w(x) = |S|.
Nach Satz 5.3 kann man in linearer Zeit einen Knoten x0 P
∈ T finden, so dass das Gesamtgewicht
P
1
1
′
w(z)
eines
jeden
Teilbaumes
T
in
T
\
x
höchstens
′
0
x∈T w(x) = 2 |S| ist.
z∈T
2
S Da man sich leicht
′
davon P
überzeugt, dass für jeden Teilbaum T in T \ x0 die Anzahl Knoten in (( z∈T ′ Wz ) \ Wx0 ) ∩ S
durch z∈T ′ w(z) beschränkt ist, folgt hieraus zusammen mit Lemma 6.4 sofort die Behauptung.
Unser Ziel ist es nun, einen Algorithmus für das folgende Problem zu konstruieren:
Algorithmus TreeFinder(G, k, X)
Eingabe: Graph G = (V, E), k ∈ N, X ⊆ V mit |X| ≤ 2k.
Ausgabe: Entweder eine Baumzerlegung (T, W) mit Baumweite ≤ 3k und der Eigenschaft X ⊆ Wt
für ein t ∈ T
oder
eine Menge S ⊆ V , so dass G keinen S-Separator der Größe ≤ k besitzt.
6.4. BESTIMMUNG EINER BAUMZERLEGUNG
85
Man beachte, dass es für Graphen mit Baumweite < k gemäss Lemma 6.12 keine Menge S ⊆ V geben
kann, für die der Oder-Fall eintritt. D.h. für Graphen mit Baumweite < k wird der Algorithmus –
unabhängig von der Wahl der Menge X – immer eine Baumzerlegung mit Baumweite ≤ 3k ausgeben.
Wir konstruieren den Algorithmus TreeFinder in dem wir das Problem auf drei einfachere Algorithmen
zurückführen, die wir jetzt vorstellen und herleiten werden.
Algorithmus PathFinder(G, k, s, t)
Eingabe: Graph G = (V, E), k ∈ N, Knoten s, t ∈ V mit {s, t} 6∈ E.
Ausgabe: Entweder k paarweise intern knoten-disjunkte s-t-Pfade
oder
einen Separator C ⊆ V mit |C| < k, so dass es eine Partition von V \C in Mengen
A und B gibt, so dass s ∈ A, t ∈ B und E ∩ (A × B) = ∅.
Satz 6.13 Es gibt einen Algorithmus PathFinder(G, k, s, t) mit Laufzeit O(k · |E|).
Beweis: Wir beobachten zunächst, dass das Problem ganz ähnlich zu einem und aus Kapitel 1 gut bekannten Flussproblem ist. Ersetzt man nämlich die Annahme knoten-disjunkt“ durch kanten-disjunkt“,
”
”
so entspricht der Entweder“-Teil der Ausgabe genau der Frage, ob es einen Fluss der Stärke k in dem
”
(ungewichteten) Netzwerk N = (V, A, s, t) gibt, wobei A = {(u, v), (v, y) | {u, v} ∈ E}. Zur Lösung der
kanten-disjunkten Variante des Problems können wir daher wie folgt vorgehen:
• Verwende den Algorithmus von Ford-Fulkerson für das Netzwerk N = (V, A, s, t). Beachte, dass
sich der Fluss - da der Graph ungewichtet ist - bei in jedem Augmentierungsschritt um genau Eins
erhöht.
• Falls der Algorithmus nach weniger als k Augmentierungsschritten stoppt, sei (W, W ) ein s-t-Schnitt
mit c(W, W ) = w(f ) < k. Setze C := {x ∈ W | ∃y ∈ W mit {x, y} ∈ E}. Dann gilt |C| ≤ k wegen
c(W, W ) = w(f ) < k und C ist somit der gesuchte Separator, wobei A = W \ C und B = W .2
• Ansonsten stoppe nach k Augmentierungsschritten: Der dann gefundene Fluss entspricht der Vereinigung der k gesuchten Pfade und die Pfade lassen sich aus dem Fluss leicht rekonstruieren
(Übungsaufgabe).
Die Lösung für die gesuchte knoten-disjunkte Varianten können wir durch einen einfachen Trick auf die
kanten-disjunkte Variante zurückführen. Dazu konstruieren wir ausgehend von dem oben eingeführten
Netzwerk N = (V, A, s, t) ein neues Netzwerk N ′ = (V ′ , A′ , s, t) in dem wir jeden Knoten v ∈ V \
{s, t} durch zwei Knoten vin und vout ersetzen und alle eingehenden Kanten mit vin verbinden und alle
ausgehenden Kanten mit vout . Zusätzlich fügen wir zwischen vin und vout eine von vin nach vout gerichtete
Kante ein. Abbildung 6.3 zeigt diese Konstruktion an einem Beispiel.3
Man überzeugt sich leicht davon, dass das neue Netzwerk N ′ die Eigenschaft hat, dass kanten-disjunkte
Pfade in N ′ knoten-disjunkten Pfaden in N entsprechen. Das knoten-disjunkte Problem in N können wir
somit dadurch lösen, dass wir kanten-disjunkte Pfade in N ′ suchen – was wir mit dem oben beschriebenen
Verfahren tun können. Es bleibt zu zeigen, wie wir einen eventuell gefundenen Separator C ′ ⊆ V ′ in einen
Separator C ⊆ V umwandeln können. Dazu überlegen wir uns, dass in dem Netzwerk N ′ ein minimaler s-tSchnitt (W, W ) immer so gewählt werden kann, dass für alle Kanten (x, y) mit x ∈ W und y ∈ W gilt, dass
es ein v ∈ V \{s, t} gibt mit x = vin und y = vout . Setzen wir daher C = {v ∈ V | vin ∈ W und vout ∈ W },
so ist C der gesuchte Separator.4
2 Genau genommen, löst dieser Algorithmus nur eine leichte Verallgemeinerung des angegebenen Problems: Gemäss
Konstruktion der Menge C könnte s ∈ C sein, wir müssen daher statt s ∈ A den Fall s ∈ A ∪ C erlauben. Dies wird im
Weiteren aber nicht stören.
3 Genau genommen müssten wir beim Übergang vom Graphen G zum Netzwerk N für den Knoten s nur ausgehende
und für den Knoten t nur eingehende Kanten betrachten. Wir haben jeweils beide Richtungen eingefügt, um die Definition
syntaktisch einfach zu halten.
4 Beachte, dass wir im Netzwerk N ′ immer einen Separator C finden können, der den Knoten s nicht enthält.
86
KAPITEL 6. BESCHRÄNKTE BAUMWEITE
a
s
t
b
a in
a
c
s
t
b
s
t
c
b in
Graph
G=(V,E)
Netzwerk
a out
N=(V,A,s,t)
Netzwerk
b out
c in
c out
N’=(V’,A’,s,t)
Abbildung 6.3: Konstruktion des Netzwerks N ′ = (V ′ , A′ , s, t)
Algorithmus PathFinderForSets(G, k, S, T )
Eingabe: Graph G = (V, E), k ∈ N, disjunkte Mengen S, T ⊆ V mit E ∩ (S × T ) = ∅.
Ausgabe: Entweder k paarweise intern knoten-disjunkte S-T -Pfade (also Pfade mit Anfangspunkt in
S und Endpunkt in T , so dass alle inneren Knoten der Pfade in V \ (S ∪ T ) liegen
und die (inneren) Knoten der Pfaden paarweise verschieden sind)
oder
einen Separator C ⊆ V mit |C| < k, so dass es eine Partition von V \C in Mengen
A und B gibt, so dass S ⊆ A, T ⊆ B und E ∩ (A × B) = ∅.
Satz 6.14 Es gibt einen Algorithmus PathFinderForSets(G, k, S, T ) mit Laufzeit O(k · |E|).
Beweis: Den gewünschten Algorithmus erhält man ganz einfach dadurch, dass man das Pfadproblem
für Mengen S und T auf ein Pfadproblem für Knoten s und t reduziert. Dazu ersetzt man einfach
alle Knoten aus S durch einen neuen Knoten s und verbindet s mit allen Knoten u für die es eine
Kante zwischen einem Knoten aus S und u gibt. Analog geht man für die Menge T vor, ersetzt also die
Knoten aus T durch einen neuen Knoten t, der entsprechend angebunden wird. Diese Reduktion lässt
sich in Zeit O(|E|) durchführen. Jetzt rufen wir für den neu konstruierten Graphen G′ den Algorithmus
PathFinder(G′ , k, s, t) auf, der in Zeit O(k · |E|) die gewünschte Ausgabe bestimmt.
Algorithmus SeparatorFinder(G, k, X)
Eingabe: Graph G = (V, E), k ∈ N, eine Menge X ⊆ V mit |X| ≤ 2k.
Ausgabe: Ein X-Separator C von G mit |C| ≤ k, falls ein solcher existiert.
Satz 6.15 Es gibt einen Algorithmus SeparatorFinder(G, k, X) mit Laufzeit O(9k k · |E|).
Beweis: Die Idee ist folgende. Nehmen wir an es gibt einen X-Separator C mit |C| ≤ k und einer
Partition A ∪ B von V \ C mit den gewünschten Eigenschaften. Setzen wir dann S := X ∩ A, T := X ∩ B
und XC := X ∩ C, dann gibt es in G[V \ XC ] sicherlich keine k + 1 − |XC | viele intern knoten-disjunkten
Pfade von S nach T , denn alle diese Pfade müssten einen Knoten aus C \XC enthalten und nach Annahme
gilt |C \ XC | = |C| − |XC | ≤ k − |XC |.
Wir können das Separator-Problem daher wie folgt lösen:
• Für alle Partitionen X = S ∪ XC ∪ T mit |S|, |T |, |XC | ≤ k rufe PathFinderForSets(G[V \
XC ], k + 1 − |XC |, S, T ) auf.
• Falls für eine solche Partition S ∪ XC ∪ T von Algorithmus PathFinderForSets ein Separator C
ausgegeben wird, dann ist C ∪ XC der gesuchten Separator.
• Ansonsten wissen wir, dass es in G keinen X-Separator der Grösse ≤ k geben kann.
Die behauptete Laufzeit ergibt sich aus Satz 6.14 und der Tatsache, dass sich die Anzahl der zu betrachteten Partitionen durch 3|X| ≤ 9k abschätzen lässt.
6.4. BESTIMMUNG EINER BAUMZERLEGUNG
87
Satz 6.16 Es gibt einen Algorithmus TreeFinder(G, k, X) der für Graphen G = (V, E) mit m ≤ 3kn
Laufzeit O(9k k 2 n) hat.5
Beweis:
• Wir rufen SeparatorFinder(G, k, X) auf.
• Falls vom Algorithmus SeparatorFinder kein Separator gefunden wird, gebe X als Menge S aus
(oder-Fall).
• Ansonsten sei C mit |C| ≤ k der vom Algorithmus gefundene Separator. Dann zerfällt G[V \ C] in
zwei oder mehr Komponenten, wobei jede Komponente höchstens 21 |X| ≤ k Knoten aus X enthält.
Wir bezeichnen mit U1 , . . . , Uℓ die Knotenmengen der Komponenten in G[V \ C] und setzen:
Gi
Xi
:= G[C ∪ Ui ]
und
:= (Ui ∩ X) ∪ C.
• Nun rufen wir für alle i = 1, . . . , ℓ den Algorithmus TreeFinder(Gi , k, Xi ) auf.
• Falls es ein 1 ≤ i0 ≤ ℓ gibt, für das TreeFinder(Gi0 , k, Xi0 ) eine Menge Si0 ausgibt, für die
Gi0 keinen Si0 -Separator der Grösse ≤ k hat, geben wir diese Menge Si0 als Menge S aus, für
die G keinen S-Separator der Grösse ≤ k hat (denn jeder solche Separator würde einen für Gi0
induzieren).
• Ansonsten erhalten wir für alle 1 ≤ i ≤ ℓ eine Baumzerlegung (Ti , Wi ) wobei es für alle 1 ≤ i ≤ ℓ
einen Knoten ti ∈ V (Ti ) gibt mit Xi ⊆ Wti .
• Diese Baumzerlegungen setzen wir nun zu einer Baumzerlegung (T, W) zusammen. Dazu setzen wir
[
V (T ) := {t0 } ∪
V (Ti ),
1≤i≤ℓ
E(T ) :=
Wx
:=
{{t0 , t1 }, {t0 , t2 }, . . . , {t0 , tℓ }} ∪
(
Wx ,
X ∪ C,
falls x ∈
sonst.
S
1≤i≤ℓ
[
E(Ti ),
1≤i≤ℓ
V (Ti )
Für die Korrektheit des Algorithmus muss man sich zum einen davon überzeugen, dass der Aufruf von
TreeFinder(Gi , k, Xi ) zulässig ist, dass also |Xi | ≤ 2k gilt, und zum anderen, dass (T, W) die gesuchte
Baumzerlegung ist. Ersteres folgt wegen |Xi | ≤ |Ui ∩ X| + |C| ≤ k + k. Letzteres prüft man leicht nach.
Die Laufzeit ergibt sich wie folgt. Für den Aufruf von SeparatorFinder(G, k, X) benötigt man gemäss
Satz 6.15 Laufzeit O(9k k · |E|) = O(9k k 2 · |V |)
Bezeichnen wir daher mit t(n) die maximale Laufzeit von TreeFinder(G, k, X) für Graphen G = (V, E)
auf |V | = n Knoten und m ≤ 3kn Kanten, so erhalten wir die Rekursionsgleichung
X
t(n) ≤ O(9k k 2 n) + max
t(ni + c),
c,ni
1≤i≤ℓ
wobei das Maximum über alle 1 ≤ c = |C| ≤ k und Partitionen n1 + · · · + nℓ = n − c gebildet wird. Per
Induktion zeigt man nun (Übungsaufgabe!), dass t(n) = O(9k k 2 n2 ).
5 Für
Graphen G mit m > 3kn kann nach Lemma 6.8 der Entweder-Fall gar nicht vorkommen.
Herunterladen