Gegenbeispiel zu ¨Ubungsblatt 3

Werbung
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 |!!!
Herunterladen