Wiederholungskurs zu den Grundlagen der Diskreten Optimierung von Dipl.-Math. Wolfgang Kinzner im Wintersemester 2008/2009 Zentrum für Mathematik Technische Universität München 30. April 2009 Inhaltsverzeichnis 1 Grundlagen der Graphentheorie 2 2 Kürzeste Wege 7 3 Matroide und minimal aufspannende Bäume 12 4 Flüsse 17 5 Matchings 25 1 1 Grundlagen der Graphentheorie Landau-Notation Definition 1 Es seien f, g : N → R+ 0 zwei Funktionen. Wir schreiben f (n) = O(g(n)) :⇔ f (n) = Ω(g(n)) :⇔ f (n) = Θ(g(n)) :⇔ f (n) = o(g(n)) :⇔ f (n) = ω(g(n)) :⇔ ∃c ∈ R+ ∃n0 ∈ N ∀n ≥ n0 : f (n) ≤ cg(n), ∃c ∈ R+ ∃n0 ∈ N ∀n ≥ n0 : f (n) ≥ cg(n), ∃c1 , c2 ∈ R+ ∃n0 ∈ N ∀n ≥ n0 : c1 g(n) ≤ f (n) ≤ c2 g(n), ∀c ∈ R+ ∃n0 ∈ N ∀n ≥ n0 : f (n) ≤ cg(n), ∀c ∈ R+ ∃n0 ∈ N ∀n ≥ n0 : f (n) ≥ cg(n). Bemerkung 1 Es gelten: f (n) n→∞ g(n) 1. f (n) = o(g(n)) ⇔ lim f (n) n→∞ g(n) 2. f (n) = O(g(n)) ⇐ lim = 0. existiert. 3. f (n) = O(g(n)) ⇔ g(n) = Ω(f (n)). 4. f (n) = Θ(g(n) ⇔ f (n) = O(g(n)) und f (n) = Ω(g(n)). Übung 1.1 Welche der folgenden Aussagen ist richtig? (a) (i) 5n2 + 9n + 7 = O(n2 ). (ii) 5n2 + 9n + 7 = Θ(n2 ). (iii) 5n2 + 9n + 7 = o(n2 ). (iv) 5n2 + 9n + 7 = o(n3 ). (v) 5n2 + 9n + 7 = Θ(n3 ). (vi) log(n2 ) = Θ(log(n3 )) (vii) log n = Θ(ln n) (viii) ∀ǫ ∈ R+ ∀k ∈ N : (log n)k = o(nǫ ) (ix) 10log n = O(2n ). (x) 10 √ n = O(2n ). (xi) 10n = O(2n ). (b) Es gibt zwei Funktionen f, g, für die weder f (n) = O(g(n)) noch g(n) = O(f (n) gilt. 2 Repräsentation von Graphen Allgemeine Voraussetzung ab jetzt (wenn nicht anders erwähnt): G = (V, E) ist ein ungerichteter ungewichteter Graph mit V = [n] (d.h. |V | = n) und |E| = m. (1) Adjazenzliste Feld von n Listen, eine für jeden Knoten in V . 1 → ... .. .. .. . . . v → v1 → v2 → . . . → .. .. .. . . . n → ... mit N (v) = {v1 , v2 , . . . , vk }. vk Vorteil: Kompakte Darstellung mit O(n + m) Speicher. Nachteil: Test, ob {v, w} Kante ist, kostet in schlechtestem Fall O(n) Zeit (2) Adjazenzmatrix: . . . a1n .. .. . . . . . ann a11 .. n × n Matrix A = (aij )1≤i,j≤n = . a n1 1 , falls {i, j} ∈ E, mit aij = . 0 sonst Vorteil: Test, ob {v, w} Kante ist, kostet O(1) Zeit Nachteil: Adjazenzmatrix erfordert Θ(n2 ) Speicher. Übung 1.2 Gegeben sei der folgende ungerichtete, ungewichtete Graph G: 1 4 2 3 (a) Geben Sie die Adjazenzliste und die Adjazenzmatrix A von G an. (b) Geben Sie A2 an, ohne das Matrixprodukt (algebraisch) zu berechnen. Wie kann man an A und A2 erkennen, das G Dreiecke enthält? Ist A2 Adjazenzmatrix eines Graphen? 3 Breiten- und Tiefensuche Funktionsweise Breitensuche: • Beginnt bei beliebigem Startknoten u ∈ V und läuft anschließend alle Sphären Vi (u) ab. (i < ∞) • Hat am Ende jeden Knoten w der Zusammenhangskomponente genau einmal besucht. (bekannt(w) = 1) • Berechnet die Abstände aller Knoten v ∈ V von u. (abst[v] = dist(u, v)) • Berechnet (minimale) u, w-Pfade in der Zusammenhangskomponente von u. (w, vor(w), vor(vor(w)), . . . , u) • Berechnet einen Spannbaum F der Zusammenhangskomponente von u. (F = {(w, vor(w)) : w ∈ W \ {u}}) Laufzeit: O(mu + n) (mit mu = ♯ Kanten der Zshgsk. von u) Algorithmus 1 Input: Graph G = (V, E), Knoten u ∈ V Output: Fnkten bekannt : V → {0, 1}, abst : V → N0 ∪ {∞}, vor : V \ {u} → V BFS∗ (G, u) (1) Enqueue (Q, u) (2) bekannt[u] := 1; abst[u] := 0; (3) foreach w ∈ V \ {u} do bekannt[w] := 0; abst[w] := ∞ (4) while Q 6= ∅ (5) v:= Dequeue (Q) (6) foreach w ∈ N (v) and bekannt[w] = 0 (7) Enqueue (Q, w) (8) bekannt[w] := 1 (9) abst[w] := abst[v] + 1 (10) vor[w] := v 4 Modifikationen: • Test auf Bipartitheit: – Es gilt: G bipartit ⇐⇒ G hat 2-Färbung. – Färbe Startknoten mit Farbe 0, seine Nachbarknoten mit Farbe 1, deren Nachbarknoten wieder mit 0 usw. – Bekommt Knoten dieselbe Farbe wie einer seiner Nachbarknoten ⇒ 2-Färbung nicht möglich ⇒ G nicht bipartit. – BFS fertig, dann überprüfe, ob bekannt(v) = 1 ∀v ∈ V . ∗ Ja, dann ist G bipartit. ∗ Nein, dann setze Verfahren mit neuem Knoten von anderer Zusammenhangskomponente fort. Laufzeit: O(m + n) • Test auf Zusammenhang: – Nach Ausführung von BFS bekannt(v) = 1 für alle v ∈ V ⇒ G zusammenhängend. – Gibt es noch Knoten in Q mit bekannt(v) = 0 ⇒ G nicht zusammenhängend. Laufzeit: O(mu + n) • Test auf Kreisfreiheit: – Für jedes v, aus Warteschlange entnommen, teste zusätzlich, ob v Nachbarknoten w hat, der nicht Vorgängerknoten ist und trotzdem bekannt ist. – Wenn der Fall ⇒ Kreis gefunden. – Wenn BFS gesamten Graphen (d.h. alle ZHK) durchläuft, ohne einen Kreis zu finden ⇒ G kreisfrei. Laufzeit: O(m + n) • Test, ob Graph Baum ist: – Es gilt: G ist Baum ⇔ ist zusammenhängend und kreisfrei. – Teste also G auf die beiden Eigenschaften wie oben beschrieben. Laufzeit: O(n) 5 Übung 1.3 Welche der folgende Aussagen richtig? n (a) Auf einer n-elementigen Knotenmenge gibt es genau 2( 2 ) verschiedene Graphen. (b) Ist G nicht zusammenhängend, dann gilt immer n > m. (c) Ein Graph ist genau dann ein Baum, wenn je zwei Knoten durch genau einen Pfad verbunden sind. (d) Bäume sind immer bipartit. (e) Man kann dist(v, w) für v, w ∈ V unter Verwendung von BFS in O(n+m) bestimmen. (f ) Man kann dist(v, w) für v, w ∈ V unter Verwendung von DFS in O(n+m) bestimmen. (g) Ist G zusammenhängend, so haben BFS und DFS eine Laufzeit von O(n). (h) Ist G zusammenhängend, aber kein Baum, so sind die durch BFS und DFS, vom selben Startknoten aus, konstruierten Spannbäume immer verschieden. Übung 1.4 Sei G = (V, E) ein Graph, dann bezeichnet G := (V, V 2 \ E) sein Komplement. (a) Die Bildung von G kostet Θ(n2 ) Zeit. (Bei Darstellung über über Adjazenzmatrix) (b) Zeigen sie: Ein bipartiter Graph auf n Knoten hat höchstens n2 4 Kanten. (c) Wie läßt sich in O(n + m) Zeit testen, ob das Komplement eines Graphen mit n Knoten und m Kanten bipartit ist. Übung 1.5 Sei G = (V, E) ein ungerichteter Graph ohne Schleifen. Mit δ(G) := min d(v) v∈V werde der Minimalgrad von G bezeichnet. Zeigen Sie: Gilt δ(G) ≥ 2, dann hat G einen Kreis, dessen Länge mindestens δ(G) + 1 ist. 6 2 Kürzeste Wege Der Dijkstra-Algorithmus Funktionsweise: • Modifikation von BFS. • Bildet zusätzlich Minimum über die Abstände und besucht dann den nächst günstigen Knoten. • Berechnet die Abstände von einem Startknoten zum allen anderen Knoten. • Wichtige Voraussetzung: Alle Kanten haben positive Gewichte. Laufzeit: O(n2 ) (mit Fibonacci-Heaps: O(n log n + m)) Algorithmus 2 (Dijkstra) ~ = (V, E, ~ ℓ) mit Längenfunktion ℓ : E → R+ , Input: Graph G Knoten s ∈ V Output: Funktion abst : V → R ∪ {∞} Dijkstra(G, ℓ, s) (1) foreach x ∈ V \ {s} do abst[x] := ∞ (2) abst[s] := 0 (3) Q := V (4) while Q 6= ∅ (5) x := Knoten in Q mit kleinstem abst[.]-Wert (6) Q := Q \ {x} ~ (7) foreach y ∈ Q mit (x, y) ∈ E (8) abst[y] := min{abst[y], abst[x] + ℓ(x, y)) Modifikation: Berechnung der kürzesten Pfade durch Speicherung des Vorgängers jedes Knotens. Algorithmus 3 ~ = (V, E, ~ ℓ) mit Längenfunktion ℓ : E → R+ , Input: Graph G Knoten s ∈ V Output: Funktion abst : V → R ∪ {∞} Dijkstra*(G, ℓ, s) (1)-(8) wie oben (9) if abst[x] + ℓ(x, y) < abst[y] (10) then abst[y] = abst[x] + ℓ(x, y) (11) vor[y] = x (12) foreach v ∈ V (13) A[v, 1] = v (14) for i = 2 to n (15) A[v, i] = vor(A[v, i − 1]) 7 Übung 2.1 Für einen Graphen G = (V, E) betrachten wir die Reihenfolge v1 , v2 , ..., vn mit vi ∈ V , in der die Knoten von G im Dijkstra-Algorithmus aus Q gelöscht werden (Zeile 6). Wir sagen dann, dass v1 , v2 , ..., vn eine (mögliche) Besuchsreihenfolge für Dijkstra(G, v1 ) ist. Sei G der folgende Graph mit Gewichtsfunktion ℓ wie angegeben: u3 u9 111111 000000 0000000 1111111 00 11 00 11 00 11 00000011001111111 111111 0000000 00 11 00 11 000000 111111 000000 111111 00 11 00 11 00 11 000 111 000000 111111 000000 111111 110011001111111 1111111110011111111111111 0000000 10111111 00000000000000 0000000 000 111 000000 00000000000000 11111111111111 0000000 1111111 10111111 000 111 000000 0000000 1111111 000000 000000010111111 1111111 3 1 u4 1 3 4 u8 2 u5 1 3 u2 1 2 u7 3 2 2 4 5 u6 u1 Welche der folgenden Aussagen sind richtig? (a) Eine Besuchsreihenfolge für Dijkstra(G, ℓ, u1 ) ist u1 , u4 , u9 , u8 , u6 , u5 , u2 , u7 , u3 . (b) Eine Besuchsreihenfolge für Dijkstra(G, ℓ, u7 ) ist u7 , u6 , u8 , u5 , u9 , u4 , u2 , u1 , u3 . (c) Beim Ausführen von Dijkstra(G, ℓ, u9 ) ist abst[u9 ] stets echt kleiner als abst[u2 ]. (“stets“ bedeutet, sobald abst[v] < ∞ für den besagten Knoten v.) (d) Beim Ausführen von Dijkstra(G, ℓ, u1 ) ist abst[u3 ] stets echt kleiner als abst[u8 ]. (e) Beim Ausführen von Dijkstra(G, ℓ, u7 ) ist abst[u8 ] stets echt kleiner als abst[u9 ]. (f ) Beim Ausführen von Dijkstra*(G, ℓ, u7 ) enthält ein kürzester u7 , u9 Pfad immer die Kante {u6 , u9 }. (g) Beim Ausführen von Dijkstra*(G, ℓ, u1 ) enthält ein kürzester u1 , u2 Pfad immer die Kante {u5 , u2 }. 8 Übung 2.2 Welche der folgenden Aussagen sind richtig? (a) Seien v1 , v2 , ..., vn eine mögliche Besuchsreihenfolge für Dijkstra(G, v1 ). Dann gilt am Ende des Algorithmus abst[v1 ] ≤ abst[v2 ] ≤ · · · ≤ abst[vn ]. (b) Ist man beim Aufruf von Dijkstra(G, ℓ, s) nur an dem Abstand von s zu einem festen Knoten t interessiert, so kann man abbrechen, sobald abst[t] < ∞. (c) Ist man beim Aufruf von Dijkstra(G, ℓ, s) nur an dem Abstand von s zu einem festen Knoten t interessiert, so kann man abbrechen, sobald t aus Q gelöscht wird. (d) Sei G ein ungerichteter, ungewichteter Graph. Dann findet der DijkstraAlgorithmus einen kürzesten Weg von s nach t in O(n + m) Schritten. (e) Berechnet man mit dem Dijkstra*-Algorithmus mit einem Durchlauf die kürzesten Pfade von einem Startknoten zu allen anderen Knoten, so bildet die Vereinigung dieser Pfade einen Spannbaum von G bzw. der Zusammenhangskomponente des Startknotens. (f ) Nehmen wir an, in G existieren negative Kantengewichte und sei −C das kleinste dieser Gewichte. Der kürzeste Weg zwischen zwei Knoten in einem solchen Graphen kann bestimmt werden, indem zunächst jedes Gewicht um (C + 1) erhöht und dann der Dijkstra-Algorithmus verwendet wird. (g) Ist G ein gerichteter Graph ohne negative Zyklen, in dem nur Kanten am Startknoten negative Gewichte haben dürfen. Dann liefert der DijkstraAlgorithmus richtige Ergebnisse. (h) Nehmen wir an, G sei ungerichtet und habe genau eine Kante e mit negativem Gewicht, aber keine negativen Zyklen. Dann kann ein kürzester s-t-Weg durch zweimaliges Aufrufen des Dijkstra-Algorithmus auf einem Subgraphen von G gefunden werden. 9 Der Floyd-Warshall-Algorithmus Lemma 1 ~ = (V, E), ~ ℓ:E ~ → R und i, j ∈ [n] und k ∈ [0, n]. Weiter seien Seien G k Pi,j := {P = (v1 , . . . , vr ) : dki,j := P ist gerichteter i, j-Pfad und v2 , . . . , vr−1 ∈ [k]} und k k min{ℓ(P ) : P ∈ Pi,j } falls Pi,j 6= ∅, ∞ sonst. Dann gilt: dki,j = ℓ(i, j) falls k = 0 k−1 k−1 k−1 min{di,j , di,k + dk,j } falls k ≥ 1. Funktionsweise: • Berechnet Abstände von allen Knoten des Graphen zueinander. (Matrix D = (dni,j )1≤i,j≤n ) • Verwendet das Prinzip der dynamischen Programmierung. D.h. er löst zunächst ein Teilproblem, verwendet diese Lösung für nächst größeres Teilproblem usw.. (Lemma 1) • Funktioniert auch bei Graphen mit negativen Kantengewichten. Hat al~ hat keine negativen Zyklen. lerdings Voraussetzung: G Laufzeit: O(n3 ) Algorithmus 4 ~ = (V, E), ~ Längenfunktion ℓ : E → R Input: Graph G Output: n × n Matrix D Floyd–Warshall(G, ℓ) (1) for i = 1 to n (2) for j = 1 to n (3) dˆ0i,j := ℓ(i, j) (4) for k = 1 to n (5) for i = 1 to n (6) for j = 1 to n k−1 ˆk−1 k−1 (7) dˆki,j := min{dˆi,j , di,k + dˆk,j } n ˆ (8) return D := (d )1≤i,j≤n i,j 10 Modifikationen: • Berechnung von kürzesten Pfaden. k k Sei wi,j der Vorgänger von j auf einem Pfad P ∈ Pi,j mit ℓ(P ) = dki,j . Dann gilt − → i falls i 6= j und (i, j) ∈ E , 0 wi,j := NIL sonst. ( k−1 k−1 k−1 k−1 wi,j falls di,j ≤ di,k + dk,j k k ≥ 1 : wi,j = k−1 k−1 k−1 k−1 wk,j falls di,j > di,k + dk,j . Modifizierter Algorithmus gibt schließlich die Matrix der kürzesten Pfade n W = (wij )1≤i,j≤n aus. • Erkennen von negativen Zyklen. Es gilt: Es gibt einen Zyklus negativer Länge ⇐⇒ ∃i, k ∈ [n] mit dki,i < 0. Sobald also im Laufe des Algorithmus in D ein negativer Diagonaleintrag auftaucht, bricht der modifizierte Algorithmus ab mit dem Ergebnis ´´negativer Zyklus gefunden´´. Übung 2.3 Gegeben sei der folgende gerichtete, gewichtete Graph G = (V, E, ℓ) mit V = {v1 , ..., v6 } und E = {e1 , ..., e8 }. v2 3 v4 2 2 v1 -3 v6 -2 5 1 v3 1 v5 (a) Berechnen Sie mithilfe des Floyd-Warshall-Algorithmus einen kürzesten Weg von v1 nach v6 und dessen Länge. (b) Zeigen Sie, dass der Dijkstra-Algorithmus für das gleiche Problem unbrauchbar ist. Übung 2.4 Was passiert beim Floyd-Warshall Algorithmus zur Bestimmung kürzester s, tWege, wenn es zwar einen Zyklus negativer Länge gibt, dieser jedoch nicht von s aus erreichbar ist oder t nicht von diesem erreicht werden kann? Geben Sie eine direkte Modifikation des Algorithmus an, so dass ein kürzester s, t-Weg gefunden wird. 11 3 Matroide und minimal aufspannende Bäume Der Algorithmus von Prim Funktionsweise: Beginnt mit beliebigem Knoten und baut sukzessive MST durch Hinzunahme der nächst größeren angrenzenden Kante zusammen. Laufzeit: O(n2 ) (mit Fibonacci-Heaps: O(n log n + m)) Algorithmus 5 (Algorithmus von Prim) Input: Graph G = (V, E), Längenfunktion ℓ : E → R≥0 Output: Baum T = (V, F ) Prim(G, ℓ) (1) Wähle beliebigen Knoten s ∈ V (2) W := {s}, F := ∅, σ[s] := 0 (3) foreach v ∈ N (s) do vor[v] := s, σ[v] := ℓ(s, v) (4) foreach v ∈ V \ (N (s) ∪ {s}) do vor[v] := N IL, (5) (6) (7) (8) (9) (10) σ[v] := ∞ while W 6= V y := Knoten mit minimalem σ[.]-Wert in V \ W W := W ∪ {y}, F := F ∪ {vor[y], y} foreach z ∈ N (y) ∩ (V \ W ) mit σ[z] > ℓ(y, z) σ(z) := ℓ(y, z) vor[z] := y Der Algorithmus von Kruskal Funktionsweise: Sortiert zunächst die Kanten der Größe nach. Beginnt danach mit der kleinsten Kante und nimmt danach immer die nächst größere Kante hinzu, die keinen Kreis erzeugt. Laufzeit: O((m + n) log n) Algorithmus 6 (Algorithmus von Kruskal) Input: Graph G = (V, E), Längenfunktion ℓ : E → R+ Output: Baum T = (V, F ) Kruskal(G, ℓ) (1) Sortiere alle Kanten in E so, daß ℓ(e1 ) ≤ · · · ≤ ℓ(em ); (2) F := ∅; (3) for i = 1 to m (4) if (V, F ∪ {ei }) kreisfrei then F := F ∪ {ei } 12 Übung 3.1 Sei G = (V, E) der folgende Graph mit Gewichtsfunktion ℓ wie angegeben: u3 u9 11001100 111111 000000 0000000 1111111 00 11 00000011001111111 111111 0000000 1100110011001100 000000 111111 000000 111111 00 11 000 111 000000 111111 000000110011111111111111 111111 110011001111111 10111111 1111111 0000000 00000000000000 0000000 000 111 000000 10111111 00000000000000 11111111111111 0000000 1111111 000 111 000000 0000000 1111111 000000 000000010111111 1111111 3 u4 1 1 3 4 u8 2 u5 1 3 u2 1 5 u7 3 2 2 4 5 u6 u1 Welche der folgenden Aussagen sind richtig? (a) Eine gültige Reihenfolge beim Ablaufen der Knoten im Prim-Algorithmus ist u5 , u4 , u9 , u8 , u1 , u6 , u3 , u7 , u2 . (b) Im Algorithmus von Prim wird der Knoten u2 stets als Letzter in den spannenden Baum eingebunden. (c) Im Algorithmus von Kruskal existieren unmittelbar vor dem letzten Schritt stets die Komponenten {u2 } und V − u2 . (d) Kein minimal spannender Baum enthält die Kanten {u1 , u5 } und {u4 , u5 } gleichzeitig. 13 Matroide Definition 2 (Unabhängigkeitssystem, Matroid) • Ein Unabhängigkeitssystem ist ein Paar (E, I), wobei E eine endliche Menge ist und I ⊆ P(E) mit (M1) ∅ ∈ I, (M2) Falls A ∈ I und B ⊆ A, dann B ∈ I. • E heißt Grundmenge, die Mengen A ⊆ E mit A ∈ I heißen unabhängig und die Mengen B ⊆ E mit B 6∈ I heißen abhängig. • Eine Menge A ∈ I heißt Basis, wenn sie inklusionsmaximal unabhängig ist. Falls A inklusionsminimal abhängig ist, so heißt A ein Kreis. • Ein Unabhängigkeitssystem heißt Matroid, wenn außerdem noch die folgende Eigenschaft gilt: (M3) Falls A, B ∈ I und |A| > |B|, dann gibt es ein x ∈ A\B mit B∪{x} ∈ I. (Austauschbedingung) Wichtige Beispiele 1 (1) Vektorraummatroid: Sei V ein Vektorraum, E eine Menge von Vektoren in V . Außerdem sei I := {F ⊆ E : F ist linear unabhängige Familie von Vektoren in V } ⊆ P(V ). Dann ist (E, I) ein Matroid. (2) Graphischer Matroid oder Kreismatroid: Sei G = (V, E) ein Graph und sei I := {F ⊆ E : (V, F ) ist kreisfreier Graph }. Dann ist (E, I) ein Matroid. Unabhängige Mengen: Wälder Basen: Spannbäume (3) Sei G = (V, E) ein Graph mit E 6= ∅. Wir definieren I := {M ⊆ E : M Matching}. Dann ist U := (E, I) ein Unabhängigkeitssystem, aber i. A. kein Matroid. Basen: Maximale Matchings. 14 Übung 3.2 Sei (E, I) das Kreismatroid des Graphen G aus Aufgabe 3.1. Sind die folgenden Aussagen richtig? (a) {u6 , u7 } ist in jedem Element von I enthalten. (b) {u6 , u7 } ist in einem Element von I enthalten. (c) {u6 , u7 } ist in genau einem Element von I enthalten. Übung 3.3 Sei E eine endliche Menge, k ∈ N, (E1 , E2 , . . . , Ek ) eine Partition von E, b1 , b2 , . . . bk ∈ N0 und I := {I ⊆ E : |I ∩ Ei | ≤ bi , i = 1, . . . k}. Zeigen Sie: (E, T ) ist ein Matroid. Übung 3.4 Eine Hilfsorganisation hat aus weihnachtlichen Spenden n Ladungen mit Lebensmitteln zur Verfügung. Für jede Ladung i ∈ [n] wurde ein Nährwert wi ∈ N und ein Verfalldatum ti ∈ N0 ermittelt. Täglich kann nur eine Ladung in das Krisengebiet gebracht werden. Ziel der Helfer ist es, eine Auswahl F ⊆ [n] von Ladungen zu treffen (nach dem Verfallsdatum sortiert), so dass keine Ladung i ∈ F nach ihrem Verfalldatum geliefert wird und der Nährwert aller gelieferten Ladungen maximiert wird. Zeigen Sie, dass dem Problem ein Matroid und ein Maximierungsproblem über diesem zu Grunde liegt. Übung 3.5 (a) Sei (E, I) ein Unabhängigkeitssystem. Zeigen Sie: (E, I) ist genau dann ein Matroid, wenn die folgende Bedingung erfüllt ist: (M3)´ Wenn X ⊆ E und I1 , I2 ∈ {I : I ∈ I, I ⊆ X} maximal unabhängig bezüglich X sind (d.h. ∀x ∈ X \ Ii (i = 1, 2) : Ii ∪ {x} ∈ / I), dann gilt |I1 | = |I2 |. (b) Sei (E, I) ein Matroid, I ∈ I, e ∈ E und I ∪{e} ∈ / I. Dann enthält I ∪{e} genau einen Kreis. Übung 3.6 Zeigen Sie: (a) Seien (E1 , I1 ), (E2 , I2 ) Matroide mit E1 ∩ E2 = ∅. Dann ist auch (E1 ∪ E2 , I) mit I = {I1 ∪ I2 : I1 ∈ I1 , I2 ∈ I2 } ein Matroid. (b) Seien (E, I1 ), (E, I2 ) Matroide. Dann ist (E, I1 ∩I1 ) im Allgemeinen kein Matroid. 15 Maximierungsprobleme über Unabhängigkeitssystemen Definition 3 Ein Maximierungsproblem über einem Unabhängigkeitssystem (E, I) ist gegeben durch eine GewichtsfunktionP ℓ : E → R+ 0 (und der Vereinbraung, dass für Mengen A ∈ I wieder ℓ(A) := e∈A ℓ(e) sein soll). Gesucht ist eine Menge A∗ ∈ I mit ℓ(A∗ ) = max ℓ(A). A∈I Algorithmus 7 (Greedy-Algo. zur Max. über Unabhsys.) Input: Unabhängigkeitssystem (E, I), Gewichtsfunktion ℓ : E → R+ Output: Ag ∈ I Greedy–Max(E, I, ℓ) (1) Sortiere E = {e1 , . . . , em } so, daß ℓ(e1 ) ≥ . . . ≥ ℓ(em ); (2) Ag := ∅; (3) for i = 1 to m (4) if Ag ∪ {ei } ∈ I then Ag := Ag ∪ {ei } Satz 1 Sei U = (E, I) ein Unabhängigkeitssystem. Dann gilt: U ist genau dann Matroid, wenn der Greedy–Algorithmus 7 für jede Funktion ℓ : E → R≥0 eine optimale Lösung der Maximierungsaufgabe (E, I, ℓ) findet. Definition 4 (Approximationsgüte) Ist Ag die vom Greedy-Algorithmus gefundene maximale Lösung und A∗ die g tatsächliche maximale Lösung der Maximierungsaufgabe, so nennt man A A∗ die Approximationsgüte des Greedy-Algorithmus. Übung 3.7 (Klausuraufgabe 6) Sei G = (V, E) ein Graph mit V = {v1 , . . . , vn } und Maximalgrad ∆ := ∆(G) = maxv∈V deg(v). Der folgende Algorithmus M SN hat das Ziel, eine möglichst große stabile Menge in G zu finden: Algorithmus 8 (Maximale stabile Menge MSN) (1) S := ∅ (2) for i = 1 to n (3) if G[S ∪ {vi }] enthält KEINE Kante then S := S ∪ {vi } (4) return S (a) Für ein bestimmtes Unabhängigkeitssystem U und eine Gewichtsfunktion c auf der Grundmenge von U ist M SN ein Greedy-Algorithmus für ein Maximierungsproblem über U . Geben Sie U und c an, und begründen Sie, warum U ein Unabhängigkeitssystem ist. (b) Zeigen Sie: M SN hat Approximationsgüte mindestens 16 1 ∆. 4 Flüsse Netzwerke Definition 5 (Netzwerk, Fluss) ~ s, t, c), wobei G = (V, E) ~ ein ge• Ein Netzwerk ist ein Tupel N = (V, E, richteter Graph ist, s, t ∈ V zwei ausgezeichnetene Knoten benennen und ~ → R+ eine Kapazitätsfunktion. Die Knoten s bzw. t werden Quelle c:E 0 bzw. Senke genannt. Für einen Knoten v ∈ V schreiben wir ~ N + (v) := {w ∈ V : ∃(v, w) ∈ E} und ~ N − (v) := {w ∈ V : ∃(w, v) ∈ E}. ~ → R+ heisst s-t-Fluss (engl. flow) in N , wenn • Eine Abbildung f : E 0 P P f ((x, y)) ∀x ∈ V \ {s, t} (Flusserf ((y, x)) = – y∈N − (x) y∈N + (x) haltung), – f ((x, y)) ≤ c((x, y)) ~ ∀(x, y) ∈ E (Zulässigkeit), wobei wir im Folgenden der Einfachheit halber immer nur noch f (x, y) statt f ((x, y)) und c(x, y) statt c((x, y)) schreiben werden. • Der Wert von f ist definiert als X f (s, y) − val(f ) := y∈N + (s) X f (y, s) y∈N − (s) Ein Fluss f hat maximalen Wert in N , falls val(f ) ≥ val(f ′ ) für alle Flüsse f ′ in N gilt. Übung 4.1 In Brutopia ist der Diktator Brutus I. auf Druck des Auslands zurückgetreten, jetzt soll eine Demokratie in dem Land eingeführt werden. Die m verschiedenen gesellschaftlichen Gruppierungen (Widerstandsgruppen, Gewerkschaften, religiöse Gruppen, einflußreiche Verbände usw.) haben sich darauf geeinigt, ein Übergangsparlament zu bilden, in das jede Gruppe einen Vertreter entsendet (das Parlament hat also genau m Mitglieder). Um von Anfang an Gleichberechtigung zu demonstrieren, soll dabei der Anteil von Frauen und Männern ausgewogen sein. Man entschließt sich daher, Obergrenzen bF und bM (jeweils etwas mehr als m 2 , um die Parlamentsbildung leichter zu machen) für die Anzahl von Frauen bzw. Männern im Parlament festzusetzen. Können Sie dem brutopischen Volk helfen, ein Übergangsparlament zu bestimmen, indem Sie das Problem als Netzwerkflussproblem formulieren? Beachten Sie, dass jeder Brutopier Mitglied mehrerer gesellschaftlicher Gruppierungen sein kann. 17 MaxFlowMinCut-Theorem Definition 6 (Schnitt, Kapazität) Eine Menge X ⊆ V mit s ∈ X und t ∈ V \ X heißt s-t-Schnitt (engl. cut). Die Kapazität von X ist definiert durch X cap(X) := c(u, v). u∈X,v∈N + (u)\X Lemma 2 Sei N ein Netzwerk und f ein Fluß in N und X ein beliebiger s-t-Schnitt. Dann gilt X X val(f ) = f (x, y) − f (y, x). x∈X,y∈N + (x)\X x∈X,y∈N − (x)\X Satz 2 (MaxFlowMinCut-Theorem) Sei N ein Netzwerk. Dann gilt: max f : s-t-Fluss in N val(f ) = min X: s-t-Schnitt in N cap(X) Übung 4.2 Bestimmen Sie einen minimalen Schnitt im folgenden Graphen. Wie groß ist der maximale s,t-Fluss? Können Sie anhand eines oder mehrerer minimaler Schnitte einen maximalen s,t-Fluss bestimmen? 2 v1 2 v4 1 7 5 s v3 3 4 t 4 5 6 6 v2 v5 3 18 Der Algorithmus von Ford-Fulkerson Definition 7 (Restnetzwerk) ~ s, t, c) ein Netzwerk und f ein Fluss in N . Sei N = (V, E, ~ f , s, t, cf ), Das Restnetzwerk von N bezüglich f ist definiert als Nf := (V, E ~ wobei wir zunächst die Kapazitätsfunktion c mittels c(x, y) := 0 für (x, y) ∈ / E auf ganz V × V erweitern. Dann setzen wir falls f (x, y) > 0 c(x, y) − f (x, y) c(x, y) + f (y, x) falls f (y, x) > 0 cf (x, y) := c(x, y) sonst ~ f := {(x, y) : cf (x, y) > 0}. sowie E Lemma 3 Wenn f ein Fluss in N und W ein gerichteter Pfad im Restnetzerk Nf sind, dann sei 0 < δ := mine∈W cf (e) und definiere f ′ wie folgt: 1. Falls (x, y) ∈ W und δ < f (y, x), setze f ′ (x, y) := 0 und f ′ (y, x) := f (y, x) − δ. 2. Falls (x, y) ∈ W und δ ≥ f (y, x), setze f ′ (x, y) := f (x, y) + δ − f (y, x) und f ′ (y, x) := 0. 3. Falls (x, y) 6∈ W und (y, x) 6∈ W , setze f ′ (x, y) := f (x, y). Dann ist f ′ ein Fluss in N mit val(f ′ ) > val(f ). (Wir sagen, dass wir f ′ aus f durch Augmentieren von f entlang von W erhalten haben.) Algorithmus 9 (Ford-Fulkerson) ~ s, t, c) Input: Netzwerk N = (V, E, Output: Fluss f ~ s, t, c)) Ford-Fulkerson(N = (V, E, (1) f := 0 (2) while ∃ s-t-Pfad W in Nf (3) augmentiere f entlang von W wie in Lemma 3 Satz 3 Sei N ein Netzwerk P mit Kapazitäten aus N0 . Dann terminiert Algorithmus 9 c(u, v)) Schritten mit einem Fluss maximalen Werts. nach höchstens O( u,v∈V 19 Übung 4.3 Betrachten sie das folgende Netzwerk N mit den angegebenen Flusskapazitäten: 12 v1 v4 20 16 s 4 10 9 t 7 4 13 v2 v3 14 Berechnen Sie mit Hilfe des Algorithmus von Ford-Fulkerson einen maximalen Fluss von N . Geben Sie dabei in jedem Schritt das Restnetzwerk und den augmentierenden Pfad an. 20 Schichtnetzwerk und der Algorithmus von Dinic Definition 8 (Saturiert, Schichtnetzwerk, Durchsatz) ~ s, t, c) ein Netzwerk und f ein Fluss in N . Sei N = (V, E, • Der Fluss f heißt saturiert, wenn es im Restnetzwerk Nf keinen f -augmentierenden Pfad gibt, der nur Kanten aus N benutzt. ~ f , s, t, cf ) • Das geschichtete Restnetzwerk ist definiert als GNf = (V ′ , GE mit k := distNf (s, t), V0 := {s}, V ′ := V0 ∪· · ·∪Vk , Vk := {t}, Vi := {x ∈ V : distNf (s, x) = i}, n o ~ f := (x, y) ∈ E ~ f : x ∈ Vi , y ∈ Vi+1 , 0 ≤ i ≤ k − 1 . GE • Der Durchsatz eines Knotens v 6∈ {s, t} ist definiert als X X DS(v) := min{ cf (x, v), cf (v, x)}, ~f (x,v)∈GE für s bzw. t setzen wir X DS(s) := cf (s, x) ~f (v,x)∈GE und ~f (s,x)∈GE DS(t) := X cf (x, t). ~f (x,t)∈GE Funktionsweise Dinic: • Berechne in jeder Runde einen saturierten Fluss in GNf . • Verwendet die Subroutinen MaxFlow, PushFlow und PullFlow. • MaxFlow sucht wiederholt Knoten mit minimalem Durchsatz und ruft PushFlow und PullFlow auf, bis in GNf kein s-t-Pfad mehr existiert. • PushFlow drückt eine Ladung der Größe DS(v) vom Knoten v bis zum Knoten t entlang der Kanten von GNf . PullFlow zieht dieselbe Ladung von v nach s. • Anschließend berechnet Dinic GNf neu. • Insgesamt entsteht dadurch ein Fluss maximalen Wertes. Laufzeit: 2 O(n3 ) (bei 0-1 Kapazitäten O(n 3 m)) 21 Algorithmus 10 ~ f , s, t, cf ), Knoten v, Fluss g Input: GNf = (V ′ , GE Output: Fluss g PushFlow(v, g) (1) Q := {v}, push[v] := DS(v) (2) foreach x ∈ V ′ \ {v} do push[x] := 0 (3) while Q 6= {t} (4) v:=Dequeue (Q) (5) while push[v] 6= 0 ~f (6) wähle Kante (v, x) ∈ GE (7) if cf (v, x) ≥ push[v] then (8) push[x] := push[x] + push[v] (9) g(v, x) := g(v, x) + push[v] (10) push[v] := 0 (11) else (12) push[x] := push[x] + cf (v, x) (13) g(v, x) := g(v, x) + cf (v, x) (14) push[v] := push[v] − cf (v, x) (15) if x 6∈ Q then Enqueue (Q, x) (16) return g Algorithmus 11 ~ f , s, t, cf ) Input: GNf = (V ′ , GE Output: Fluss g ~ f , s, t, cf )) MaxFlow(GNf = (V ′ , GE (1) g := 0 (2) while es gibt s-t-Pfad in GNf (3) v:=Knoten mit minimalem Durchsatz (4) g := PushFlow (GNf , v, g) (5) g := PullFlow (GNf , v, g) (6) aktualisiere Kapazitäten in GNf (7) entferne rekursiv Knoten von Durchsatz 0 und (8) Kanten mit Kapazitäten 0 aus GNf (9) (aber berechne kein neues Restnetzwerk) Algorithmus 12 ~ s, t, c)) Dinic(N = (V, E, (1) f := 0 (2) while es gibt s-t-Pfad in GNf (3) f := f + MaxFlow (GNf ) (4) berechne GNf neu 22 Übung 4.4 Welche der folgenden Aussagen sind richtig? (a) Im nebenstehenden geschichteten Netzwerk wird durch einmaligen Aufruf von PushFlow und PullFlow ein Fluss mit Wert 9 erzeugt. 00000 11111 111111 000000 000000 111111 111111 000000 000000 111111 00000 11111 00000000000000 111111 11111111 000000 111111 000000 111111 0000 1111 00000 11111 000000 111111 0000000 1111111 000000 111111 000000 111111 0000 1111 00000 11111 000000 111111 0000000 1111 1111111 1111111111 00000000000000 4 4 5 4 4 4 s 5 5 5 t 4 (b) Im nebenstehenden geschichteten Netzwerk wird durch einmaligen Aufruf von PushFlow und PullFlow ein Fluss mit Wert 1 erzeugt. 1 1 1 1 s 1 1 1 t 1 1 1 (c) Im nebenstehenden geschichteten Netzwerk wird durch einmaligen Aufruf von PushFlow und PullFlow ein Fluss mit Wert 2 erzeugt. 1 2 s 3 2 1 t 3 1 2 2 1 1 (d) Das nebenstehenden Netzwerk stimmt mit seinem geschichteten Restnetzwerk zum Fluss mit Wert 0 überein. 1 1 s 1 1 1 1 1 1 1 1 t 1 1 23 Übung 4.5 Welche der folgenden Aussagen sind richtig? (a) Das Restnetzwerk eines Graphen zu gegebenem Fluss ist eindeutig. (b) Das geschichtete Restnetzwerke eines Graphen zu gegebenem Fluss ist eindeutig. (c) Ein Fluss hat genau dann maximalen Wert, wenn er saturiert ist. (d) Es kann in einem Netzwerk zwei saturierte Flüsse mit unterschiedlichem, nicht-maximalen Wert geben. (e) In den Restnetzwerken, die im Dinic-Algorithmus erzeugt werden, wächst die Distanz von s zu t stets streng. Übung 4.6 Betrachten Sie das nachfolgend abgebildete Netzwerk. Die Kapazitäten der Kanten stehen in den Kreisen, die anderen Zahlen geben den derzeitigen Fluss f an. Bestimmen Sie mithilfe des Algorithmus von Dinic einen maximalen Fluss. Geben Sie dabei die entsprechenden Restnetzwerke und die darin enthaltenen saturierenden Flüsse an. 24 5 Matchings Grundlegendes Definition 9 (Matching, maximales, größtes, perfektes, Matchingzahl) Sei G = (V, E) ein Graph. • Eine Menge M ⊆ E heißt Matching, falls • Eine Menge M ⊆ E heißt Matching, falls keine zwei Kanten aus M inzident sind, d.h. ∀e, e′ ∈ E, e 6= e′ : e ∩ e′ = ∅. • M heißt – maximales Matching, wenn für alle e ∈ E \ M gilt, dass M ∪ {e} kein Matching ist. – größtes Matching, wenn für alle Matchings M ′ von G gilt: |M | ≥ |M ′ |. – perfektes Matching, wenn 2|M | = |V | gilt. • Die Matchingzahl ist definiert als ν(G) := max{|M | : M ist Matching von G}, also als die Kardinalität eines größten Matchings von G. • Ein Knoten v heißt überdeckt von M , wenn es eine Kante e ∈ M mit v ∈ e gibt. Bemerkungen 1 1. Es gilt: M maximales Matching ⇐= M größtes Matching ⇐= M perfektes Matching 2. Sei τ (G) := min{ℓ ∈ N : es gibt eine Knotenüberdeckung der Größe ℓ in G}. die Knotenüberdeckungszahl. (a) Dann gilt: ν(G) ≤ τ (G) ≤ 2ν(G) (b) Ist G = (A ∪ B, E) bipartit, dann gilt ν(G) = τ (G). 25 Übung 5.1 Sei G ein beliebiger Graph auf n Knoten. Welche der folgenden Aussagen sind richtig? (α(G) := max{k ∈ N : ∃k-stabile Menge in G} (Stabilitätszahl)) (a) α(G) ≤ τ (G). (b) α(G) ≤ n − τ (G). (c) α(G) ≥ n − τ (G). Sei G = (A ∪ B, E) ein bipartiter Graph auf 2n Knoten. Welche der folgenden Aussagen sind richtig, welche falsch? (d) Wenn α(G) = n ist, so besitzt G ein perfektes Matching. (e) Wenn G ein perfektes Matching besitzt, so ist α(G) = n. 26 Der Flussalgorithmus Funktionsweise: • Überführe den bipartiten Graphen G = (A ∪ B, E) in ein Netzwerk N = ~ s, t, c) wie folgt (V ∪ {s, t}, E, b s c=1 b b b b b b .. . .. . b b b b b b b t c=1 c=1 A • Dann gilt max f Fluss in N B val(f ) = max M Matching in G |M |. • Berechne nun mit Dinic einen maximalen Fluss f in N . • Außerdem ist ~ ∩ (A × B) : f (e) = 1} M = {e ∈ E ein größtes Matching von G. • Berechne daher mit Dinic einen maximalen Fluss in N . Laufzeit: 2 O(n 3 m) Übung 5.2 Bestimmen Sie mit Hilfe des Flussalgorithmus ein maximales Matching im folgenden Graphen: 8 6 7 3 4 1 2 27 9 5 Augmentierende Pfade und der Algorithmus von Hopcraft und Karp Definition 10 (Alternierende und Augmentierende Pfade) Sei M ein Matching in G = (V, E). • Ein Pfad in G heißt M -alternierend, falls er abwechselnd Kanten aus M und E \ M benutzt. • Ein Pfad in G der Länge ≥ 1 heißt M -augmentierend, falls er M -alternierend ist und Anfangs- und Endknoten nicht von M überdeckt sind. Definition 11 Sei M ein Matching in G. Dann sei ∞ falls M größtes Matching ℓ(M ) := min{ℓ(P ) : P ist M -augm. Pfad} sonst Algorithmus 13 (Hopcroft-Karp) Input: Graph G = (A ∪ B, E) Output: Matching M Hopcroft–Karp(G = (A ∪ B, E)) (1) M := ∅ (2) while ℓ(M ) < ∞ (3) S:= nicht von M -überdeckte Knoten in A (4) T := Knoten, die von S aus über M -augmentierende Pfade der Länge ℓ(M ) erreichbar sind. (5) bestimme mittels DFS ausgehend von den Knoten in T eine inklusionsmaximale Menge knotendisjunkter M -augmentierender Pfade der Länge ℓ(M ) (6) augmentiere alle diese Pfade gleichzeitig Satz 4 Algorithmus 13 findet in einem bipartiten Graphen ein größtes Matching und √ lässt sich mit einer Laufzeit von O( nm) Schritten implementieren. Übung 5.3 Gegeben sei der folgende Graph: (a) Gibt es eine Möglichkeit für HopkroftKarp, nach einer Augmentationsphase ein größtes Matching in G gefunden zu haben? (b) Gibt es eine Möglichkeit für HopkroftKarp, mehere Augmentationsphasen zu brauchen, um in G ein größtes Matching zu finden? 28 Der Satz von Hall Satz 5 (Heiratssatz von Hall) Sei G = (A ∪ B, E) ein bipartiter Graph. Dann gilt: G hat genau dann ein perfektes Matching, wenn (i) |A| = |B| (< ∞) (ii) ∀S ⊆ A : |S| ≤ |NG (S)|, (Hall − Bedingung) wobei NG (S) die Menge aller Knoten in B ist, die mindestens einen Nachbarn in der Menge S haben. Übung 5.4 (Ein unendliches Gegenbeispiel zum Satz von Hall) Finden Sie einen bipartiten Graphen G = (A ∪ B, E) mit unendlichen Knotenmengen A und B und der Eigenschaft |Γ(S)| ≥ |S| für jedes endliche S ⊆ A und jedes endliche S ⊆ B, sodass G kein perfektes Matching enthält. Übung 5.5 Bei einer Weihnachtsfeier soll jedes Kind genau vier Geschenke erhalten. Es gibt daher viermal so viele Geschenke wie Kinder. Natürlich darf ein Kind dabei nur solche Geschenke bekommen, die es mag, sonst fängt es an zu weinen. Geben Sie eine hinreichende und notwendige Bedingung dafür an, dass alle Geschenke verteilt werden und kein Kind weint, und beweisen Sie deren Korrektheit. Übung 5.6 Welche der folgenden Aussagen sind richtig? (a) Jeder 2-reguläre Graph mit perfektem Matching ist bipartit. (b) Jeder r-reguläre bipartite Graph besitzt ein perfektes Matching. (c) Jeder 3-reguläre Graph besitzt ein perfektes Matching. 29