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.