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