Folien 7

Werbung
2.4 Algorithmus von Dinic
5. Dezember 2016
Algorithmus 2.4.1:
Gegeben: zulässiger s − t Fluss in D = (V , E ) bezüglich `ij , cij .
(1) Konstruktion eines Hilfsgraphen Df (Schichtgraph).
(1.1) Berechne alle nützlichen Kanten
mit
(i, j)
mit
xij < cij
und
(j, i)
xij > `ij .
(1.2) Bestimme im Graphen der nützlichen Kanten die Entfernungen
s zu j )
j = 1, . . . , n.
Berechne `.te Schichten V` = {j ∈ V |uj = `} für alle
` = 0, 1, . . ..
V (Df ) = V (D) und E (Df ) besteht aus allen nützlichen
uj
(d.h. Anzahl der Kanten im kürzesten Weg von
für
alle
(1.3)
(1.4)
Kanten zwischen zwei aufeinanderfolgenden Schichten (d.h.
von
(1.5) Ist
t
nach V`+1 ) .
nicht erreichbar (d.h.
V`
t 6∈ ∪` V` ),
so ist der Fluss
f
maximal und breche Algorithmus ab. Ansonsten setze `¯ij = 0
und c̄ij = cij − xij falls xij < cij bzw. c̄ji = xij − `ij falls xij > `ij .
Fortsetzung Algorithmus 2.4.1:
(2) Suche in Df einen zulässigen Fluss f¯, der in jedem s − t Weg
eine Kante saturiert (sättigt); d.h. für jeden Weg W in Df
existiert eine Kante (i, j) auf W mit x̄ij = c̄ij . (Details von
Schritt (2) kommen später).
Beachte: f¯ ist i.a. kein maximaler Fluss.
(3) Erhöhe f um f¯; d.h. setze f (e) = f (e) + f¯(e) für
Vorwärtskante und f (e) = f (e) − f¯(e − ) für Rückwärtskante.
(4) Gehe zu (1).
Beispiel 2.4.2:
Fortsetzung zum Beispiel:
Denition 2.4.3:
Eine Phase im Algorithmus 2.4.1 sei eine Durchführung der Schritte
(1) − (3).
Lemma 2.4.4:
Die Länge des Schichtgraphen (d.h. die Anzahl der Schichten)
wächst in jeder Phase um mindestens 1 (bis auf die letzte Phase).
D.h. es gibt maximal n Phasen.
Beweisidee:
In jedem Weg in Df wird eine Kante gesättigt. Diese fehlen im
nächsten Schritt als nützliche Kanten. Es können aber nützliche
Rückwärtskanten hinzukommen. Bzgl. der Schichten laufen diese im
Graphen der nützlichen Kanten in Rückwärtsrichtung. (Details siehe
Übung).
Fortsetzung zu Beispiel:
Algorithmus 2.4.5: (Details zu Schritt (2))
(2.1) Berechne IP(j) (In-Potential) und OP(j) (Out-Potential); d.h.
den Gesamtuss möglich in j hinein bzw. aus j heraus. Setze
IP(s) = OP(t) = ∞ und P(j) = min(IP(j), OP(j)).
(2.2) Wähle einen Knoten j mit kleinstem Potential P(j). Schicke
Fluss der Stärke P(j) rückwärts nach s und vorwärts nach t
(dabei arbeite Kanten nacheinander ab und versuche Kanten
zu sättigen; berechne dabei gleichzeitig neue Potentiale und
Kapazitäten).
(2.3) Falls Knotenpotential 0 wird, lösche Knoten und adjazente
Kanten. Falls Kante gesättigt wird, lösche Kante.
(2.4) Falls noch ein Weg von s nach t in Df existiert, so gehe nach
(2.2).
(2.5) Berechne Gesamtuss als Summe aller konstruierten Flüsse.
Beispiel 2.4.6:
Fortsetzung zu Beispiel:
Satz 2.4.7:
Der Algorithmus von Dinic hat eine Laufzeit von O(|V |2 |E |).
Beweis:
Bemerkung 2.4.8:
Durch eine genauere Analyse erhält man sogar O(|V |3 ) als
Abschätzung für die Laufzeit vom Dinic Algorithmus.
Schnellere Algorithmen für Maximum Fluss Problem:
I
O(nm log2 n) Galil, Naamad 1980
I
O(n3 / log n) Cheriyan, Hagerup, Mehlhorn 1990.
I
O(nm + n2+ ) King, Rao, Tarjan 1992.
I
O ∗ (min(n2/3 , m1/2 )m) (gzz. Kapazitäten) Goldberg, Rao 1998.
I
O(nm) (gzz. Kapazitäten) Orlin 2012.
Herunterladen