Algorithmen zur Sperrflussberechnung

Werbung
Algorithmen zur Sperrflussberechnung
Sperrfluss-Methode (Dinitz)
1
2
3
4
5
6
∀e ∈ E : f (e) = 0
Solange es in Gf einen fvW gibt:
Berechne G∗f
Berechne Sperrfluss φ in G∗f
(
f (u, v) + φ(u, v) , φ(u, v) > 0
∀(u, v) ∈ E : (f + φ)(u, v) =
f (u, v) − φ(v, u) , φ(v, u) > 0
Ausgabe von f
Algorithmus: FB-Sperrfluss
1
2
3
4
5
6
7
8
9
∀e ∈ Ef∗ : φ(e) = 0
Berechne free-Werte für Kanten und Knoten in G∗f
Cleanup()
Solange free_A(q) > 0 :
Sei v ∗ Knoten mit free(v ∗ ) = min{free(v) > 0 | v ∈ V }
φ = Forward-Propagation(v ∗ , φ)
φ = Backward-Propagation(v ∗ , φ)
Cleanup()
Ausgabe von φ
Cleanup
1
2
3
4
5
6
7
8
9
10
Betrachte alle Knoten außer der Senke von unten nach oben im Niveaunetzwerk:
Falls free_A(v) = 0 und free_E(v) > 0:
∀(u, v) ∈ E(v) :
verringere free_A(u) um free(e)
setze free(e) = free_E(v) = 0
Betrachte alle Knoten außer der Quelle von oben nach unten im Niveaunetzwerk:
Falls free_E(v) = 0 und free_A(v) > 0:
∀(v, u) ∈ A(v) :
verringere free_E(u) um free(e)
setze free(e) = free_A(v) = 0
1
Forward-Propagation(v ∗ , φ)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
U (v ∗ ) = free(v ∗ )
∀v ∈ V, v 6= v ∗ : U (v) = 0
Füge v ∗ zu Q hinzu
Solange Q 6= ∅ :
Nimm Element aus Q, nenne es v
Solange U (v) > 0:
Sei e = (v, u) = next(A(v))
ψ = min{free(e), U (v)}
Falls ψ > 0:
φ(e) = φ(e) + ψ
U (v) = U (v) − ψ
U (u) = U (u) + ψ
free(e) = free(e) − ψ
free_A(v) = free_A(v) − ψ
free_E(u) = free_E(u) − ψ
Falls u 6= s und u ∈
/ Q:
Füge u zu Q hinzu.
Falls free(e) = 0:
Lasse next(A(v)) auf nächste Kante in A(v) zeigen
Ausgabe: φ
2
Herunterladen