Modul Effiziente Graphenalgorithmen Bachelor Informatik 2. Semester Inhaltsverzeichnis 1 Modulbeschreibung 2 2 Bestimmung aller Knotengrade 4 3 Bäume 5 4 Topologisches Sortieren 6 5 Breitensuche (Breadth-First Search) für ungerichtete Graphen 8 6 Tiefensuche (Depth-First Search) 10 6.1 Tiefensuche auf gerichteten Graphen . . . . . . . . . . . . . . . . . . . 10 6.2 BFS zur Bestimmung der stark zusammenhängenden Komponenten eines gerichteten Graphen . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Tiefensuche auf ungerichteten Graphen . . . . . . . . . . . . . . . . . . 15 6.3 7 Minimalgerüste und Greedy-Algorithmus 17 7.1 Algorithmen zur Bestimmung von Minimalgerüsten . . . . . . . . . . . 17 7.2 Der Greedy-Algorithmus und Matroide . . . . . . . . . . . . . . . . . . 20 7.3 Das Steinerbaumproblem und andere Varianten des Minimalgerüstproblems . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 8 Maximalfluß 25 8.1 Flüsse und Schnitte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 8.2 Der Algorithmus von Ford/Fulkerson . . . . . . . . . . . . . . . . . . . 28 8.3 Der Algorithmus von Dinitz . . . . . . . . . . . . . . . . . . . . . . . . 31 9 Unabhängige Knoten- und Kantenmengen 9.1 9.2 Die Probleme Vertex Cover, Maximum Independent Set und Maximum Clique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 36 Maximum Matching: Paarungen und ihre Bestimmung in paaren Graphen 39 1 9.3 Knotenfärbungen von Graphen . . . . . . . . . . . . . . . . . . . . . . 41 9.4 Chordale Graphen, Intervallgraphen und perfekte Graphen . . . . . . . 42 9.4.1 Chordale Graphen . . . . . . . . . . . . . . . . . . . . . . . . . 42 9.4.2 Intervallgraphen . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Stable Matching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 9.5 10 Eulerkreise 50 2 1 Modulbeschreibung “Das Modul führt in die Grundlagen effizienter Graphenalgorithmen für Informatiker ein, behandelt grundlegende Probleme und Methoden wie vollständiges Durchsuchen von Graphen, minimum spanning trees, Maximalfluß in Netzwerken, das Matchingproblem, Färbungsprobleme sowie Baumstrukturen in Graphen und Dekomposition sowie Weitebegriffe. Außerdem werden einige spezielle Graphenklassen behandelt wie z.B. chordale Graphen, Intervallgraphen, perfekte Graphen sowie planare Graphen.” Im SS 2010 behandelte Inhalte: 1. Graphen und ihre Darstellung 2. Gerichtete azyklische Graphen - Charakterisierung und Erkennung 3. Breitensuche (BFS) auf ungerichteten Graphen 4. Tiefensuche (DFS) auf gerichteten Graphen; stark zusammenhängende Komponenten; 5. Algorithmus von Kosaraju-Sharir; Anwendung 2SAT 6. DFS auf ungerichteten Graphen 7. Minimalgerüste (minimum spanning tree) 8. Die Algorithmen von Jarnik-Prim-Dijkstra und von Kruskal 9. Der greedy-Algorithmus; Matroide; Optimalität des greedy-Algorithmus 10. Maximalfluß in Netzwerken und Anwendungen 11. Der Algorithmus von Ford-Fulkerson 12. Der Algorithmus von Dinitz 13. Das maximum matching Problem in bipartiten Graphen 14. Knoten- und Kantenfärbungen in Graphen mit Anwendungsbeispielen 15. Chordale Graphen und Intervallgraphen; perfekte Graphen 16. Das Problem Stable Matching Das hier verfügbare Skript ist kein Ersatz für ein Lehrbuch und auch kein Ersatz für eine Mitschrift der Vorlesungen. Es soll lediglich helfen, Algorithmen, Definitionen und Zusammenhänge in Form von Theoremen und Lemmata korrekt und sauber darzustellen, so daß der Hörer/die Hörerin entlastet ist vom mühseligen Mitschreiben von langen und komplizierten Texten wie z.B. Algorithmen. 3 Literatur: Es gibt eine Fülle von Lehrbuchliteratur zum Thema Graphenalgorithmen. Viele Bücher zum Thema Algorithmen widmen diesem Thema ein oder mehrere Kapitel wie z.B. das untengenannte Buch von Kleinberg und Tardos sowie das von Ottman und Widmayer. Andere befassen sich ausschließlich mit dem Thema Graphen und Algorithmen. Hier ist eine Auswahl: • A. Brandstädt, Graphen und Algorithmen, Teubner, 1994 • J. Kleinberg, E. Tardos, Algorithm Design, Addison-Wesley, Pearson, 2005 • M.C. Golumbic, Algorithmic Graph Theory and Perfect Graphs, Academic Press 1980, Annals of Discrete Mathematics, 57, 2004 • T. Ottmann, P. Widmayer, Algorithmen und Datenstrukturen, Spektrum, 2002 • S. Even, Graph algorithms, Computer Science Press, Potomac, Maryland, 1979 4 2 Bestimmung aller Knotengrade a) in ungerichteten Graphen: Algorithmus 2.1 Eingabe: Schlichter ungerichteter Graph G = (V, E) in Adjazenzlistendarstellung. Ausgabe: Array [deg(v)]v∈V der Knotengrade. (1) (2) (3) for all v ∈ V do deg(v) := 0; for all v ∈ V do for all w ∈ L(v) do deg(v) := deg(v) + 1; b) in gerichteten Graphen: Algorithmus 2.2 Eingabe: Gerichteter Graph G = (V, E) in Adjazenzlistendarstellung Ausgabe: Arrays [indeg(v)]v∈V der Ingrade sowie [outdeg(v)]v∈V der Ausgrade. (1) (2) (3) (4) (5) for all v ∈ V do begin indeg(v) := 0; outdeg(v) := 0 end; for all v ∈ V do for all w ∈ L(v) do begin outdeg(v) := outdeg(v) + 1; indeg(w) := indeg(w) + 1 end 5 3 Bäume Satz 3.1 Es sei G = (V, E) ein endlicher ungerichteter Graph mit |V | = n ≥ 1. Die folgenden Eigenschaften sind äquivalent: (1) G ist Baum. (2) G ist maximal kreisfrei, d.h. G ist kreisfrei, und beim Hinzufügen einer neuen Kante entsteht ein Kreis. (3) Zwischen je zwei Knoten a, b ∈ V gibt es genau einen einfachen Weg. (4) G ist minimal zusammenhängend, d.h. G ist zusammenhängend und nach Wegnahme einer Kante ist G nicht mehr zusammenhängend. (5) G ist kreisfrei und |E| = n − 1. (6) G ist zusammenhängend und |E| = n − 1. Algorithmus 3.1 Eingabe: Ein Graph G = (V, E), beschrieben durch seine Adjazenzlisten. Frage: Ist G ein Baum? (1) Teste, ob G zusammenhängend ist und |E| = |V | − 1 gilt. (2) Wenn ja, ist G Baum, sonst nicht. Definition 3.1 Es sei G = (VG , EG ) endlicher ungerichteter zusammenhängender Graph. Ein Baum T = (VT , ET ) heißt Gerüst (spanning tree) von G, falls VT = VG gilt. Ist G nicht zusammenhängend, so heißt F spanning forest von G, falls die Zusammenhangskomponenten von F Gerüste der Zusammenhangskomponenten von G sind. Durchsuchen von Binärbäumen und Angabe einer Knotenreihenfolge: (1) preorder(Bε ) = ∅ – die leere Folge von Knoten. (2) preorder((x, B1, B2 )) = (x, preorder(B1), preorder(B2)) Analog definiert man inorder und postorder mit demselben Induktionsanfang sowie den Bedingungen (2′ ) inorder(B) = (inorder(B1 ), x, inorder(B2 )) bzw. (2′′ ) postorder(B) = (postorder(B1 ), postorder(B2), x) für B = (x, B1 , B2 ) 6 4 Topologisches Sortieren Definition 4.1 Es sei G = (V, E) ein endlicher gerichteter Graph mit V {v1 , . . . , vn }. = (1) G heißt gerichteter azyklischer Graph (directed acyclic graph, dag), falls G keine gerichteten Kreise enthält. (2) Eine Reihenfolge σ = (v1 , . . . , vn ) aller Knoten aus V heißt topologische Ordnung von G, falls gilt: In der Reihenfolge σ zeigen alle Kanten von links nach rechts. Das heißt: für alle Kanten (vj , vk ) ∈ E gilt j < k, d.h. vj ist links von vk in σ. Lemma 4.1 Jeder dag enthält einen Knoten v mit indeg(v) = 0. Prinzip eines Algorithmus zur Erkennung von dags: Gegeben: Gerichteter Graph G = (V, E). Frage: Ist G dag? Wenn ja, gib eine topologische Ordnung σ von G an. Prinzip: Am Anfang ist die Knotenreihenfolge σ leer. Bestimme so lange einen Knoten v mit indegree 0, füge v an σ an und verringere den indegree aller Knoten w mit (v, w) ∈ E um 1 (dabei können neue Knoten mit indegree 0 entstehen, die der Algorithmus sich merkt), bis entweder alle Knoten aus V in σ aufgenommen sind oder sich herausstellt, daß dies nicht geht - im zweiten Fall ist G kein dag. 7 Formale Beschreibung: Algorithmus 4.1 Eingabe: Ein gerichteter Graph G = (V, E), beschrieben durch seine Adjazenzlisten. Ausgabe: Eine topologische Ordnung σ von G oder die Antwort “G ist kein dag”. (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) Berechne mit Algorithmus 2.2 die Ingrade indeg(v) aller Knoten v ∈ V . Q := ∅ {Q ist eine Warteschlange}; σ:=leere Folge; for all v ∈ V do if indeg(v) = 0 then Q := add(Q, v); while Q 6= ∅ do begin u := f irst(Q); σ := (σ, u); Q := remove(Q, u); for all (u, w) ∈ E do begin indeg(w) := indeg(w) − 1; if indeg(w) = 0 then Q := add(Q, w) end; end; if σ enthält nicht alle Knoten aus V then G ist kein dag else σ ist topologische Ordnung von G. Satz 4.1 Der Algorithmus 4.1 ist korrekt und in Linearzeit ausführbar. Wie bestimmt man einen gerichteten Kreis, falls G kein dag ist? Ein Erkennungsalgorithmus heißt zertifizierender Algorithmus (certifying algorithm), falls sowohl bei der Ja- als auch bei der Nein-Antwort des Algorithmus ein (leicht zu zertifizierender) Beleg mitgeliefert wird - im Beispiel der Erkennung von dags ist dies für die Ja-Antwort eine topologische Ordnung des Eingabegraphen G, und für die Nein-Antwort ist ein gerichteter Kreis in G ein guter Beleg. 8 5 Breitensuche (Breadth-First Search) für ungerichtete Graphen Breitensuche (Breadth-First Search, BFS) ist ein Algorithmus, der alle Knoten eines ungerichteten Graphen G = (V, E), dargestellt durch seine Adjazenzlisten, über Kanten aus E durchläuft und die Durchlaufreihenfolge angibt. Es sei [b(v)]v∈V ein array, der mit b(v) = ∞ für alle v ∈ V initialisiert wird und der am Ende die BFS-Nummern der Knoten in der Reihenfolge ihres Erreichens (und ihrer Aufnahme in die Warteschlange) enthalten soll. Prinzip: Für jede Zusammenhangskomponente Z des Graphen wähle einen Startknoten, von dem aus alle übrigen Knoten von Z über Kanten von G erreicht werden. Die Reihenfolge richtet sich nach der Aufnahme in eine Warteschlange. Formale Beschreibung: Algorithmus 5.1 BFS Eingabe: Ein ungerichteter Graph G = (V, E), gegeben durch seine Adjazenzlisten, sowie ein array [b(v)]v∈V . Ausgabe: Eine Menge B von gerichteten Kanten mit der Eigenschaft, daß der B zugrundeliegende ungerichtete Graph für jede Zusammenhangs– komponente von G ein Gerüst liefert, sowie eine Numerierung [b(v)]v∈V , die die Reihenfolge beim Einfügen in die Warteschlange Q angibt. (1) B := ∅; i := 0; Q := ∅; (2) for all v ∈ V do b(v) := ∞; (3) while (Q = ∅ und es existiert ein v ∈ V mit b(v) = ∞) do begin (4) Q := add(Q, v); i := i + 1; b(v) := i; (5) while Q 6= ∅ do begin (6) v := f irst(Q); (7) Q := remove(Q, v); (8) for all w ∈ N(v) mit b(w) = ∞ do begin (9) Q := add(Q, w); i := i + 1; b(w) := i; (10) B := B ∪ {(v, w)}; end end end Satz 5.1 Der Algorithmus 5.1 ist korrekt und in Linearzeit ausführbar. 9 Anwendungsbeispiele: 1. Bestimmung der Zusammenhangskomponenten eines ungerichteten Graphen bzw. Test auf Zusammenhang 2. Erkennung bipartiter Graphen 3. Kürzeste Wege und Distanzen vom Startknoten zu allen übrigen Knoten 4. Auffinden von Kreisen 10 6 Tiefensuche (Depth-First Search) 6.1 Tiefensuche auf gerichteten Graphen [A.V. Aho, J.E. Hopcroft, J.D. Ullman, Data Structures and Algorithms, AddisonWesley 1982, S. 215-226] Prozedur 6.1 df s(v) (1) (2) (3) mark(v):=visited; for each vertex w on L(v) do if mark(w):=unvisited then dfs(w) Algorithmus 6.1 DF S(G) Eingabe: Ein gerichteter Graph G = (V, E) mit Knotenmenge {1, 2, . . . , n}, der durch seine Adjazenzlisten [L(v)]v∈V sowie einen array mark(v) ∈ {visited, unvisited} beschrieben ist. (1) for v := 1 to n do (2) mark(v):=unvisited; (3) for v := 1 to n do (4) if mark(v):=unvisited then dfs(v) Anders als bei BFS sind bei DFS zwei verschiedene Numerierungen sinnvoll: 1. entsprechend dem Beginn der jeweiligen Prozedur dfs(v); 2. entsprechend der Beendigung der jeweiligen Prozedur dfs(v); Variante mit Angabe eines spanning forest: Prozedur 6.2 df stree(v) (1) (2) (3) (4) (5) mark(v):=visited; for each vertex w on L(v) do if mark(w):=unvisited then begin ET := ET ∪ {(v, w)}; dfstree(w) end 11 Algorithmus 6.2 DF S − F orest(G) Eingabe: Ein gerichteter Graph G = (V, E) mit Knotenmenge {1, 2, . . . , n}, der durch seine Adjazenzlisten [L(v)]v∈V sowie einen array mark(v) ∈ {visited, unvisited} beschrieben ist. (0) ET := ∅; (1) for v := 1 to n do (2) mark (v):=unvisited; (3) for v := 1 to n do (4) if mark(v):=unvisited then dfstree(v) Eigenschaft 6.1 Es sei G = (V, E) gerichteter Graph. (1) Wenn df s(y) von df s(x) aus aufgerufen wird, so existiert ein gerichteter Weg x → . . . → y von x nach y. (2) Wenn df s(x) die zuletzt beendete dfs-Prozedur aller Knoten aus V bei DFS auf G ist und es existiert ein gerichteter Weg y → . . . → x in G von y nach x, so existiert auch ein gerichteter Weg x → . . . → y in G von x nach y in G, da in diesem Fall df s(y) von df s(x) aus aufgerufen wird: [x . . . [y . . .]y . . .]x . Ein gerichteter Graph G = (V, E) heißt stark zusammenhängend (strongly connected), falls für je zwei Knoten x, y ∈ V ein gerichteter Weg von x nach y sowie ein gerichteter Weg von y nach x existiert. Die stark zusammenhängenden Komponenten eines gerichteten Graphen G sind die größten stark zusammenhängenden Teilgraphen von G. Eigenschaft 6.2 Es sei G = (V, E) gerichteter Graph und x ∼ y die folgende binäre Relation auf V : x ∼ y, falls x = y oder x und y liegen in einem gemeinsamen gerichteten Kreis. (1) Die Relation x ∼ y ist Äquivalenzrelation auf V . (2) Faktorisiert man G nach ∼, d.h. die Äquivalenzklassen von ∼ werden die Knoten eines Graphen G∗ = (V ∗ , E ∗ ), und (x∗ , y ∗) ∈ E ∗ , falls eine Kante (x′ , y ′) ∈ E existiert mit x′ ∈ x∗ und y ′ ∈ y ∗, so ist G∗ ein dag. Eigenschaft 6.3 Es sei G = (V, E) gerichteter Graph und T1 , . . . , Tk die (in dieser zeitlichen Reihenfolge) durch Ausführung von DFS-Forest(G) auf G konstruierten Bäume. Dann verlaufen Kanten zwischen diesen Bäumen nur von rechts nach links, d.h. der entsprechende Graph ist ein dag. 12 Algorithmus 6.3 (Kosaraju, Sharir) (Stark von G) zusammenhängende Komponenten Ein gerichteter Graph G = (V, E) mit Knotenmenge {1, 2, . . . , n}, der durch seine Adjazenzlisten [L(v)]v∈V beschrieben ist. Ausgabe: Die stark zusammenhängenden Komponenten von G als die Bäume des in Schritt (3) konstruierten spanning forest. Eingabe: (1) Führe DF S(G) aus und numeriere die Knoten in der Reihenfolge der Beendigung ihrer Prozedur df s(v), d.h., derjenige Knoten, dessen dfs-Prozedur zuletzt endet, erhält die Nummer n = |V |. (2) Konstruiere den Graphen Grev , der aus G durch Umkehrung der Kantenrichtung entsteht. (3) Führe DF S − F orest(Grev ) aus, wobei mit dem Knoten höchster Nummer begonnen wird. Wenn nicht alle Knoten erreicht werden, starte jeweils neu mit dem noch nicht erreichten Knoten mit höchster Nummer. (4) Ausgabe: Jede Zusammenhangskomponente im DFS spanning forest F von Grev entspricht genau einer stark zusammenhängenden Komponente von G. Satz 6.1 Der Algorithmus 6.3 ist korrekt und in Linearzeit ausführbar. Beweis. Wir zeigen durch Induktion über die Zahl der stark zusammenhängenden Komponenten, daß der Punkt (4) im obigen Algorithmus 6.3 korrekt ist. Es sei xmax derjenige Knoten, dessen dfs-Prozedur zuletzt endet. 1. Zunächst betrachten wir die durch Anwendung von DF S − F orest(Grev ) konstruierten Bäume T1 , . . . , Tk . Wegen Eigenschaft 6.3 verlaufen alle Kanten zwischen diesen Bäumen von rechts nach links. Daher ist jede stark zusammenhängende Komponente von Grev (und damit auch von G) ganz in einem dieser Bäume enthalten. 2. Nun zeigen wir: T1 ist genau die stark zusammenhängende Komponente, die den Knoten xmax enthält. Es seien v und w in demselben, durch DF S − F orest(Grev ) konstruierten, Baum T1 mit Wurzel xmax enthalten. Wir können annehmen, daß v und w von xmax verschieden sind. Weil v im Baum T1 Nachfolger der Wurzel xmax ist, gibt es einen gerichteten Weg xmax → . . . → v in Grev , d.h. es gibt einen gerichteten Weg v → . . . → xmax in G. Wegen Eigenschaft 6.1 (2) gibt es dann auch einen gerichteten Weg xmax → . . . → v in G, und damit liegen v und xmax in einem gerichteten Kreis. Analog zeigt man, daß w und xmax in einem gerichteten Kreis liegen, und damit liegen v und w in derselben starken Zusammenhangskomponente von G. Ist k = 1, so ist damit die Korrektheit des Algorithmus bewiesen. Im Falle k > 1 erfolgt Induktion über die Zahl der stark zusammenhängenden Komponenten, die korrekt ist, da die DFS-Reihenfolge auf dem durch T2 , . . . , Tk beschriebenen Teilgraphen dieselbe ist wie beim Weglassen von T1 und Ausführung auf dem kleineren Graphen. q.e.d. 13 Anwendung: Ein Linearzeitalgorithmus für 2SAT. Das Problem 2SAT ist das folgende Entscheidungsproblem: Gegeben: Eine Formel F in KNF mit je zwei Literalen pro Klausel. Frage: Hat F eine erfüllende Belegung? Zur Erinnerung: Die logische Implikation A → B hat genau dann den Wahrheitswert 0, wenn A den Wahrheitswert 1 und B den Wahrheitswert 0 hat. Damit ist A → B semantisch äquivalent zu ¬A ∨ B. Wir konstruieren zu F einen Graphen GF wie folgt: Zu jeder Klausel (l ∨ l′ ) werden die folgenden zwei (zu (l ∨ l′ ) semantisch äquivalenten) Implikationen ¬l → l′ und ¬l′ → l als gerichtete Kanten von GF aufgenommen. Lemma 6.1 F ist genau dann erfüllbar, wenn in GF keine Variable Ai von F zusammen mit ihrer Negation ¬Ai in einem gerichteten Kreis liegt. Beweis: 1. “=⇒” Angenommen, in GF gibt es einen gerichteten Kreis, der eine Variable Ai zusammen mit ihrer Negation ¬Ai enthält. Da eine gerichtete Kante l → l′ einer Klausel ¬l ∨ l′ entspricht, bedeutet dies für eine erfüllende Belegung b von F : ist b(l) = 1, so muß b(l′ ) = 1 sein, sonst ist die Klausel nicht erfüllt. Ist nun eine Variable Ai von F zusammen mit ¬Ai in einem gerichteten Kreis, so gibt es einen gerichteten Weg von Ai nach ¬Ai sowie einen gerichteten Weg von ¬Ai nach Ai . Ist b(Ai ) = 1, so gibt es auf dem gerichteten Weg von Ai nach ¬Ai eine Kante x → y mit b(x) = 1 und b(y) = 0, und damit ist b(F ) = 0. Ist b(Ai ) = 0, so gibt es analog auf dem gerichteten Weg von ¬Ai nach Ai eine solche Kante. Also ist F unerfüllbar. 2. “⇐=” Wir gehen nun davon aus, daß in GF keine Variable Ai von F zusammen mit ihrer Negation ¬Ai in einem gerichteten Kreis liegt. Dies bedeutet, daß für kein i ∈ {1, . . . , n} Ai ∼ ¬Ai ist, wobei ∼ die in Eigenschaft 6.2 definierte Äquivalenzrelation ist. Offenbar gilt nach Definition der Kanten in GF für Literale l, l′ : l ∼ l′ genau dann, wenn ¬l ∼ ¬l′ , da zu jeder Kante x → y auch ¬y → ¬x Kante ist. Wir bilden nun den in Eigenschaft 6.2 definierten Faktorgraphen G∗F von GF ; nach Eigenschaft 6.2 (2) ist dieser ein dag. Wir wählen eine topologische Ordnung σ der Knoten von G∗F und definieren wie folgt eine Belegung der Variablen von F : Ist für Ai die Klasse A∗i in der σ-Ordnung links von (¬Ai )∗ (beachte, daß Ai und ¬Ai wegen der Voraussetzung in verschiedenen Äquivalenzklassen liegen), so setze b(Ai ) := 0, andernfalls setze b(Ai ) := 1. Wir teilen damit die Äquivalenzklassen in zwei Arten von Klassen: x∗ ist L-Klasse, falls in der σ-Ordnung x∗ links von (¬x)∗ liegt, und x∗ ist R-Klasse, falls in der σ-Ordnung x∗ rechts von (¬x)∗ liegt. Wir zeigen nun, daß b eine erfüllende Belegung für F ist, d.h. b(F ) = 1. Offenbar ist F genau dann erfüllt, wenn für keine Kante x → y in GF b(x) = 1 und b(y) = 0 ist. 14 Angenommen, es existiert doch eine Kante x → y in GF mit b(x) = 1 und b(y) = 0. Dann ist x∗ R-Klasse und y ∗ L-Klasse, und entsprechend ist (¬x)∗ links von x∗ und (¬y)∗ rechts von y ∗. Nun zeigt aber die Kante (¬y)∗ → (¬x)∗ in σ von rechts nach links - Widerspruch. Damit ist gezeigt, daß die so definierte Belegung b die Formel F erfüllt. q.e.d. 6.2 BFS zur Bestimmung der stark zusammenhängenden Komponenten eines gerichteten Graphen Analog zum vorigen Abschnitt erfolgt BFS für gerichtete Graphen. Es sei Grev der Graph, der aus dem gerichteten Graphen G durch Umkehrung der Kanten entsteht. Algorithmus 6.4 BFS-SCC Eingabe: Ein gerichteter Graph G = (V, E), der durch seine Adjazenzlisten beschrieben ist. Ausgabe: Die stark zusammenhängenden Komponenten von G. (0) markiere alle Knoten als unerreicht. while es gibt noch unerreichte Knoten do begin (1) wähle einen noch unerreichten Knoten v und führe BFS auf G mit Startknoten v aus (dies liefert alle von v aus erreichbaren Knoten) sowie (2) führe BFS auf Grev von v aus (dies liefert alle Knoten, von denen aus v in G erreicht wird). (3) die Menge der Knoten, die in (1) und (2) von v aus erreicht werden, ist die stark zusammenhängende Komponente, die v enthält. end Aufgabe: 1) Dies ist ein Linearzeitalgorithmus zur Entscheidung, ob G stark zusammenhängend ist. 2) Ist dies ein Linearzeitalgorithmus zur Bestimmung aller stark zusammenhängenden Komponenten? 15 6.3 Tiefensuche auf ungerichteten Graphen Die nachfolgende DFS-Numerierung t(v) der Knoten gibt den Beginn der jeweiligen Prozedur df s(v) an. Prozedur 6.3 dfs(v) (1) (2) (3) (4) (5) i := i + 1; t(v) := i; {v ist ”erreicht” und erhält die DFS-Nummer t(v) = i} while es existiert w ∈ N(v) mit t(w) = ∞ do begin N(v) := N(v) \ {w}; {Markierung in Adjazenzliste von v} B := B ∪ {(v, w)}; {damit ist auch stets t(v) < t(w) für (v, w) ∈ B} dfs(w); end Entsprechend der Wirkungsweise sich selbst rekursiv aufrufender Prozeduren gilt also: DFSEARCH(v) ist genau dann beendet, wenn für alle w ∈ N(v), für die beim Erreichen von v t(w) = ∞ war, DFSEARCH(w) beendet ist. Der gesamte Algorithmus DFS lautet wie folgt: Algorithmus 6.5 DFS(G) Eingabe: Ein ungerichteter Graph G = (V, E), der durch seine Adjazenzlisten beschrieben ist. Ausgabe: Eine Menge B von gerichteten Kanten mit der Eigenschaft, daß der B zugrundeliegende ungerichtete Graph für jede Zusammenhangskomponente von G ein Gerüst liefert, sowie eine Numerierung (t(v))v∈V , die die Durchlaufreihenfolge durch V bei DFS angibt. (1) (2) (3) B := ∅; i := 0; for all v ∈ V do t(v) := ∞; while es existiert v ∈ V mit t(v) = ∞ do dfs(v) Definition 6.1 Es sei G = (V, E) ungerichteter Graph. (1) Ein Knoten v ∈ V heißt Artikulationspunkt (cut vertex) in G, falls sich bei Wegnahme von v die Zahl der Zusammenhangskomponenten erhöht. (2) G heißt zweifach zusammenhängend (2-connected), falls G zusammenhängend ist und keine Artikulationspunkte enthält. (3) Maximale zweifach zusammenhängende Teilgraphen von G heißen zweifach zusammenhängende Komponenten von G. 16 Zu gegebenem zusammenhängenden ungerichteten Graphen G = (V, E) sei G′ = (V ′ , E ′ ) der folgende bipartite Graph: Die Knotenmenge von G′ besteht aus der Vereinigung der Menge der Artikulationspunkte einerseits sowie der Menge der zweifach zusammenhängenden Komponenten andererseits. Die Kantenmenge E ′ ist gegeben durch die Inzidenz der Artikulationspunkte in den zweifach zusammenhängenden Komponenten: vQ ∈ E ′ ⇐⇒ v ∈ Q für einen cut vertex v und eine zweifach zusammenhängende Komponente Q. Aufgabe: Zeigen Sie: G′ ist Baum. 17 7 7.1 Minimalgerüste und Greedy-Algorithmus Algorithmen zur Bestimmung von Minimalgerüsten In Definition 3.1 wurde bereits der Begriff des Gerüsts eines zusammenhängenden ungerichteten Graphen G = (V, E) definiert. Hat G zusätzlich eine Kosten- oder Längenfunktion c : E → R auf der Kantenmenge, so läßt sich wie folgt der Begriff des Minimalgerüsts definieren: Definition 7.1 G = (V, E) sei ein zusammenhängender Graph mit einer Kantengewichtsfunktion c : E → R. (1) Das Gewicht c(F ) einer Kantenmenge P F ⊆ E ist definiert als die Summe der Gewichte der Kanten aus F : c(F ) = e∈F c(e). Analog ist das Gewicht c(H) eines Gerüsts H = (V, F ) von G definiert als das Gewicht der Kantenmenge F von H : c(H) = c(F ). (2) Ein Gerüst H = (V, F ) von G heißt Minimalgerüst (minimum spanning tree) von (G, c), falls seine Kantenmenge unter allen Gerüsten von G kleinstes Gewicht hat: c(H) = min{c(H ′ ) | H ′ Gerüst von G}. Das nachfolgende Lemma ist die Grundlage der Algorithmen zur Bestimmung eines Minimalgerüsts. Es ermöglicht ein rein lokales Vorgehen. Lemma 7.1 G = (V, E) sei ein zusammenhängender ungerichteter endlicher Graph mit Kostenfunktion c : E → R. Es sei U ⊆ V und e0 ∈ E eine Kante zwischen U und V \ U mit minimalem Gewicht: c(e0 ) = min{c(e) | e ∈ E ∧ e ∩ U 6= ∅ ∧ e ∩ (V \ U) 6= ∅}. Dann existiert ein Minimalgerüst T von G, das die Kante e0 enthält. Die nachfolgenden drei Algorithmen sind jeweils effiziente Algorithmen zur Bestimmung eines Minimalgerüsts. Dabei konstruiert der Algorithmus 7.1, von einem Startknoten ausgehend, eine wachsende Folge von Teilgerüsten, bis alle Knoten erfaßt sind. Der Algorithmus 7.2 startet mit n Teilgerüsten, die jeweils nur einen Knoten enthalten, und verbindet in jedem Schritt mit der Wahl einer Kante gemäß Lemma 7.1 zwei bisherige Teilgerüste. Der Algorithmus 7.3 ermöglicht ein simultanes Vorgehen und eignet sich zur Implementation in einem parallelen Algorithmus. 18 Algorithmus 7.1 (Jarnik, Prim, Dijkstra) Eingabe: Ein endlicher ungerichteter zusammenhängender Graph G = (V, E) mit V = {1, . . . , n} und eine Kostenfunktion c : E → R mit c(i, j) = ∞ ⇐⇒ {i, j} ∈ / E. Ausgabe: Ein Minimalgerüst von G. (1) t := 1; B := ∅; U := {1}; (2) for all i, j ∈ V, i 6= j, do d(i, j) := c(i, j); (3) while U 6= V do begin (4) bestimme einen Knoten u ∈ V \ U mit d(t, u) = min{d(t, v) | v ∈ V \ U}; (5) bestimme eine Kante e = xu ∈ E mit c(e) = d(t, u) und x ∈ U; {da G zusammenhängend ist, ist d(t, u) endlich} (6) B := B ∪ {e}; (7) U := U ∪ {u}; (8) if U 6= V then (9) for all v ∈ V \ U do d(t, v) := min{d(t, v), d(u, v)}; {dies ist der Abstand von v zum nächstgelegenen Knoten aus U} {dabei steht t als ”Meta–Knoten” für ganz U} end Algorithmus 7.2 (Kruskal) Ein- und Ausgabe: Wie beim Algorithmus 7.1 (1) B := ∅; MS := ∅; {MS bezeichnet das Mengensystem der Knotenmengen der Teilgerüste} (2) for all v ∈ V do MS := MS ∪ {{v}}; {Hinzufügen von {v} zu MS} (3) while |MS| > 1 do begin (4) Wähle eine Kante vw minimaler Länge und streiche diese in der Liste der Kanten; (5) if v und w gehören zu verschiedenen Mengen W1 , W2 in MS then begin (6) MS := (MS \ {W1 , W2 }) ∪ {W1 ∪ W2 }; {damit nimmt |MS| um 1 ab} (7) B := B ∪ {vw} end end Wir definieren folgende lexikographische Ordnung für Kanten (Zur Erinnerung: Die Knotenmenge V ist jetzt die Menge {1, . . . , n}): Definition 7.2 Es seien {p, q}, {r, s} ∈ E mit p < q, r < s. Dann ist {p, q} < {r, s}, falls p < r oder (p = r und q < s) gilt. 19 Algorithmus 7.3 (Boruvka, Sollin) Ein- und Ausgabe: Wie beim Algorithmus 7.1 (1) B := ∅; z := 0; MS := ∅; {MS hat dieselbe Bedeutung wie beim Algorithmus 7.2} (2) for all v ∈ {1, . . . , n} do MS := MS ∪ {{v}}; (3) while z < n − 1 do begin (4) Wähle simultan für jeden Teilbaum Ti = (Vi , Bi ) mit Vi ∈ MS eine Kante minimaler Länge von Ti zu einem anderen Teilbaum Tj ; if es gibt mehrere Kanten gleicher Länge von Tj aus then (5) wähle die im Sinne der lexikographischen Ordnung kleinste Kante von Tj ; (6) Füge die simultan gewählten Kanten zu B hinzu; (7) Bilde die entsprechenden Vereinigungsmengen in MS analog zu (5),(6) in Algorithmus 7.2; (8) z := z+Zahl der simultan gewählten Kanten; end 20 7.2 Der Greedy-Algorithmus und Matroide Den Algorithmen 7.1, 7.2 und 7.3 ist gemeinsam, daß jeweils eine lokal beste Kante gewählt und zur bisherigen Kantenmenge hinzugefügt wird, falls dadurch kein Kreis entsteht. Im folgenden Algorithmus 7.4, dem sogenannten greedy-Algorithmus, wird die Eigenschaft der Kantenmengen, kreisfrei zu sein, verallgemeinert zu einem Mengensystem J , das zunächst lediglich die Eigenschaft ∅ ∈ J erfüllen muß. Die Mengen in J nennen wir auch unabhängige Mengen. Algorithmus 7.4 (greedy) Eine endliche Menge E und eine Kostenfunktion c : E → R sowie ein Mengensystem J ⊆ P(E) mit ∅ ∈ J . Ausgabe: Eine Menge I ∈ J . Eingabe: begin (1) I := ∅; (2) while E 6= ∅ do begin (3) wähle ein e ∈ E mit c(e) = max{c(e′ ) | e′ ∈ E}; (4) E := E \ {e}; (5) if I ∪ {e} ∈ J then I := I ∪ {e} end end Es sei c(I) = der Null. P e∈E c(e). R+ 0 bezeichne die positiven rationalen Zahlen einschließlich Definition 7.3 Der greedy–Algorithmus heißt optimal, falls für jede Kostenfunktion ′ ′ c : E → R+ 0 gilt: Die Ausgabemenge I ist maximal, d.h. c(I) = max{c(I ) | I ∈ J }. Im folgenden Begriff des Matroids wird die Eigenschaft von Kantenmengen, kreisfrei zu sein, verallgemeinert. Definition 7.4 Es sei E eine endliche Menge und J ⊆ P(E). Das Paar M = (E, J ) mit J 6= ∅ heißt Matroid, falls es die folgenden Eigenschaften erfüllt: (1) Für alle A ∈ J und B mit B ⊆ A gilt B ∈ J (d.h. J ist nach unten ⊆abgeschlossen). (2) Ist A ⊆ E und I, I ′ ∈ J sind inklusionsmaximale Mengen in A, so sind I und I ′ gleichgroß. 21 Man beachte, daß in (2) nicht A ∈ J verlangt wird. Formal bedeutet (2): Sind I, I ′ ∈ J mit I ⊆ A, I ′ ⊆ A und es existiert kein I ′′ ∈ J mit I ⊂ I ′′ ⊆ A, I ′′ 6= I, und es existiert kein I ′′ ∈ J mit I ′ ⊂ I ′′ ⊆ A, I ′′ 6= I ′ (d.h. I, I ′ sind ⊆–maximal in A bzgl. J ), so ist |I| = |I ′ | (d.h. I und I ′ haben dieselbe Zahl von Elementen). Satz 7.1 Es sei E eine endliche Menge und J ⊆ P(E) ein Mengensystem mit der Eigenschaft: J = 6 ∅ und J ist nach unten ⊆-abgeschlossen. Die folgenden Eigenschaften sind äquivalent: (1) Der greedy–Algorithmus ist optimal. (2) Sind Ip , Ip+1 ∈ J mit |Ip | = p und |Ip+1 | = p + 1, so existiert ein Element e ∈ Ip+1 \ Ip mit Ip ∪ {e} ∈ J (ein solches Element e heißt auch Austauschelement). (3) (E, J ) ist Matroid. Beweis. (1) =⇒ (2): Angenommen, (2) wäre nicht erfüllt, d.h. es existieren Ip , Ip+1 ∈ J mit der Eigenschaft: |Ip | = p, |Ip+1| = p + 1, und für kein e ∈ Ip+1 \ Ip ist Ip ∪ {e} ∈ J . Wir betrachten dann folgende Kostenfunktion auf E: p + 2 für e ∈ Ip p + 1 für e ∈ Ip+1 \ Ip c(e) = 0 für e ∈ / Ip ∪ Ip+1 Dann ist c(Ip ) = p(p + 2) = p2 + 2p und c(Ip+1 ) ≥ (p + 1)(p + 1) = p2 + 2p + 1. Damit ist also Ip nicht optimal. Im obigen Fall wählt der greedy–Algorithmus zuerst alle Elemente aus Ip , weil diese maximales Gewicht haben. Danach kann wegen der Annahme, daß (2) nicht erfüllt ist, der greedy–Algorithmus das Gesamtgewicht nicht mehr erhöhen, da für weitere Elemente x Ip ∪ {x} ∈ / J oder c(x) = 0 ist. Dies ist ein Widerspruch zur Optimalität des greedy–Algorithmus. (2) =⇒ (3): I, I ′ ∈ J seien zwei in A ⊆–maximale unabhängige Mengen. Angenommen, I und I ′ sind nicht gleichgroß – o.B.d.A. sei |I| < |I ′ |. Dann wählen wir eine Teilmenge I ′′ ⊆ I ′ mit |I ′′ | = |I| + 1. Wegen I ′ ∈ J ist auch I ′′ ∈ J . Wegen (2) existiert dann ein e ∈ I ′′ \ I mit I ∪ {e} ∈ J – ein Widerspruch dazu, daß I ∈ J ⊆–maximal in A war. (3) =⇒ (1): Angenommen, der greedy–Algorithmus ist nicht optimal für J und die Kostenfunktion c : E → R+ 0 , d.h. der greedy–Algorithmus liefert als Ausgabe I = {e1 , . . . , ei } , wobei ein I ′ = {e′1 , . . . , e′k } existiert, I ′ ∈ J , mit c(I ′ ) > c(I). Offenbar liefert der greedy–Algorithmus eine ⊆–maximale Menge I aus J . Außerdem läßt sich o.B.d.A. voraussetzen, daß auch I ′ eine ⊆–maximale Menge aus J ist. Also ist wegen (3) |I| = |I ′| erfüllt. Es sei |I| = |I ′ | = k, I = {e1 , . . . , ek }, I ′ = {e′1 , . . . , e′k }. Wir nehmen an, daß die Elemente von I bzw. I ′ nach fallendem Gewicht geordnet sind: c(e1 ) ≥ c(e2 ) ≥ . . . ≥ c(ek ) und c(e′1 ) ≥ c(e′2 ) ≥ . . . ≥ c(e′k ). Behauptung 7.1 Es gilt c(ei ) ≥ c(e′i ) für alle i ∈ {1, . . . , k}. 22 Induktiver Beweis der Behauptung 7.1: Induktionsanfang: i = 1. Offenbar ist c(e1 ) ≥ c(e′1 ), da der greedy–Algorithmus immer ein Element mit größtem Gewicht wählt. Induktionsannahme: Für alle i ∈ {1, . . . , l − 1} gelte c(ei ) ≥ c(e′i ) für ein l ∈ {2, . . . , k}. Induktionsschritt: Zu zeigen ist: c(el ) ≥ c(e′l ). Angenommen, es gilt c(el ) < c(e′l ). Wir setzen A := {e | e ∈ E und c(e) ≥ c(e′l )}. Wir behaupten, daß dann gilt: (∗) {e1 , . . . , el−1 } ⊆–maximal in A: Angenommen, (∗) gelte nicht, d.h., es existiert ein e ∈ E mit {e1 , . . . , el−1 , e} ⊆ A und {e1 , . . . , el−1 , e} ∈ J . Dann folgt c(e) ≤ c(el ), da der greedy–Algorithmus stets ein Element mit größtem Gewicht wählt. Nach der ersten Annahme gilt außerdem c(el ) < c(e′l ), also ist c(e) < c(e′l ) – Widerspruch zu e ∈ A. Damit ist die Behauptung (∗) erfüllt. Weiterhin gilt: {e′1 , . . . , e′l } ⊆ A und {e′1 , . . . , e′l } ∈ J . Nach der Matroideigenschaft müssen ⊆-maximale J -Mengen in A gleichgroß sein. Wegen (∗) ist L = {e1 , . . . , el−1 } eine solche Menge und hat l −1 Elemente. Da {e′1 , . . . , e′l } in einer ⊆–maximalen Menge L′ in A enthalten ist, die auch mindestens l Elemente hat, folgt l − 1 = |L| = |L′ | ≥ l - ein Widerspruch. q.e.d. 23 7.3 Das Steinerbaumproblem und andere Varianten des Minimalgerüstproblems Literatur: [M.R. Garey, D.S. Johnson, Computers and Intractability: A Guide to the Theory of NP-Completeness, W.H. Freeman, 1979] Beim Steinerbaumproblem werden im Graphen Zielknoten ausgewählt, die mit minimalen Kosten verbunden werden sollen. Von diesem Problem gibt es eine Reihe von Varianten. Definition 7.5 Es sei G = (V, E) ein zusammenhängender Graph und c : E → R eine Kostenfunktion sowie Z ⊆ V eine ausgezeichnete Menge von Knoten (die Zielknoten bzw. target vertices). Ein Baum T = (U, F ) mit U ⊆ V und F ⊆ E heißt Steinerbaum für die Zielknotenmenge Z, falls gilt: (1) Z ⊆ U (d.h. T verbindet die Zielknoten) und (2) T hat unter allen Teilgraphen von G, die Bäume sind und Z umfassen, minimales Gewicht. Formal bedeutet (2): c(H) = min{c(H ′ ) | H ′ = (U ′ , F ′), R ⊆ U ′ ⊆ V , F ′ ⊆ E und H ′ ist Baum}. Das Steinerbaumproblem in Graphen ist das folgende algorithmische Problem: Steiner Tree in Graphs [ND12]: Gegeben: Ein zusammenhängender Graph G = (V, E), eine Funktion c : E → Z + , eine Menge Z von Zielknoten und eine positive ganze Zahl k. Frage: Gibt es einen Teilbaum von G, der alle Knoten in Z verbindet und dessen Kosten ≤ k sind? Offenbar ist im Fall Z = V ein Steinerbaum für Z gerade ein Minimalgerüst. Schränkt man das Problem auf den Fall ungewichteter Graphen ein (d.h. c(e) = 1 für alle e ∈ E), so gibt es folgende zwei zum Steinerbaumproblem gehörende Entscheidungsprobleme: Im ersten geht es um die Anzahl k zusätzlicher Knoten, die durch Hinzunahme zu Z den Zusammenhang herstellen, im zweiten geht es um die Anzahl von Kanten, die den Zusammenhang von Z herstellen. Definition 7.6 (1) Steiner Tree(V ) := {(G, Z, k) | G = (V, E) ist zusammenhängender Graph und Z ⊆ V und k ∈ N und es existiert ein Steinerbaum H = (U, F ) für Z mit |U \ Z| ≤ k} (2) Steiner Tree(E) := {(G, Z, k) | G = (V, E) ist zusammenhängender Graph und Z ⊆ V und k ∈ N und es existiert ein Steinerbaum H = (U, F ) für Z mit |F | ≤ k} 24 Satz 7.2 Die Probleme Steiner Tree in Graphs, Steiner Tree(V ) und Steiner Tree(E) sind NP-vollständig. Auch die folgenden, in [M.R. Garey, D.S. Johnson, Computers and Intractability: A Guide to the Theory of NP-Completeness, W.H. Freeman, 1979] erwähnten Probleme sind NP-vollständig: Degree Constrained Spanning Tree [ND1]: Gegeben: Ein zusammenhängender Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es ein Gerüst von G, in dem kein Knoten einen Grad > k hat? Dieses Problem ist sogar für k = 2 NP-vollständig, weil das Problem Hamiltonpfad NP-vollständig ist, d.h. die Frage, ob ein gegebener Graph einen Pfad hat, der jeden Knoten genau einmal durchläuft. Maximum Leaf Spanning Tree [ND2]: Gegeben: Ein zusammenhängender Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es ein Gerüst von G mit mindestens k Blättern? 25 8 Maximalfluß Eine der interessantesten Anwendungen der Graphentheorie ist die Modellierung von Transportaufgaben in einem Netzwerk von Transportwegen (Transport von Flüssigkeiten, elektrischem Strom, von Waren, von Informationen in einem Kommunikationsnetzwerk usw.), wobei die Transportwege zwischen je zwei Knoten jeweils als gerichtete Kanten von beschränkter Durchlaßfähigkeit (die auch Kapazität genannt wird) beschrieben werden. Der jeweils in einer Kante fließende Fluß darf die Kapazität der Kante nicht übersteigen. Außerdem wird vorausgesetzt, daß bis auf zwei ausgezeichnete Knoten, welche die Quelle q und die Senke s heißen, für alle Knoten v gilt, daß die Summe der in sie hineinfließenden Flüsse gleich der Summe der aus ihnen herausfließenden Flüsse ist, d.h. die Knoten v geben tatsächlich genausoviel weiter, wie sie erhalten. Diese Eigenschaft nennt man die Flußerhaltungseigenschaft. Ziel ist die Bestimmung eines Flusses mit maximaler Summe der in s hineinfließenden Flüsse; dieses Problem heißt auch Maximalflußproblem. Damit ist dies ein algorithmisches Problem auf mehrfach kantengewichteten gerichteten Graphen. 8.1 Flüsse und Schnitte Definition 8.1 Es sei G = (V, E) gerichteter Graph. Für Knoten v ∈ V sei Ein (v) = {(u, v) | (u, v) ∈ E} die Menge der in v einlaufenden Kanten und Eout (v) = {(v, u) | (v, u) ∈ E} die Menge der von v ausgehenden Kanten. Definition 8.2 N = (G, q, s, c) heißt Netzwerk, falls gilt: (α) G = (V, E) ist gerichteter endlicher schlichter Graph. (β) q und s sind spezielle Knoten in V mit q 6= s (q heißt Quelle, s heißt Senke). (γ) c : E → R+ ist eine Kantengewichtsfunktion (die Kapazität c(e) von Kante e ∈ E) mit c(e) > 0 für alle e ∈ E. Definition 8.3 Es sei N = (G, q, s, c) ein Netzwerk. (1) Eine Funktion f : E → R+ heißt zulässiger Fluß auf N (oder kürzer: Fluß ), falls gilt: (F 1) Für alle e ∈ E ist 0 ≤ f (e) ≤ c(e). (F 2) Für alle v ∈ V \ {q, s} ist P P (δ) 0 = e∈Ein (v) f (e) − e∈Eout (v) f (e). 26 (2) Wir setzen f + (v) = f − (v) = P e∈Ein (v) f (e) und P e∈Eout (v) f (e). (3) Der Gesamtfluß F = F (f ) ist definiert durch (ε) F = f + (s) − f − (s) (4) Der Fluß f auf N heißt Maximalfluß auf N, falls der Gesamtfluß von f maximal ist, d.h. F (f ) = max{F (f ′ ) | f ′ Fluß auf N} gilt. Falls es keine von s ausgehenden Kanten in E gibt, ist f − (s) = 0, aber in Definition 8.2 wird nicht Eout (s) = ∅ verlangt. Definition 8.4 Das Maximalflußproblem ist die folgende (algorithmische) Aufgabe: Eingabe: Gesucht: Ein Netzwerk N. Ein Maximalfluß f auf N. Definition 8.5 Es sei S ⊆ V mit q ∈ S, s ∈ / S und S = V \ S. Wir definieren (1) (S; S) = {(x, y) : (x, y) ∈ E ∧ x ∈ S ∧ y ∈ S}, (2) (S; S) = {(x, y) : (x, y) ∈ E ∧ x ∈ S ∧ y ∈ S}. (3) Der durch S definierte Schnitt ist die Kantenmenge (S; S) ∪ (S; S). Im weiteren wird oft auch von S selbst als Schnitt gesprochen, wobei der durch S definierte Schnitt gemeint ist. Das folgende Lemma zeigt: Der Gesamtfluß F (f ) läßt sich nicht nur an der Senke s, sondern auch an jedem Schnitt S messen als die folgende Differenz von Summen von Flüssen. Lemma 8.1 Für jedes S ⊆ V mit q ∈ S, s ∈ / S gilt X e∈(S;S) f (e) − X f (e) = F (f ). e∈(S;S) Beweis. WirP summieren (ε) mit den Gleichungen (δ) für alle v ∈ S \ {s}. Damit ergibt sich F (f ) = v∈S (f + (v) − f − (v)). Es sei nun e = (x, y) eine Kante. Für e ergibt sich folgende Fallunterscheidung: 1. Fall: Ist x, y ∈ S, so kommt f (e) auf der rechten Seite nicht vor. 2. Fall: Ist x, y ∈ S, so kommt f (e) rechts einmal mit dem Vorzeichen ”+” vor (als einlaufende Kante zu y) und einmal mit dem Vorzeichen ”−” vor (als auslaufende 27 Kante zu x), die Summe ist also 0. 3. Fall: Ist x ∈ S, y ∈ S, so kommt f (e) einmal mit dem Vorzeichen ”+” vor als einlaufende Kante zu y. (Ist dabei y = s, so kommt f (e) in (ε) vor, ist y 6= s, so kommt f (e) in (δ) vor.) 4. Fall: Ist x ∈ S, y ∈ S, so kommt f (e) einmal mit dem Vorzeichen ”−” vor als auslaufende Kante zu x. (Ist x = s, so kommt f (e) in (ε) vor, ist x 6= s, so kommt f (e) in (δ) vor.) Damit gilt Lemma 8.1. q.e.d. Definition 8.6 Die Kapazität c(S) eines durch S bestimmten Schnittes ist c(S) = P e∈(S;S) c(e). Offenbar gilt stets F ≤ c(S), denn F = X e∈(S;S) f (e) − X f (e) ≤ e∈(S;S) X e∈(S;S) f (e) ≤ X c(e). e∈(S;S) Das heißt insbesondere (ζ) max{F (f ) | f Fluß auf N} ≤ min{c(S) | S ⊆ V und q ∈ S und s ∈ / S}. Tritt hierbei Gleichheit ein, so ist offenbar F maximal (und c(S) minimal). Algorithmen zur Bestimmung des Maximalflusses beruhen darauf, daß bei (ζ) tatsächlich Gleichheit eintritt (diese Gleichheit ist unter dem Namen max-flow-min-cut theorem bekannt geworden und wird als Satz 8.2 formuliert und bewiesen). 28 8.2 Der Algorithmus von Ford/Fulkerson Definition 8.7 Es sei P = (e1 , . . . , ek ) mit ei ∈ E, i ∈ {1, . . . , k}, eine Kantenfolge im gerichteten Graphen G, deren zugrundeliegende ungerichtete Kantenfolge P ′ = (e′1 , . . . , e′k ) ein einfacher Weg zwischen Quelle q und Senke s ist (d.h. die gerichteten Kanten können im Weg P ′ in Richtung von q nach s oder in Richtung von s nach q gerichtet sein). Es sei also e′1 e′2 e′k−1 e′k P ′ = x0 — x1 — . . . — xk−1 — xk mit x0 = q und xk = s. (1) Eine Kante xi−1 → xi heißt Vorwärtskante in P und (2) eine Kante xi−1 ← xi heißt Rückwärtskante in P . Im weiteren bezeichnen wir auch Kantenfolgen wie in Definition 8.7 als Wege. Eine Vorwärtskante zeigt also in P in Richtung von q nach s, und eine Rückwärtskante zeigt in P in Richtung von s nach q. Eine Kante e kann in Bezug auf einen Weg P1 Vorwärtsund in Bezug auf einen anderen Weg P2 Rückwärtskante sein. Definition 8.8 Es sei P = (e1 , . . . , ek ) eine Kantenfolge wie in Definition 8.7 und f eine Flußfunktion auf N. (1) Der Nutzen der Kante ei sei ∆(ei ) := c(ei ) − f (ei ) f (ei ) falls ei Vorwärtskante in P ist falls ei Rückwärtskante in P ist (2) Eine Kante ei in P heißt nützlich in P , falls ∆(ei ) > 0 ist. (3) Ein Weg P heißt flußvergrößernder Weg, falls alle seine Kanten nützlich sind, d.h. ∆(P ) := min{∆(ei ) | ei Kante in P , i ∈ {1, . . . , k}} > 0. Mit Hilfe eines flußvergrößernden Weges P läßt sich folgende neue Flußfunktion f ′ zu f definieren, deren Gesamtfluß F (f ′) größer als F (f ) ist: Definition 8.9 f (e) + ∆(P ) ′ f (e) − ∆(P ) f (e) := f (e) falls e Vorwärtskante in P ist falls e Rückwärtskante in P ist falls e nicht in P vorkommt Lemma 8.2 Die so definierte Funktion f ′ ist zulässige Flußfunktion auf N mit Gesamtfluß F (f ′) = F (f ) + ∆(P ). 29 Beweis. Im folgenden setzen wir ∆ = ∆(P ). Offenbar ist für alle Kanten e ∈ E 0 ≤ f ′ (e) ≤ c(e) erfüllt. Eigenschaft (F2) eines zulässigen Flusses ist ebenfalls erfüllt, da f nur entlang des Weges P verändert wird: Ist x ein Knoten im Weg P , so können nur folgende vier Fälle eintreten: e e 1 2 (1) . . . −→ x −→ . . ., e1 , e2 Vorwärtskanten. Dann ist f ′+ (x) = f + (x) + ∆ und f ′− (x) = f − (x) + ∆, also f ′+ (x) − f ′− (x) = 0. e e 1 2 (2) . . . ←− x ←− . . ., e1 , e2 Rückwärtskanten. Dann ist f ′+ (x) = f + (x) − ∆ und f ′− (x) = f − (x) − ∆. e e 1 2 (3) . . . −→ x ←− . . ., e1 Vorwärtskante, e2 Rückwärtskante. Dann ist f ′− (x) = f − (x) und f ′+ (x) = f + (x) + ∆ − ∆. e e 1 2 (4) . . . ←− x −→ . . . , e1 Rückwärtskante, e2 Vorwärtskante. Dann ist f ′+ (x) = f + (x) und f ′− (x) = f − (x) − ∆ + ∆. In jedem Fall gilt also (F2) für f ′ . Offenbar gilt für die Gesamtflüsse: F (f ′ ) = F (f )+∆. q.e.d. Algorithmus 8.1 (Ford, Fulkerson) Eingabe: Ein Netzwerk N = (G, q, s, c) Ausgabe: Ein Maximalfluß f . (1) for all e ∈ E do f (e) := 0; (2) while es existiert ein flußvergrößernder Weg P do begin (3) konstruiere einen flußvergrößernden Weg P ; (4) bilde zu f und P die Flußfunktion f ′ wie in Definition 8.9; (5) setze f := f ′ ; end Satz 8.1 Falls der Algorithmus 8.1 anhält, ist f ein Maximalfluß. Beweis. Der Algorithmus hält genau dann, wenn es keinen flußvergrößernden Weg in N mit Flußfunktion f mehr gibt. Es sei S die Menge der Knoten x, die von q aus über eine (möglicherweise leere) Folge von nützlichen Kanten erreichbar ist (d.h. also über Kanten e = u → v mit f (e) < c(e) bzw. über Kanten e = u ← v mit f (e) > 0). Nach Definition von S ist q ∈ S. Da es keinen flußvergrößernden Weg zu N und f gibt, ist s ∈ / S. Also definiert S einen Schnitt: Ist e = (u, v) ∈ (S; S), so ist f (e) = c(e), ist 30 e = (v, u) ∈ (S; S), so ist f (e) = 0, andernfalls wäre auch v ∈ S. Da nach Lemma 8.1 für jeden Schnitt S X f (e) − e∈(S;S) X f (e) = F (f ) e∈(S;S) gilt, ist somit F (f ) = X c(e) − 0 = c(S). e∈(S;S) Damit wird in der Ungleichung F (f ) ≤ c(S) Gleichheit erreicht, und somit ist f Maximalfluß. q.e.d. Satz 8.2 (max–flow–min–cut theorem) In Netzwerken mit ganzzahligen Kapazitäten ist der maximale Gesamtfluß F ganzzahlig und wird nach endlich vielen Schritten in Algorithmus 8.1 durch F = c(S) für eine Schnittmenge S erreicht. Beweis. Der Anfangsfluß ist f (e) = 0 für alle e ∈ E. Ist P ein flußvergrößernder Weg, so ist wegen der ganzzahligen Kapazitäten c(ei ) für jede Kante ei aus P auch ∆(ei ) aus Definition 8.8 ganzzahlig, und damit bleiben auch die Flüsse auf den Kanten sowie der Gesamtfluß ganzzahlig. Da der maximale Gesamtfluß auch ganzzahlig ist (er ist z.B. durch die Kapazität irgendeines Schnittes beschränkt) und durch endlichmalige ganzzahlige Erhöhung eines Gesamtflusses entsteht, bricht Algorithmus 8.1 nach endlich vielen Schritten ab. q.e.d. Für beliebige Kapazitäten gilt der obige Satz nicht. Tatsächlich haben Ford und Fulkerson Beispiele mit irrationalen Kapazitäten konstruiert, für die der Algorithmus nicht hält. Daß im Fall ganzzahliger Kapazitäten Algorithmus 8.1 nach endlich vielen Schritten abbricht, besagt noch nichts über die Zeitschranke des Algorithmus. Diese kann in der Tat sehr schlecht sein, wenn die flußvergrößernden Wege ungeschickt gewählt werden. 31 8.3 Der Algorithmus von Dinitz Wir beschreiben in diesem Abschnitt einen einfachen, von Dinitz stammenden Polynomialzeitalgorithmus zur Lösung des Maximalflußproblems, der auf der folgenden Idee beruht: Es werden wiederholt flußvergrößernde Wege kürzester Länge bestimmt, und zwar jeweils in einem dafür konstruierten, noch zu definierenden, Schichtennetzwerk. Ist der Fluß in einem solchen Netzwerk jeweils gesättigt, so versucht der Algorithmus von Dinitz ein neues solches Netzwerk zu konstruieren, das dann flußvergrößernde Wege größerer Länge liefert, bis Maximalfluß erreicht ist. Der Algorithmus von Dinitz arbeitet in drei Phasen. Grundlage dieses Vorgehens ist BFS in Phase 1 sowie DFS in Phase 2. Phase 1: Algorithmus 8.2 (Konstruktion der Schichten V0 , . . . , Vl des Netzwerkes Ñ) Eingabe: Ein Netzwerk N = (G, q, s, c) mit Flußfunktion f Ausgabe: V0 , . . . , Vl – die Schichten von Ñ (Das vollständige Netzwerk Ñ wird im Anschluß an den Algorithmus definiert.) (1) V0 := {q}; i := 0; (2) repeat S (3) T := {v : v ∈ / j≤i Vj und es existiert ein y ∈ Vi mit (e = (y, v) ∈ E ∧ f (e) < c(e)) {nützliche Vorwärtskante} oder (e = (v, y) ∈ E ∧ f (e) > 0)}; {nützliche Rückwärtskante} (4) if s ∈ T then begin (5) l := i + 1; Vl := {s} end else begin (6) Vi+1 := T ; i := i + 1 end (7) until (T = ∅) or (s ∈ T ); Definition 8.10 Es seien V0 , . . . , Vl die durch Algorithmus 8.2 definierten Schichten und für alle i ∈ {1, . . . , l} Ei = {e | e ∈ E und e ist nützliche (Vorwärts– oder Rückwärts–) Kante von Vi−1 nach Vi }. 32 Weiterhin sei Ẽi folgende Kantenmenge: {(x, y) | x ∈ Vi−1 ∧ y ∈ Vi ∧ (x, y) nützliche Vorwärtskante in Ei } ∪ {(x, y) | x ∈ Vi−1 ∧ y ∈ Vi ∧ (y, x) nützliche Rückwärtskante in Ei } Ẽi = (d.h. in Ẽi haben die Kanten aus Ei jetzt alle die Richtung von Vi−1 nach Vi , auch wenn sie vorher umgekehrte Richtung hatten). Wir setzen Ẽ = Sl i=1 Ẽi . Außerdem sei c̃(e) = c(e) − f (e) falls e nützliche Vorwärtskante in N ist f (e) falls e nützliche Rückwärtskante in N ist Das Netzwerk Ñ = ((V, Ẽ), q, s, c̃) mit V = V0 ∪ . . . ∪ Vl und {s} = Vl heißt Schichtennetzwerk (”layered network”) mit den Schichten V0 , . . . , Vl . Die Tiefe des Netzwerks Ñ ist l. Im Algorithmus 8.2 werden also Schicht für Schicht nützliche Kanten bestimmt, bis T = ∅ ist (der Algorithmus bricht erfolglos ab) oder s ∈ T erreicht ist (der Algorithmus hat ein neues Schichtennetzwerk gefunden). Endet der Algorithmus mit s ∈ T , so besteht die Möglichkeit, den Gesamtfluß weiter zu erhöhen. Der Zeitaufwand von Algorithmus 8.2 ist O(|V | + |E|), da der Algorithmus eine Modifikation von Breitensuche (BFS) ist, bei der lediglich der Test auf Nützlichkeit der Kanten hinzukommt. Lemma 8.3 Endet Algorithmus 8.2 mit T = ∅, so ist der gegenwärtige Gesamtfluß F (f ) maximal. Beweis: Es seien V0 , . . . , Vi alle Schichten des Netzwerks. Setze S = V0 ∪ . . . . ∪ Vi . Dann ist q ∈ S, s ∈ / S, und es gilt: Für jede Kante e = (u, v) in (S; S) ist f (e) = c(e), und für jede Kante e = (v, u) in (S; S) ist f (e) = 0. Nach Lemma 8.1 ist dann F = X e∈(S;S) f (e) − X f (e) = e∈(S;S) X c(e) − 0 = c(S). e∈(S;S) Also ist F maximal. q.e.d. Definition 8.11 Die Flußfunktion f˜ im Schichtennetzwerk Ñ heißt wegsättigend (”blocking”) gdw. 33 für alle Wege P von q nach s in Ñ gibt es eine Kante e mit f˜(e) = c̃(e) (d.h. entlang des Weges P kann keine Flußvergrößerung mehr erfolgen). Die Idee des Algorithmus von Dinitz ist die folgende: Im Schichtennetzwerk Ñ wird eine wegsättigende Flußfunktion f˜ bestimmt und zum bisherigen Fluß f addiert, falls dieser nicht maximalen Gesamtfluß hatte. Dieser Schritt wird solange wiederholt, bis man bei Algorithmus 8.2 T = ∅ erreicht. Die Zahl der Iterationen ist dabei durch |V | beschränkt, da man zeigen kann, daß bei jeder Iteration die Tiefe (d.h. die maximale Weglänge) des Schichtennetzwerks um mindestens 1 wächst (und höchstens |V | werden kann). 34 Phase 2: Der nachfolgende Algorithmus verwendet Kantenmarkierungen ”frei” und ”blockiert” (im Sinne von ”nicht frei”). Algorithmus 8.3 (Bestimmung eines wegsättigenden Flusses f˜ zu Ñ) Eingabe: Ein Schichtennetzwerk Ñ = (G̃, q, s, c̃), G̃ = ((V0 , . . . , Vl ), Ẽ), mit c̃(e) > 0 für alle e ∈ Ẽ. Ausgabe: Ein wegsättigender Fluß f˜ auf Ñ. (1) for all e ∈ Ẽ do begin markiere e ”frei”; f˜(e) := 0 end; (2) repeat (3) v := q; K := ∅; {K ist ein Kellerspeicher (stack)} (4) repeat (5) while es existiert freie Kante v → u do (6) begin speichere v → u in K ein; setze v := u end; (7) if v = s then el−1 el e1 e2 {die Kanten in K bilden flußvergrößernden Weg q −→ v1 −→ s} . . . −→ vl−1 −→ begin (8) ∆ := min{c̃(ei ) − f˜(ei ) : 1 ≤ i ≤ l}; (9) for all i mit 1 ≤ i ≤ l do begin (10) f˜(ei ) := f˜(ei ) + ∆; (11) if f˜(ei ) = c̃(ei ) then markiere ei als ”blockiert”; {dabei wird für jeden solchen Weg mindestens eine Kante blockiert} end end (12) else {es existiert keine freie Kante von v 6= s aus, d.h. v ist Ende einer Sackgasse} (13) begin lösche oberste Kante e = u → v aus K; markiere e ”blockiert”; setze v := u; {backtracking um eine Kante} end (14) until (v = q) or (v = s); (15) until (v = q) and (alle Kanten von q aus sind blockiert) 35 Phase 3 (Flußvergrößerung): Algorithmus 8.4 Eingabe: Bisherige Flußfunktion f auf N, wegsättigende Flußfunktion f˜ auf Ñ Ausgabe: Flußfunktion f ′ auf N for all Kanten e in N do begin (1) if e = u → v Kante in Ñ mit u ∈ Vj−1 , v ∈ Vj then f ′ (e) := f (e) + f˜(e); (2) if e = u → v Kante in Ñ mit u ∈ Vj , v ∈ Vj−1 then f ′ (e) := f (e) − f˜(e); (3) if e = u → v keine Kante in Ñ then f ′ (e) := f (e) end; Algorithmus 8.5 (Dinitz) Eingabe: Ein Netzwerk N = (G, q, s, c) mit G = (V, E) Ausgabe: Ein Maximalfluß f (1) (2) (2.1) (2.2) (2.3) (2.4) for all e ∈ E do f (e) := 0; repeat führe Algorithmus 8.2 aus; führe Algorithmus 8.3 aus; führe Algorithmus 8.4 aus mit Ausgabe f ′ ; setze f := f ′ ; until T = ∅ in Algorithmus 8.2 Lemma 8.4 Endet Algorithmus 8.2 mit T = ∅, so ist der gegenwärtige Gesamtfluß F (f ) maximal. Lemma 8.5 Es seien lk , lk+1 die Tiefen (d.h. die maximalen Weglängen) zweier in Algorithmus 8.5, (2.1) aufeinanderfolgender Schichtennetzwerke Nk , Nk+1 . Ist Nk+1 nicht das letzte Schichtennetzwerk in der Ausführung von Algorithmus 8.5, so ist lk+1 > lk . Folgerung 8.1 Algorithmus 8.5 ist in Zeit O(|V |2 · |E|) ausführbar. 36 9 9.1 Unabhängige Knoten- und Kantenmengen Die Probleme Vertex Cover, Maximum Independent Set und Maximum Clique In Konfliktgraphen, in denen Kanten zwischen Knoten existieren, die um gemeinsame Ressourcen konkurrieren, ist es wichtig, konfliktfreie Knotenmengen zu betrachten. Diese heißen in der folgenden Definition unabhängige Knotenmengen. Definition 9.1 Es sei G = (V, E) endlicher ungerichteter Graph. (1) Eine Knotenmenge U ⊆ V heißt unabhängige Knotenmenge, wenn für alle x, y ∈ U xy ∈ / E gilt. Es bezeichne α(G) die maximale Größe einer unabhängigen Knotenmenge in G. (2) Analog heißt eine Knotenmenge Clique in G, falls sie im Komplementgraphen G unabhängige Knotenmenge ist. Es bezeichne ω(G) die maximale Größe einer Clique in G. (3) Eine Knotenmenge U ⊆ V heißt Knotenüberdeckung (vertex cover, Überdeckung aller Kanten durch Knoten), wenn für alle Kanten e ∈ E gilt: e ∩ U 6= ∅. Es bezeichne β(G) die kleinste Größe einer Knotenüberdeckung von G. Das Problem, ein möglichst kleines vertex cover eines Graphen zu bestimmen, ist eines der wichtigsten Graphenprobleme. Um dies zu illustrieren, geben wir folgendes Beispiel an: Die Matrix in Abbildung 1 zeigt mit dem Symbol ? markierte Zellen, die fehlerhaft sind und durch Austausch von (möglichst wenigen) ganzen Zeilen oder Spalten repariert werden sollen. Die fehlerhaften Zellen werden in Abbildung 1 durch Kanten in einem (bipartiten) Graphen B = (X, Y, E) dargestellt mit den Knotenmengen X = {x1 , x3 , x4 , x7 } (für 1 2 3 4 5 6 7 1 2 ? 3 4 ? 5 6 7 8 9 ? x1 x3 ? ? ? ? x4 x7 ? ? y1 y2 y4 y7 y9 Abbildung 1: Ein reconfigurable array mit fehlerhaften Zellen und der dazugehörige bipartite Graph. 37 die Zeilen, die eine fehlerhafte Zelle enthalten) sowie Y = {y1 , y2 , y4, y7 , y9 } (für die Spalten, die eine fehlerhafte Zelle enthalten). Es ist xi yj ∈ E genau dann, wenn die Zelle in Zeile i und Spalte j fehlerhaft ist; so ist z.B. x1 y4 ∈ E. Das Problem der Überdeckung aller fehlerhaften Zellen durch Zeilen bzw. Spalten entspricht also genau dem Problem, ein vertex cover in B zu bestimmen; z.B. ist x4 , y1 , y4 , y9 ein vertex cover, dargestellt durch die eingekreisten Knoten in Abbildung 1. Eigenschaft 9.1 Es sei G = (V, E) ungerichteter endlicher Graph. Dann gilt: S ⊆ V ist genau dann unabhängige Knotenmenge, wenn V \ S Knotenüberdeckung ist. Beweis. Ist S unabhängig, so gilt für jede Kante e = uv ∈ E für die Knoten u ∈ V \ S oder v ∈ V \ S, d.h. V \ S ist Knotenüberdeckung und umgekehrt. q.e.d. Es ist also α(G) = ω(G) und α(G) + β(G) = |V |. Dies zeigt, wie eng alle drei Begriffe zusammenhängen. Leider sind die folgenden Probleme NP-vollständig: Vertex Cover [GT1]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es eine Knotenüberdeckung von G mit ≤ k Knoten? Maximum Independent Set [GT20]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es eine unabhängige Knotenmenge von G mit ≥ k Knoten? Maximum Clique [GT19]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Gibt es eine Clique von G mit ≥ k Knoten? Literatur: [M.R. Garey, D.S. Johnson, Computers and Intractability. A Guide to the Theory of NP-Completeness. Freeman 1979] Satz 9.1 VERTEX COVER ist NP-vollständig. Beweis. Daß VERTEX COVER in NP liegt, läßt sich leicht zeigen, indem in nichtdeterministischer Polynomialzeit eine Teilmenge V ′ ⊆ V mit |V ′ | ≤ k “geraten” wird und anschließend in (deterministischer) Polynomialzeit geprüft wird, ob die geratene Menge V ′ eine Knotenüberdeckung von G darstellt. Es existiert genau dann ein erfolgreicher Berechnungsweg, wenn der Graph eine Knotenüberdeckung V ′ mit |V ′ | ≤ k besitzt. Wir zeigen nun: 3SAT ≤p VERTEX COVER: Es sei F = C1 ∧ . . . ∧ Cm eine KNF mit den Variablen x1 , . . . , xn und höchstens 3 Literalen pro Klausel: O.B.d.A. enthalte jede Klausel genau drei Literale – ist dies nicht der Fall, so lassen sich die Klauseln in aussagenlogisch äquivalenter Weise leicht auf diese Zahl erweitern. Wir konstruieren einen Graphen GF = (V, E) wie folgt: 38 x1 a1 -x1 x2 b1 -x2 c1 x3 a2 -x3 b2 x4 c2 -x4 Abbildung 2: Der Graph GF für die Formel F = (x1 ∨ ¬x3 ∨ ¬x4 ) ∧ (¬x1 ∨ x2 ∨ ¬x4 ). (1) Für jede Variable xi , i ∈ {1, . . . , n}, enthält GF eine Kante {xi , −xi }. (2) Für jede Klausel Cj , j ∈ {1, . . . , m}, enthält GF ein Dreieck mit den Knoten aj , bj , cj . (3) Die Knoten aj , bj , cj werden jeweils durch eine Kante mit den jeweiligen Literalknoten von Cj verbunden, und zwar aj mit dem ersten, bj mit dem zweiten und cj mit dem dritten Literalknoten von Cj . Diese Kanten heißen Verbindungskanten. Ein Beispiel ist in Abbildung 2 gegeben. Behauptung: F ist genau dann erfüllbar, wenn der Graph GF ein vertex cover mit n + 2m Knoten hat. a) Falls V ′ Knotenüberdeckung von GF ist, enthält V ′ von jeder Kante {xi , −xi } mindestens einen Knoten, d.h. mindestens n solche Knoten, und von jedem Dreieck mit den Knoten aj , bj , cj mindestens 2 Knoten, d.h. mindestens 2m solche Knoten. Jede Knotenüberdeckung von GF hat also mindestens n + 2m Knoten. b) Ist b eine erfüllende Belegung von F , so wähle für ein vertex cover bei den Kanten {xi , −xi } diejenigen Knoten, die erfüllten Literalen entsprechen. Diese überdecken gewisse Verbindungskanten mit. Es sind also nur noch jeweils zwei Knoten in jedem der m Dreiecke geeignet zu wählen, um alle Kanten zu überdecken. c) Existiert eine Knotenüberdeckung V ′ mit n + 2m Knoten, so setze b(xi ) = 1 genau dann, wenn xi ∈ V ′ ist. Da V ′ Knotenüberdeckung ist, also die Verbindungskanten mit überdeckt, aber aus jedem Sunter (2) definierten Dreieck nur 2 Knoten enthält, überdeckt ein Knoten aus V ′ ∩ ni=1 {xi , −xi } jeweils eine Verbindungskante mit, d.h. Cj wird bei b erfüllt, j ∈ {1, . . . , m}. Also ist b eine erfüllende Belegung von F . q.e.d. 39 Die NP-Vollständigkeit von VERTEX COVER bedeutet nicht, daß das oben beschriebene Problem der Fehlerkorrektur bei reconfigurable arrays auch NP-vollständig ist: Aus dem nachfolgenden Satz 9.3 von D. König folgt, daß das VERTEX COVER Problem auf bipartiten Graphen (als eine Anwendung von Maximalflußalgorithmen) in Polynomialzeit lösbar ist. 9.2 Maximum Matching: Paarungen und ihre Bestimmung in paaren Graphen Definition 9.2 Es sei G = (V, E) ungerichteter Graph. (1) Eine Kantenmenge E ′ ⊆ E heißt Paarung bzw. Zuordnung (unabhängige Kantenmenge, matching) in G, falls gilt: für alle e, e′ ∈ E ′ mit e 6= e′ gilt e ∩ e′ = ∅ (d.h. je zwei verschiedene Kanten aus E ′ haben keinen Knoten gemeinsam). (2) Wir setzen αE (G) = max{|E ′ | : E ′ Zuordnung in G}. (3) Eine Zuordnung E ′ in G heißt vollständige Zuordnung (perfect matching) in G, falls gilt: |E ′ | = |V2 | (d.h. für alle v ∈ V existiert ein e ∈ E ′ mit v ∈ e). (4) Eine Zuordnung E ′ in G heißt größte Zuordnung (maximum matching) in G, falls gilt: |E ′ | = αE (G). (5) Das Zuordnungsproblem (maximum matching problem) für G ist die Bestimmung einer größten Zuordnung in G. Das Zuordnungsproblem in paaren Graphen wird auch als Heiratsproblem bezeichnet. Wir zeigen nun im folgenden, daß das Zuordnungsproblem für paare Graphen B = (X, Y, E) auf das Maximalflußproblem zurückführbar ist. Dazu wird folgendes Netzwerk N = N(B) konstruiert: N = (V̂ , Ê, q, s, c) mit q, s ∈ / X ∪Y V̂ = {q, s} ∪ X ∪ Y Ê = {(q, x) | x ∈ X} ∪ {(y, s) | y ∈ Y } ∪ {(x, y) | xy ∈ E ∧ x ∈ X ∧ y ∈ Y } c(e) = 1 für alle e ∈ E. Satz 9.2 Es sei F der Maximalfluß in N(B). Dann ist αE (B) = F . Beweis. Es sei M eine Zuordnung maximaler Größe in B. Für jede Kante x → y, x ∈ X, y ∈ Y , mit xy ∈ M setze den Fluß auf dieser Kante gleich 1. Gleichzeitig wird der Fluß auf q → x und y → s gleich 1 gesetzt. Auf den restlichen Kanten e ist f (e) = 0. Offenbar definiert dies eine zulässige Flußfunktion, deren Gesamtfluß gleich αE (B) ist. Also ist F ≥ αE (B). 40 Für die Umkehrung setzen wir o.B.d.A. voraus, daß F ganzzahlig ist – sind die Kapazitäten ganzzahlig, so ist es auch F . Also haben F Kanten von Knoten aus Y nach s den Fluß 1. Da für y ∈ Y outdeg(y) = 1 ist, existiert nur jeweils eine Kante nach y mit Fluß 1. Wir setzen nun M = {xy | der Fluß von x nach y ist 1 }. Für x ∈ X ist indeg(x) = 1, also hat nur jeweils eine von x ausgehende Kante den Fluß 1. Damit ist M eine Zuordnung mit |M| = F , d.h. αE (B) = F . q.e.d. Folgerung 9.1 Das Zuordnungsproblem für paare Graphen B = (X, Y, E) läßt sich in O((|X| + |Y |) · |E|) Schritten lösen. Beweis. Das Netzwerk N(B) für paare Graphen B ist von der oben beschriebenen speziellen Form. Insbesondere ist c(e) = 1 für alle e ∈ E, was zur Folge hat, daß im Algorithmus von Dinitz in flußvergrößernden Wegen jeweils nicht nur eine, sondern alle Kanten des Weges blockiert werden. Also braucht man für die Ausführung des Algorithmus 8.3 nur O(|E|) (statt O(|V | · |E|)) Schritte, also insgesamt nur O(|V | · |E|) (statt O(|V |2 · |E|)) Schritte. q.e.d. Satz 9.3 (Satz von König) Für paare Graphen B = (X, Y, E) gilt αE (B) = βV (B), d.h. die Maximalgröße einer Zuordnung ist gleich der Minimalgröße einer Knotenüberdeckung. Beweis. 1. Wir zeigen zunächst αE (B) ≤ βV (B): Es sei E ′ ⊆ E eine Zuordnung in B. Für jede Knotenüberdeckung V ′ von B gilt dann |V ′ | ≥ |E ′ |, da V ′ von jeder Kante e ∈ E ′ mindestens einen Knoten enthalten muß. Also ist αE (B) ≤ βV (B). 2. Nun zeigen wir αE (B) ≥ βV (B): Nach Satz 9.2 ist αE (B) = F für einen Maximalfluß F in N(B) (zur Erinnerung: Alle Kanten in N(B) haben Kapazität 1), und nach dem max–flow–min–cut theorem (Satz 8.2) ist F = min{c(S) | S definiert einen Schnitt von N(B)}. Es sei nun S ein minimaler Schnitt, d.h. c(S) = F = αE (B). Wegen indeg(x) = 1 für x ∈ X, outdeg(y) = 1 für y ∈ Y sind o.B.d.A. Kanten e ∈ (S; S) von der Form e = (q, x) für ein x ∈ X oder e = (y, s) für ein y ∈ Y : Im Falle e = (x, y) ∈ (S; S) ∩ (X × Y ) ließe sich durch S ′ = S \ {x}, S ′ = S ∪ {x} ein neuer Schnitt definieren, der nicht mehr Kanten enthält als (S; S): c(S ′ ) ≤ c(S). Wir setzen nun V ′ := (S ∩Y )∪(S ∩X). Angenommen, V ′ ist keine Knotenüberdeckung. Dann ist für ein e = {x, y} ∈ E mit x ∈ X, y ∈ Y y ∈ / S und x ∈ / S, d.h. x ∈ S, y ∈ S, 41 d.h. (S; S) enthält entgegen der Annahme doch eine Kante (x, y) – Widerspruch. Also ist V ′ Knotenüberdeckung und βV (B) ≤ |V ′ | = c(S) = F = αE (B). q.e.d. 9.3 Knotenfärbungen von Graphen Es sei G = (V, E) ein endlicher ungerichteter Graph. Eine Zerlegung der Knotenmenge V in unabhängige Mengen V1 , . . . , Vk heißt zulässige k-Färbung von G. Die chromatische Zahl χ(G) von G ist das kleinste k, für das G eine zulässige k-Färbung hat. Offenbar ist G genau dann bipartit, wenn χ(G) ≤ 2 ist. Dies ist leicht zu entscheiden. Viel schwieriger ist die Frage, ob ein gegebener Graph 3-färbbar ist. Das Entscheidungsproblem Graph k-Colorability wird wie folgt definiert: Graph k-Colorability (Chromatic Number) [GT4]: Gegeben: Ein Graph G = (V, E) und eine positive ganze Zahl k. Frage: Ist χ(G) ≤ k? Der Spezialfall k = 3 liefert folgendes Entscheidungsproblem: Graph 3-Colorability Gegeben: Ein Graph G = (V, E). Frage: Ist χ(G) ≤ 3? Satz 9.4 Das Problem der 3-Färbbarkeit von Graphen ist NP-vollständig. Beweis: Das 3-Färbbarkeitsproblem ist offenbar in NP. Nun reduzieren wir 3SAT auf das 3-Färbbarkeitsproblem wie folgt: Zu gegebener KNF F = C1 ∧. . .∧Cm konstruieren wir einen Graphen GF , der die Knoten T, F, R hat (die gleichzeitig als Farben T, F, R bzw. grün, blau, rot aufgefaßt werden), die ein Dreieck bilden. Außerdem hat GF die Knoten xi , −xi zu jeder Variablen xi , und {xi , −xi } bilden jeweils eine Kante. Die Knoten xi , −xi werden alle mit dem Knoten R durch eine Kante verbunden. Schließlich gibt es zu jeder Klausel Cj die Knoten aj , bj , cj , dj , ej , wobei die Knoten aj , bj , cj ein Dreieck bilden, und {cj , dj } sowie {dj , ej } sind Kanten. Die Knoten dj und ej werden jeweils durch eine Kante mit dem Knoten T verbunden. Außerdem sind die Knoten aj , bj , ej die Kontaktknoten zu den Literalknoten der jeweiligen Klausel Cj , d.h., aj bekommt eine Kante zum ersten Literalknoten, bj eine Kante zum zweiten und ej eine Kante zum dritten Literalknoten von Cj . Ein Beispiel ist in Abbildung 3 für die Formel F = (x1 ∨ ¬x2 ∨ ¬x3 ) ∧ (¬x1 ∨ x2 ∨ x4 ) gegeben. Behauptung: F ist genau dann erfüllbar, wenn GF 3-färbbar ist. 42 x1 F R -x1 x2 T a1 d1 -x2 c1 x3 b1 e1 d2 a2 c2 -x3 x4 -x4 b2 e2 Abbildung 3: Der Graph GF für die Formel F = (x1 ∨ ¬x2 ∨ ¬x3 ) ∧ (¬x1 ∨ x2 ∨ x4 ). Dabei ist von entscheidender Bedeutung, daß der Teilgraph, der durch die Klauselknoten aj , bj , cj , dj , ej zusammen mit T und den Literalknoten induziert wird, nicht 3-färbbar ist, wenn die Farben der drei Literalknoten alle F sind (da die Literalknoten alle zu R adjazent sind, kommt bei einer 3-Färbung nur T und F in Frage). In allen übrigen Fällen gibt es eine 3-Färbung. Ist F erfüllbar, so bekommt mindestens ein Literalknoten pro Klausel die Farbe T , und damit ist GF 3-färbbar. Ist umgekehrt GF 3-färbbar, so gibt es in jeder Klausel mindestens einen Literalknoten mit Farbe T , und damit läßt sich eine erfüllende Belegung für F definieren. q.e.d. 9.4 9.4.1 Chordale Graphen, Intervallgraphen und perfekte Graphen Chordale Graphen In vielen Modellbildungen der Informatik, wie z.B. bei relationalen Datenbankschemata sowie in der Bioinformatik, kommen sogenannte chordale Graphen vor: Definition 9.3 Es sei G = (V, E) ungerichteter Graph. (1) Ein Knoten v ∈ V heißt simplizial, wenn die Menge N(v) seiner Nachbarn eine 43 Clique bilden. (2) Eine Knotenreihenfolge (v1 , . . . , vn ) heißt perfekte Eliminationsordnung (p.e.o.) von G, wenn für alle i mit 1 ≤ i ≤ n gilt: vi ist simplizial im Restgraphen Gi := G[{vi , . . . , , vn }]. (3) G heißt chordal, wenn G eine p.e.o. besitzt. Offenbar sind Blätter in Bäumen simpliziale Knoten, und Bäume sind chordale Graphen, da jeder Baum eine p.e.o. (in Form einer Abpflückreihenfolge von Blättern) besitzt. Damit ist der Begriff der chordalen Graphen eine (weitgehende) Verallgemeinerung von Bäumen. Allerdings haben auch chordale Graphen eine Baumstruktur, die in den erwähnten Modellbildungen eine wichtige Rolle spielt. Wir zeigen nun zunächst, daß das Problem Graph k-Colorability für chordale Graphen entlang einer p.e.o. von rechts nach links effizient lösbar ist: Es sei (v1 , . . . , vn ) eine p.e.o. von G. Es bezeichne ω(G) die maximale Cliquengröße von G und χ(G) die chromatische Zahl von G. Offenbar ist für beliebige Graphen G die folgende Ungleichung richtig: ω(G) ≤ χ(G). Wir versuchen nun, beim Färben des chordalen Graphen G mit ω(G) Farben auszukommen: Beginnend mit vn werden die Knoten von G von rechts nach links entlang der p.e.o. gefärbt. Ist man bei vi angekommen, so sind die rechts stehenden Nachbarn von vi bereits gefärbt. Dies sind höchstens ω(G) − 1 Knoten, da vi in Gi simplizial ist, also ist noch eine der ω(G) Farben für vi frei. Dieses Argument wiederholt sich, bis schließlich auch v1 gefärbt ist. Nun gilt für den chordalen Graphen G ω(G) = χ(G). Graphen G, für die diese Gleichung für G und alle induzierten Teilgraphen von G gilt, heißen perfekte Graphen. Chordale Graphen sind also perfekt, aber nicht umgekehrt. Aufgabe 9.1 Bipartite Graphen sind perfekt, aber dreiecksfreie Graphen nicht. Aufgabe 9.2 (1) Chordale Graphen mit n Knoten haben höchstens n inklusionsmaximale Cliquen. (2) Es gibt (nichtchordale) Graphen, die exponentiell viele inklusionsmaximale Cliquen haben. Aufgabe 9.3 Jeder simpliziale Knoten eines chordalen Graphen kann der erste Knoten einer p.e.o. des Graphen sein. 44 Offenbar ist wegen Aufgabe 9.3 die Frage, ob ein Graph G chordal ist, in Polynomialzeit lösbar, indem man jeweils so lange wie möglich einen simplizialen Knoten wählt und ihn als nächsten Knoten in die zu konstruierende p.e.o. einfügt. Wenn dies mit allen Knoten möglich ist, so erhält man tatsächlich eine p.e.o., andernfalls ist der Graph nicht chordal. Dies ist kein Linearzeitalgorithmus zur Erkennung von chordalen Graphen, es gibt jedoch Verbesserungen, die in Linearzeit erkennen, ob ein gegebener Graph chordal ist, z.B. mit LexBFS. 9.4.2 Intervallgraphen Es bezeichne [l, r] das abgeschlossene reelle Intervall mit dem linken Rand l und dem rechten Rand r. Es sei M eine endliche Menge von nichtleeren Intervallen auf der reellen Achse: M = {Ij = [lj , rj ] | j ∈ {1, . . . , n} mit lj < rj }. Dann läßt sich auf folgende Weise der Durchschnittsgraph von M definieren: Definition 9.4 (1) Es sei GM = ({1, . . . , n}, EM ) mit ij ∈ EM , falls Ii ∩ Ij 6= ∅. (2) Graph G heißt Intervallgraph, falls eine Menge M von Intervallen der reellen Achse mit GM ∼ G existiert. Aufgabe 9.4 Zeigen Sie: Intervallgraphen sind chordale Graphen. Gleichzeitig definiert eine Menge M von Intervallen der reellen Achse auch eine Intervall-Halbordnung PM = ({1, . . . , n}, <M ) auf {1, . . . , n}: Definition 9.5 Es sei i <M j, falls Ii = [li , ri ] ganz links von Ij = [lj , rj ] liegt, d.h. ri < lj . Wir schreiben abkürzend Ii L Ij . Außerdem sei i ≤M j, falls Ii L Ij oder Ii = Ij . Dieses Modell kommt in vielen Anwendungen vor, so u.a. in Arbeiten des amerikanischen Biologen Benzer, der für seine Arbeiten über die Feinstruktur der Gene den Nobelpreis erhielt. Wir wählen hier ein anderes Beispiel. Gegeben sei eine Menge J = {j1 , . . . , jn } von Jobs mit Anfangszeiten {a1 , . . . , an } und Beendigungszeiten {e1 , . . . , en }, d.h. jeder Job definiert ein Zeitintervall. Jobs, deren Zeitintervalle einen nichtleeren Durchschnitt haben, können nicht (gleichzeitig) durch denselben Executor ausgeführt werden. Im übrigen kann jeder Executor jeden Job im Prinzip ausführen. Gesucht ist eine kleinste Zahl von Executoren, die die Jobs ausführen können. Offensichtlich ist dies gerade das Färbungsproblem des zugehörigen Intervallgraphen, d.h. die kleinste Zahl von Executoren, mit denen sich die Jobs ausführen lassen, ist gerade χ(GM ). Um den Zusammenhang zwischen GM und der Intervallordnung <M näher zu betrachten, geben wir eine weitere Definition an: 45 Definition 9.6 Es sei P = (V, ≤P ) eine Halbordnung auf V und i <P j, falls i ≤P j und i 6= j. Damit ist GP = (V, EP ) mit ij ∈ EP , falls i <P j oder j <P i der Vergleichbarkeitsgraph von P . Offenbar gilt für die obige Intervallmenge M: GM ist der Vergleichbarkeitsgraph von PM , d.h. ij ∈ EM ⇐⇒ Ii ∩ Ij 6= ∅ ⇐⇒ ¬(Ii L Ij ) ∧ ¬(Ij L Ii ). Definition 9.7 Ein Graph G = (E, V ) heißt transitiv orientierbar, falls gilt: Es existiert eine Menge von gerichteten Kanten F , deren zugrundeliegende ungerichtete Kantenmenge E ist, mit der Eigenschaft: F ist transitiv. Offenbar ist G genau dann transitiv orientierbar, wenn G der Vergleichbarkeitsgraph einer Halbordnung ist. Nun zu einer Charakterisierung der Intervallgraphen: Satz 9.5 Die folgenden Eigenschaften sind äquivalent: (1) G ist Intervallgraph. (2) G enthält keinen induzierten Teilgraphen C4 , und G ist transitiv orientierbar. (3) Die maximalen Cliquen von G lassen sich linear anordnen, so daß für jeden Knoten v die Cliquen, in denen v vorkommt, ein Intervall in dieser Anordnung bilden. Beweis: (1) =⇒ (2): Ist GM Intervallgraph, so ist GM der Vergleichbarkeitsgraph der Intervall-Halbordnung PM , also transitiv orientierbar. Angenommen, die Knoten u, v, x, y induzieren in G in dieser Reihenfolge einen C4 . Dann ist Iu ∩ Ix = ∅ und Iv ∩ Iy = ∅. O.B.d.A. sei Iu LIx . Wegen Iu ∩ Iv 6= ∅ und Iv ∩ Ix 6= ∅ ist der nichtleere Abschnitt Z zwischen den Intervallen Iu und Ix in Iv enthalten: Z ⊆ Iv . Wegen Iu ∩Iy 6= ∅ und Ix ∩ Iy 6= ∅ ist aber ebenfalls Z ⊆ Iy , also Iv ∩ Iy 6= ∅ - Widerspruch. (2) =⇒ (3): Es sei F eine transitive Orientierung von G. Wir wollen zeigen, daß die maximalen Antiketten A1 , . . . , Ak in G die lineare Anordnungseigenschaft in Bedingung (3) erfüllen. Dazu folgende Hilfsüberlegung: A1 , . . . , Ak sind in G die maximalen Cliquen. Zwischen maximalen Antiketten Ai und Aj existiert stets eine Kante x → y ∈ F : Wäre dies nicht so, so wäre sogar Ai ∪ Aj Antikette. Außerdem gilt: Sind a → b und c → d Kanten zwischen Ai und Aj , so haben beide Kanten entweder die Richtung von Ai nach Aj oder umgekehrt, d.h. alle Kanten zwischen Ai und Aj haben dieselbe Richtung. Angenommen, a, d ∈ Ai , b, c ∈ Aj mit (a, b), (c, d) ∈ F . (Nachfolgende Abbildung 4 zeigt die beiden entgegengesetzten Kanten zwischen Aj und Ai .) Dann muß mindestens eines der Paare bd, ac in E liegen, da sonst E einen C4 enthält (bzw. E einen 2K2 ). O.B.d.A. sei ac ∈ E. Ist a → c ∈ F , so ist wegen der Transitivität von F auch a → d ∈ F - Widerspruch. Ist c → a ∈ F , so ist auch c → b ∈ F Widerspruch. Also haben alle Kanten zwischen Ai und Aj , i, j ∈ {1, . . . , k}, dieselbe 46 Ai b c Aj a d Abbildung 4: Die beiden Kanten zwischen Aj und Ai Richtung. Damit bilden A1 , . . . , Ak einen vollständigen dag (ein Turnier) in folgendem Sinn: Ai → Aj gdw. es existieren x ∈ Ai , y ∈ Aj mit x → y ∈ F . Ist Ai → Aj und Aj → Ak , so ist auch Ai → Ak erfüllt: Es sei x → y ∈ F mit x ∈ Ai , y ∈ Aj und u → v ∈ F mit u ∈ Aj , v ∈ Ak . Dann ist im Fall y = u die Behauptung klar. (Nachfolgende Abbildung 5 zeigt die beiden gleichgerichteten Kanten von Ai nach Aj bzw. von Aj nach Ak .) x Ai y u v Aj Ak Abbildung 5: Die Kanten von Ai nach Aj bzw. von Aj nach Ak Ist yv ∈ E, so ist y → v ∈ F , und die Behauptung ist erfüllt. Ist xu ∈ E, so ist x → u ∈ F und die Behauptung erfüllt. Ist nun yv ∈ E und xu ∈ E, so ist xv ∈ / E, da sonst E einen C4 enthält. Also ist entweder x → v ∈ F oder v → x ∈ F . Ist x → v ∈ F , so ist Ai → Ak . Die Kante v → x ∈ F kann nicht auftreten, da sonst u → x ∈ F ist – Widerspruch. Es sei nun x ∈ Ai , x ∈ Ak und x ∈ / Aj . Da x ∈ / Aj ist, existiert ein y ∈ Aj mit xy ∈ E. Aus Ai → Aj folgt x → y ∈ F , aus Aj → Ak folgt y → x ∈ F - Widerspruch. (3) =⇒ (1): Wir wählen für jeden Knoten x das Intervall Ix der Cliquen (Antiketten in F ) in denen x vorkommt. Dies ist ein Intervallmodell M für G, so daß G = GM ist. q.e.d. Die dritte Bedingung von Satz 9.5 ist die Grundlage für einen LinearzeitErkennungsalgorithmus für Intervallgraphen, der sogenannte PQ-Bäume verwendet und prüft, ob es eine lineare Anordnung der maximalen Cliquen gemäß (3) von Satz 47 9.5 gibt. Dies läßt sich ebenso für die Knoten-Cliquen-Inzidenzmatrizen von Intervallgraphen ausführen. In der Bioinformatik spielen die sogenannten unit interval graphs eine besondere Rolle - dies sind die Durchschnittsgraphen von Intervallen derselben Länge (o.B.d.A. Länge 1). Um diese Graphen zu charakterisieren, brauchen wir noch ein paar Begriffe: Ein Intervallgraph heißt proper interval graph, wenn er ein Intervallmodell hat, bei dem keine zwei Intervalle ineinander enthalten sind. Der Graph K1,3 besteht aus vier Knoten a, b, c, d und den Kanten ab, ac, ad. Dieser Graph heißt auch claw. Satz 9.6 Es sei G = (V, E) Graph. Die folgenden Eigenschaften sind äquivalent: (1) G ist unit interval graph. (2) G ist proper interval graph. (3) G ist K1,3 -freier Intervallgraph. (4) Es gibt eine Knotenreihenfolge (v1 , . . . , vn ), in der alle abgeschlossenen Nachbarschaften N[vi ] als Intervall aufeinanderfolgender Knoten vorkommen. Darüber hinaus gibt es noch eine Reihe weiterer Charakterisierungen dieser Graphen. 48 9.5 Stable Matching Literatur: [J. Kleinberg, É. Tardos, Algorithm Design, Pearson 2006] Gegeben ist eine Menge M = {m1 , . . . , mn } von Männern sowie eine Menge W = {w1 , . . . , wn } von Frauen und für jeden Mann eine Vorzugsreihenfolge (d.h. Permutation) aller Frauen bzw. für jede Frau eine Vorzugsreihenfolge aller Männer. Wir betrachten Paarungen P ⊂ M × W zwischen M und W . Eine Instabilität in P besteht aus Paaren (m, w) ∈ M × W , (m′ , w ′ ) ∈ M × W , so daß gilt: m bevorzugt w ′ vor w und w ′ bevorzugt m vor m′ . Eine Paarung P heißt stabil, falls P perfect matching ist und keine Instabilitäten enthält. Gesucht: Eine stabile Paarung. Beispiel 1. M = {m1 , m2 }, W = {w1 , w2 }, mit den folgenden Vorzugsreihenfolgen: m1 : w1 > w2 (d.h. m1 bevorzugt w1 vor w2 ), m2 : w1 > w2 , w1 : m1 > m2 , w2 : m1 > m2 . Das bedeutet: Beide Männer, m1 und m2 wünschen sich w1 als Partnerin, während beide Frauen, w1 und w2 , sich m1 als Partner wünschen. Die Paarung {(m1 , w1), (m2 , w2 )} ist stabil (obwohl m2 und w2 nicht ihre Wunschpartner bekommen). Die Paarung {(m1 , w2), (m2 , w1 )} hingegen ist nicht stabil, weil m1 lieber w1 und w1 lieber m1 hätte. Beispiel 2. M = {m1 , m2 }, W = {w1 , w2 }, mit den Vorzugsreihenfolgen: m1 : w1 > w2 , m2 : w2 > w1 , w1 : m2 > m1 , w2 : m1 > m2 . Beide möglichen Paarungen {(m1 , w1 ), (m2 , w2 )} und {(m1 , w2 ), (m2 , w1)} sind stabil, wobei die erste für die Männer optimal ist, während die zweite für die Frauen optimal ist. Dieses Beispiel zeigt auch, daß es mehr als eine stabile Paarung geben kann. Im folgenden Algorithmus können Männer und Frauen jeweils frei oder verlobt sein. Spielregeln der Männer-Variante: • Freie Männer m können einer Frau w den Antrag auf Verlobung stellen. Ist w frei, so sind (m, w) dann verlobt; w kann den Antrag nicht ablehnen. • Frauen, die bereits verlobt sind, können einen Antrag eines anderen Mannes m auf Verlobung ablehnen oder ihre jetzige Verlobung auflösen und eine neue Verlobung mit m eingehen, d.h.: Ist Frau w zur Zeit mit m′ verlobt, m stellt Antrag auf Verlobung und w bevorzugt m vor m′ , so löst w die Verlobung mit m′ und verlobt sich mit m; m′ ist dann wieder frei. Im anderen Fall wird der Antrag von m abgelehnt, und m bleibt frei. 49 Algorithmus 9.1 (Gale, Shapley) Eingabe: Wie oben beschrieben. Ausgabe: Eine stabile Paarung P . (0) Zu Beginn sind alle m ∈ M und alle w ∈ W frei. (1) while es gibt einen freien Mann m, der noch nicht jeder Frau einen Antrag gestellt hat do begin (2) wähle einen solchen Mann m; es sei w die für m beste Frau, der m noch keinen Antrag gestellt hat; (3) if w ist frei then (m, w) sind verlobt; (4) else w sei zur Zeit mit m′ verlobt; (5) if w bevorzugt m′ vor m then m bleibt frei (6) else (m, w) sind nun verlobt, und m′ ist wieder frei. end (7) P sei die Menge der nun erreichten Verlobungspaare. Eigenschaft 9.2 (1) Für jede Frau w ∈ W gilt: Nachdem w das erste Mal einen Antrag erhält, bleibt w stets verlobt, und die Folge ihrer Partner wird in Bezug auf ihre Vorzugsreihenfolge Mw besser. (2) Die Folge der Frauen, an die ein freier Mann m einen Antrag richtet, wird in Bezug auf seine Vorzugsreihenfolge Wm schlechter. (3) Bezeichnet Pt die Menge der Paare (m, w), so daß m ∈ M am Ende der tten Iteration der while-Schleife einen Antrag an w ∈ W gestellt hat, so gilt: |Pt+1 | > |Pt |. Also wird die while-Schleife höchstens n2 -mal durchlaufen. (4) Falls der Mann m ∈ M irgendwann frei ist, so existiert eine Frau w ∈ W , an die m noch keinen Antrag gestellt hat. (5) Das Ergebnis P des Algorithmus ist ein perfect matching. (6) Das Ergebnis P des Algorithmus ist ein stable matching. 50 10 Eulerkreise Datenstrukturen zur Darstellung des Graphen: 1. Die Adjazenzlistendarstellung des Graphen. A(v) bezeichne die Adjazenzliste von v. 2. Eine doppelt verkettete Liste P von Kanten, die den Weg P beschreibt. Anfangs ist P leer. 3. Eine Tabelle TV aller Knoten mit folgendem Inhalt: a) Eine Marke, ob v schon in P vorkommt. Anfangs sind alle Knoten v mit ,,nicht besucht” markiert. b) Ein Zeiger Next(v) auf die nächste Kante der Adjazenzliste von v, die noch nicht von v aus durchlaufen wurde. Anfangs zeigt Next(v) auf die erste Kante in der Adjazenzliste zu v. c) Ein Zeiger E(v), der in der Liste P auf eine Kante zeigt, die von v aus durchlaufen wurde. Anfangs ist E(v) undefiniert. 4. Eine Tabelle TE aller Kanten, die für jede Kante e ihre zwei Endknoten enthält sowie eine Markierung, ob e schon ,,benutzt” wurde. Anfangs sind alle Kanten mit ,,unbenutzt” markiert. 5. Eine Knotenliste L, die anfangs leer ist. Jeder irgendwann neu erreichte Knoten wird in L aufgenommen und erst wieder aus L gestrichen, wenn alle zu ihm inzidenten Kanten durchlaufen wurden. L enthält insbesondere nicht nur die im ersten Durchlauf (bei Konstruktion von P nach Punkt (2) des Algorithmus) aufgenommenen Knoten ! Zunächst beschreiben wir folgende Prozedur, die vom Knoten d ausgehend einen Weg bestimmt, der sich nicht verlängern läßt. Prozedur 10.1 W EG(d, P): (1) (2) (3) (4) (5) (6) v := d; P = ∅; repeat if v ,,nicht besucht” then begin L := L ∪ {v}; markiere v ,,besucht” end; while (Next(v) nicht letzte Kante in A(v)) and (Next(v) ,,benutzt”) do begin Next(v) := nächste Kante in A(v); if Next(v) ,,unbenutzt” then 51 (7) (8) (9) (10) (11) (12) begin e := Next(v); Verlängere P mit e; if E(v) noch undefiniert then E(v) zeigt auf e in P; {wird beim Einfügen benötigt}; Markiere in der Kantentabelle TE die Kante e als ,,benutzt”; Bestimme den anderen Endknoten u von e = uv; v := u; end end (13) until Next(v) ,,benutzt”; (Hier ist zu betonen, daß durch die in (10) erfolgte Markierung von e nicht auch Next(v) die gleiche Markierung hat: die Bedingung in (13) ist erst dann erfüllt, wenn in (4) keine unbenutzte Kante mehr gefunden wird.) Algorithmus 10.1 (EULERWEG(G)) Eingabe: Ein ungerichteter, endlicher, nicht notwendig schlichter Graph G = (V, E, I), V = {v1 , . . . , vn } mit 2 oder 0 Knoten ungeraden Grads. (O.B.d.A. sei v1 von ungeradem Grad, falls G Knoten mit ungeradem Grad enthält.) Ausgabe: Ein Eulerweg von G. (1) for all v ∈ V do begin markiere v ,,nicht besucht”; setze E(v) ,,nicht definiert” end; for all e ∈ E do markiere e mit ,,unbenutzt”; v := v1 ; L := ∅; (2) W EG(v, P); (3) while L 6= ∅ do begin {L enthält die in W EG(v, P) besuchten Knoten} (4) wähle ein u ∈ L; L := L \ {u}; (5) P ′ sei neue, anfangs leere, zweifach verkettete Liste von Kanten; (6) W EG(u, P ′ ); {der dabei entstehende Weg kann leer sein}; (7) if P ′ 6= ∅ then füge P ′ in P bei E(u) ein; end; 52