Institut für Theoretische Informatik Lehrstuhl Prof. Dr. D. Wagner Gegenbeispiel zu Übungsblatt 3 - Problem 2 Vorlesung Algorithmentechnik im WS 09/10 Problem 2: Algorithmus von Goldberg und Tarjan – Maximale Flüsse [vgl. Kapitel 4.2.3 im Skript] Die Grundidee des Algorithmus von Goldberg und Tarjan basiert auf Präflüssen und Push- und Relabel-Operationen. Algorithmen, die dieses Grundkonzept nutzen, nennt man daher auch PreflowPush- oder Push-Relabel -Algorithmen. Gegeben sei nun ein Flussnetzwerk (D; s, t; c) bzw. dessen Erweiterung (D0 ; s.t; c0 ) und ein darin mit einem Push-Relabel -Algorithmus berechneter maximaler Fluss (d.h. die Abbildungen f , rf , e und dist stehen bezüglich des fertig berechneten Flusses zur Verfügung). Entwickeln Sie einen möglichst schnellen Algorithmus um die Knotenpartition eines zugehörigen minimalen s-t-Schnitts (S, T ) zu berechnen. Geben Sie Ihren Algorithmus in Pseudocode an. Begünden Sie die Laufzeit und die Korrektheit Ihres Algorithmus (Hinweis: Es gibt einen Algorithmus in O(|V |)). Lösung. siehe Lösungsvorschlag zu Blatt 3. In der Übung wurde folgende alternative Vorgehensweise zur Bestimmung der Partition eines zugehörigen minimalen Schnittes vorgeschlagen: Sortiere alle Knoten u mit dist(u) ≥ |V | auf die Seite der Quelle s und alle übrigen Knoten v mit dist(v) < |V | auf die Seite der Senke t. Die Partition (S, T ) mit S := {u ∈ V | dist(u) ≥ |V |} und T := {v ∈ V | dist(v) < |V |} induziert im Allgemeinen jedoch KEINEN minimalen s-t-Schnitt, wie das folgende Gegenbeispiel zeigt!!! Bemerkung: Punkt 2 der Bemerkung 4.19 im Skript impliziert NICHT, dass für jeden Knoten v mit dist(v) < |V | ein Pfad zu t im Residualgraph existiert! Gegenbeispiel: Das hier vorgestellte Gegenbeispiel benutzt als Preflow-Push-Algorithmus den im Skript vorgestellten Algorithmus von Goldberg und Tarjan (Algorithmus 35, sowie 36 und 37). Das zugrundeliegende Netzwerk D = (V, E) wird im Folgenden durch schwarze, durchgezogene Kanten beschrieben, gestrichelte Kanten wurden im Zuge der Erweiterung des Netzwerks zu D0 = (V, E 0 ) zusätzlich eingefügt (siehe Beschreibung der Grundidee). Die Kantenkapazitäten sind in Klammern notiert, der aktuelle Fluss auf der jeweiligen Kante ist ohne Klammern angegeben. Aktuell saturierte Kanten sind rot eingefärbt. Grüne, den Knoten zugeordnete Werte in eckigen Klammern beschreiben die aktuellen Distanzlabel, rote Werte hinter den Distanzlabeln zeigen einen eventuellen Flussüberschuss an. Die aktuell aktiven Knoten sind grau dargestellt. 1 0) (10 ) (10 (100) (100) (10) s 1 (1) (10 (1) (100) s t (1) (10) (0) (10 ) (1) (100) (100) (10) (100) 4 (1) (100) (100) (0) (10 ) (0) (1) (100) (100) (100) 4 5 (100) (b) Erweitertes Netzwerk D0 = (V, E 0 ). Zu Beginn: Quelle s wird auf dist(s) = 7 = |V | angehoben, noch kein Fluss im Netzwerk. 1 100 s ) 10) 0 00 (0) 00 (0) 00 0) 00 (1 00 (10) (0) 2 (10 ) 00 (0 ) 00 (1) [0] 00 (0) t 00 (1) [0] 00 (0) 00 (100) 00 (100) 00 (1 ) [0] 00 (100) 00 (100) 3 00 [0] 00 (100) 00 (100) 0( [7] (0) 5 (100) (a) Netzwerk D = (V, E). ( 00 t (1) (10) 3 (0) (1) (0) 2 (0) 3 (100) (100) ) 2 (100) 0) (10 [0] 1) 00 (100) 4 [0] 5 00 (100) Netzwerk wird von s aus geflutet, e(1) = e(2) = e(3) = e(4) = 10, rf (s, 1) = rf (s, 2) = rf (s, 3) = rf (s, 4) = 0. ( 00 0) ( 00 1 100 0( −1 10 [7] s ) −10 (0) 0) 10 (1 10 (10) −10 ( 2 3 10 0 (0 (10 ) ) 00 (0 ) 00 (1) [0] 00 (0) t 00 (1) [0] 10 00 (0) 00 (100) 00 (100) 00 (1 ) [0] 10 00 (100) 00 (100) 0) −1 00 (100) 00 (100) ) (10 [0] 10 [0] 10 1) [0] 00 (100) 4 ( 00 0) ( 00 5 00 (100) Betrachte nacheinander die aktiven Knoten 1, 2, 3 und 4: Relabel jeweils Knoten 1, 2 und 3 zu dist(1) = dist(2) = dist(3) = 1. Push jeweils Fluss mit Kapazität 1 nach t, e(1) = e(2) = e(3) = 9, rf (1, t) = rf (2, t) = rf (3, t) = 0, Relabel Knoten 4 zu dist(4) = 1, Push gesamten Flussüberschuss nach 5, e(5) = 10. 1 0) (10 0 −1 10 [7] s −10 (0) −10 ( 0) 10 (1 10 (10) 2 3 10 0 (0 ) (10 ) [1] 9 00 (100) 00 (100) 0) −1 00 (100) 00 (100) ) (10 [1] 9 0−1 ( ) 01 (1) 0−1 (0 ) [0] t 01 (1) [1] 9 0−1 (0) 00 (100) 00 (100) 01 (1 0) [1] 1) 10 (100) 4 [0] 10 ( 00 0) ( 00 5 −10 (100) Betrachte nacheinander die aktiven Knoten 1, 2, 3 und 4: Relabel Knoten 1 zu dist(1) = 2, Push gesamten Flussüberschuss nach 2. Relabel Knoten 2 zu dist(2) = 2, Push gesamten Flussüberschuss nach 3. Relabel Knoten 3 zu dist(3) = 2, Push gesamten Flussüberschuss nach 4. Von Knoten 4 Push gesamten Flussüberschuss nach 5, e(5) = 37. 1 100 0( −1 1 −10 (0) ) 0 (10 2 1 10 (10) −10 ( 3 10 0 (0 (10 ) ) [2] 18 (100) −18 (100) 0) −1 09 (100) −9 (100) 0) 0 (1 [7] s ) [2] 0−1 ( ) 01 (1) 0−1 (0 ) [0] t 01 (1) [2] 0−1 (0) 27 (100) −27 (100) 01 (1 0) [1] 1) [0] 37 37 (100) 4 ( 00 0) ( 00 5 −37 (100) Betrachte aktiven Knoten 5: Relabel 5 zu dist(5) = 1. Push Fluss mit Kapazität 1 nach t, e(5) = 36, rf (5, t) = 0. Betrachte aktiven Knoten 5: Relabel 5 zu dist(5) = 2. Push gesamten Flussüberschuss nach 4, e(4) = 36. Betrachte nacheinander die aktiven Knoten 4, 3 und 2: Relabel Knoten 4 zu dist(4) = 3, Push gesamten Flussüberschuss nach 3. Relabel Knoten 3 zu dist(3) = 3, Push gesamten Flussüberschuss nach 2. Relabel Knoten 2 zu dist(2) = 3, Push gesamten Flussüberschuss nach 1, e(1) = 36. 1 0) (10 0 −1 1 [7] s −10 (0) −10 ( 0) 10 (1 10 (10) 2 3 10 0 (0 ) (10 ) [3] 18 (100) −18 (100) 0) −1 27 (100) −27 (100) 0) 0 (1 [2] 36 0−1 ( ) 01 (1) 0−1 (0 ) [0] t 01 (1) [3] 0−1 (0) 9 (100) −9 (100) 01 (1 0) [3] 1) 1 (100) 4 [2] 1( −1 (0) 5 −1 (100) Betrachte nacheinander die aktiven Knoten 1, 2, 3, 4 und 5: Relabel Knoten 1 zu dist(1) = 4, Push gesamten Flussüberschuss Relabel Knoten 2 zu dist(2) = 4, Push gesamten Flussüberschuss Relabel Knoten 3 zu dist(3) = 4, Push gesamten Flussüberschuss Von Knoten 4 Push gesamten Flussüberschuss nach 5. Relabel Knoten 5 zu dist(5) = 4, Push gesamten Flussüberschuss e(4) = 36. nach 2. nach 3. nach 4. nach 4, 1 0) (10 0 −1 10 [7] s −10 (0) 0) 10 (1 10 (10) −10 ( 2 3 10 0 (0 (10 ) ) [4] 18 (100) −18 (100) 0) −1 9 (100) −9 (100) ) (10 [4] 0−1 ( ) 01 (1) 0−1 (0 ) [0] t 01 (1) [4] 0−1 (0) 27 (100) −27 (100) 01 (1 0) [3] 36 1) [4] 1 (100) 4 1( −1 (0) 5 −1 (100) Betrachte nacheinander die aktiven Knoten 4, 3 und 2: Relabel Knoten 4 zu dist(4) = 5, Push gesamten Flussüberschuss Relabel Knoten 3 zu dist(3) = 5, Push gesamten Flussüberschuss Relabel Knoten 2 zu dist(2) = 5, Push gesamten Flussüberschuss e(1) = 36. Betrachte nacheinander die aktiven Knoten 1, 2, 3 und 4: Relabel Knoten 1 zu dist(1) = 6, Push gesamten Flussüberschuss Relabel Knoten 2 zu dist(2) = 6, Push gesamten Flussüberschuss Relabel Knoten 3 zu dist(3) = 6, Push gesamten Flussüberschuss Von Knoten 4 Push gesamten Flussüberschuss nach 5, e(5) = 36. 1 0) (10 0 −1 0) 0 (1 1 [7] s −10 (0) −10 ( 0) 10 (1 10 (10) 2 0) 3 −1 10 0 (0 ) (10 ) [6] 18 (100) −18 (100) 0−1 ( 01 (1 0) ) 01 (1) 0−1 (0 ) [0] t 01 (1) [6] 0−1 (0) 27 (100) −27 (100) nach 2. nach 3. nach 4. [6] 9 (100) −9 (100) nach 3. nach 2. nach 1. [5] 1) 37 (100) 4 [4] 36 1( −1 (0) 5 −37 (100) Betrachte nacheinander die aktiven Knoten 5, 4, 3 und 2: Relabel Knoten 5 zu dist(5) = 6, Push gesamten Flussüberschuss Relabel Knoten 4 zu dist(4) = 7, Push gesamten Flussüberschuss Relabel Knoten 3 zu dist(3) = 7, Push gesamten Flussüberschuss Relabel Knoten 2 zu dist(2) = 7, Push gesamten Flussüberschuss e(1) = 36. nach nach nach nach 4. 3. 2. 1, 1 100 0( −1 10 [7] s ) −10 (0) 0) 10 (1 10 (10) −10 ( 2 3 10 0 (0 (10 ) ) [7] 18 (100) −18 (100) 0) −1 27 (100) −27 (100) ) (10 [6] 36 0−1 ( ) 01 (1) 0−1 (0 ) [0] t 01 (1) [7] 0−1 (0) 9 (100) −9 (100) 01 (1 0) [7] 1) [6] 1 (100) 4 1( −1 (0) 5 −1 (100) Betrachte aktiven Knoten 1: Relabel Knoten 1 zu dist(1) = 8, Push gesamten Flussüberschuss nach s, rf (s, 1) = 36 6= 0. 1 100 ( 26 [7] s − ) 26 ( −10 (0) −10 ( 0) 10 (1 10 (10) 2 3 10 0 (0 ) (10 ) [7] 18 (100) −18 (100) 0) −1 27 (100) −27 (100) 10) [8] 0−1 ( ) 01 (1) 0−1 (0 ) [0] t 01 (1) [7] 0−1 (0) 9 (100) −9 (100) 01 (1 0) [7] 1) 1 (100) 4 [6] 1( −1 (0) 5 −1 (100) Insgesamt: Einziger minimaler Schnitt ist (S, T ) mit S := {s, 1, 2, 3, 4, 5} und T := {t}, mit Gewicht c(S, T ) = 4. ABER Knoten 5 hat Distanzlabel dist(5) = 6 < 7 = |V |!!!