Algorithmentheorie 13 - Maximale Flüsse Prof. Dr. S. Albers Prof. Dr. Th. Ottmann WS03/04 1 1. Maximale Flüsse in Netzwerken 12 4 5 9 4 t 2 10 9 s 15 4 5 8 WS03/04 3 5 10 7 2 3 3 5 5 8 2 Netzwerke und Flüsse N = (V,E,c) gerichtetes Netzwerk G = (V,E) gerichteter Graph, c: E → R+ Kapazitätsfunktion s,t ∈ V, s Quelle , t Senke Zulässiger (s,t)-Fluss: f: E → R a) 0 ≤ f (e) ≤ c(e) ∀e ∈ E Kapazitätsbeschränkung b) ∑ f(e) = ∑ f(e) e∈ein(v) e∈aus(v) ∀v ∈ V-{s, t} Flusserhaltung ein(v) = {Kanten in v hinein} WS03/04 aus (v) = {Kanten aus v heraus} 3 Beispiel 12/2 4 5/5 9 10/9 3/3 4/4 10/4 9/4 s 4/4 5 8 WS03/04 3/3 5 3 7/4 2/2 5 t 2 15/1 5/5 8 4 Doppelkanten O.B.d.A. hat der Graph keine Doppelkanten. WS03/04 5 Der Wert eines Flusses Sei f ein zulässiger Fluss Dann ist sein Wert: W( f ) = ∑ f ( e) − ∑ f ( e) e∈aus ( s ) e∈ein ( s ) Das Max-Fluss Problem: Berechne einen zulässigen Fluss maximalen Werts. WS03/04 6 2. Schnitte Definition: Ein (s,t)-Schnitt ist eine Partition S,T von V, d.h. V = S ∪ T, S ∩ T = ∅ , so dass s ∈ S, t ∈T. Kapazität eines Schnitts: C (S , T ) = ∑ c ( e) e∈E ∩( S ×T ) 1 10 1 s 10 t 10 10 2 WS03/04 7 Flüsse und Schnitte Lemma 1: Seien f ein zulässiger Fluss und (S,T) ein (s,t)-Schnitt. Dann gilt: W ( f ) ≤ C (S , T ) Beweis: W( f ) = ∑ f ( e) − ∑ f ( e ) e∈aus ( s ) WS03/04 e∈ein ( s ) 8 3. Algorithmische Idee Zunehmende Wege: Finde Wege, entlang deren der Fluss erhöht werden kann. 1 10/1 1/1 s 10/0 t 10/1 10/0 2 WS03/04 9 Zunehmende Wege 1 10/10 1/1 s 10/9 t 10/10 10/9 2 WS03/04 10 4. Restnetzwerke Restnetzwerk RN bzgl. eines zulässigen Flusses f: E1 = { (v,w) : (v,w) = e ∈ E und f(e) < c(e)} E2 = { (w,v) : (v,w) = e ∈ E und f(e) > 0} Für e = (v,w) ∈ E verwende e1 für (v,w) ∈ E1 e2 für (w,v) ∈ E2 c : E1 ∪ E2 → R + (sofern existent) (sofern existent) c (e1 ) = c(e) − f (e) für e1 ∈ E1 c (e2 ) = f (e) für e2 ∈ E2 RN = (V, E1∪ E2, c) WS03/04 11 Beispiel 1 10/1 1/1 s 10/0 t 10/0 10/1 2 1 s t 2 WS03/04 12 Beispiel 10/10 1 1/1 s 10/9 t 10/9 10/10 2 1 s t 2 WS03/04 13 Schichtnetzwerke V0 = {s} Vi +1 = {w ∈ V − (V0 ∪ K ∪ Vi ); ∃v ∈ Vi : (v, w) ∈ E1 ∪ E2 } für i ≥ 1 V = U Vi i ≥0 SN = V , (E1 ∪ E2 ) ∩ U (Vi × Vi +1 ), c i ≥0 WS03/04 14 Beispiel 1 10/1 1/1 s t 10/1 10/0 2 WS03/04 10/0 1 9 1 s 10 1 2 10 t 1 9 15 Beispiel 1 10/10 s 1/1 t s 9 10/10 10/9 2 WS03/04 10/9 10 1 1 1 9 1 t 10 2 16 Maximale Flüsse Lemma 2: Sei f ein zulässiger (s,t)-Fluss in N und sei das Schichtnetzwerk bzgl. f. SN = (V , E , c ) a) f ist ein maximaler Fluss gdw. t ∉V b) Sei f ein zulässiger (s,t)-Fluss in SN. Dann ist f ´: E R mit f ' (e) = f (e) + f (e1 ) − f (e2 ) ein zulässiger (s,t)-Fluss in N mit W ( f ' ) = W ( f ) + W ( f ) Definiere f (ei) = 0 für ei ∉ WS03/04 E. 17 Beispiel 1 10/10 s 1/0 t 10/10 10/10 2 WS03/04 10/10 10 s 1 10 1 10 2 t 10 18 Beweis, Teil b) Beweis: b) Kapazitätsbedingungen. Sei e ∈ E, dann gilt: WS03/04 19 Beweis, Teil b) Für jeden Knoten v ∈ V gilt: ∑ e∈aus ( v ) f ′(e ) − ∑ f ′(e) e∈ein ( v ) = Flusserhaltung : Wert : WS03/04 20 Beweis, Teil a) a) " ⇒" Sei t ∈ V . Dann existiert ein Weg P von s nach t in SN. s t ε = min. Kapazität von Kanten in P e auf P ε f (e ) = 0 e nicht auf P Also ist f nicht maximal. WS03/04 21 Beweis, Teil a) " ⇐" Setze S = V , T = V − S Dann gilt s ∈ S , t ∈ T , und (S , T ) ist ein (s, t ) − Schnitt. (E1∪E2) ∩ (S×T) = ∅ f(e) = c(e) für e ∈ S ×T f(e) = 0 für e ∈ T ×S W( f ) = ∑( e∈E ∩ S ×T ) f (e) − ∑( f )(e) = C (S , T ) e∈E ∩ T × S Da W(g) ≤ C(S,T) für jeden zulässigen Fluss g, ist f ein maximaler Fluss. WS03/04 22 Maximale Flüsse und minimale Schnitte Satz 1: Seien N = (V, E, c) ein Netzwerk und s, t ∈ V. fmax= max. Wert eines zulässigen (s,t)-Flusses cmin = min. Kapazität eines (s,t)-Schnittes. fmax = cmin Beweis: fmax und cmin existieren. Wegen Lemma 1 gilt fmax ≤ cmin Seien f ein Fluss mit W(f) = fmax und SN = (V,E,c) das Schichtnetzwerk bzgl. f. Setze S = V und T = V – S. Im Beweis von Lemma 2 zeigten wir: W( f ) = WS03/04 ∑( e∈E ∩ S ×T ) f (e) − ∑( f )(e) = C (S , T ) e∈E ∩ T × S 23 5. Blockierende Flüsse Definition: Ein zulässiger Fluss f in einem Schichtnetzwerk SN ist blockierend, wenn auf jedem Weg s = v0 e1 v1 e2 v2 e3 ek ..... vk = t von s nach t mindestens eine Kante gesättigt ist, d.h. f(ei) = c(ei) für mindestens ein i. 1 9/9 10/9 s t 10/9 V0 WS03/04 9/9 2 V1 V2 24 Algorithmus 1. f(e) 0 für alle e ∈ E; 2. Konstruiere Schichtnetzwerk SN = (V,E,c ) bzgl. f; 3. while t ∈ V do 4. Finde einen blockierenden Fluss f in SN; 5. Aktualisiere f gemäß f wie in Lemma 2b) beschrieben; 6. Konstruiere Schichtnetzwerk SN bzgl. f; 7. endwhile; Wie findet man einen blockierenden Fluss? Wie viele Iterationen? WS03/04 25 6. Die Tiefe eines Schichtnetzwerks Definition: Die Tiefe eines Schichtnetzwerks SN ist das k mit t ∈ Vk. Lemma 3: Sei ki die Tiefe des Schichtnetzwerks in der i-ten Iteration. Dann gilt ki > ki-1, für i ≥ 2. Beweis: Schichtnetzwerk in der i-ten Iteration: SNi Es existiert Weg P von s to t der Länge ki. s = v0 e1 v1 e2 v2 e3 ..... ek i −1 vki−1 ek i vk = t i dj = Schichtnummer von vj in SNi-1, 0 ≤ j ≤ ki dj = ∞ wenn vj kein Knoten in SNi-1 WS03/04 26 Die Tiefe eines Schichtnetzwerks Behauptung: Für alle i ≥ 2 gilt: a) Gibt es eine Kante von vj-1 nach vj in SNi-1, dann gilt dj = dj-1 + 1. b) Gibt es keine Kante von vj-1 nach vj in SNi-1 dann gilt dj ≤ dj-1 . c) ki-1 < ki Beweis: a) Offensichtlich. WS03/04 27 Teil b) b) Annahme: dj ≥ dj-1 +1 fi-1 ergibt SNi-1 fi ergibt SNi Ist (v j −1 , v j )∈ E ⇒ Ist (v j , v j −1 )∈ E ⇒ Also (vj, vj-1) ∈ Ei-1 Somit ist dj-1 = dj + 1 und dj = dj-1 –1 < dj-1 WS03/04 28 Teil c) c) Da v0 = s und d0 = 0, folgt aus a) und b), dass dj ≤ j, für 1 ≤ j ≤ ki. Somit ki-1 = dk ≤ ki. i Annahme: ki-1 = ki. Dann existiert ein Weg P in LNi-1. s = v0 WS03/04 e1 v1 e2 v2 e3 ..... ek i −1 vki−1 ek i vk = t i 29 Teil c) Da wir einen blockierenden Fluss in SNi-1 berechnen, gibt es eine gesättigte Kante vj-1 (v , v )∈ E (v , v )∈ E j −1 j WS03/04 j ⇒ j −1 ⇒ ej vj 30 Die Anzahl der Iterationen Korollar: Die Anzahl der Iterationen ist ≤ n. WS03/04 31 7. Blockierende Flüsse: DFS-Algorithmus 2 2 s 3 4 1 1 2 2 2 2 3 4 t 1 5 Beginne bei s und wähle stets die erste ausgehende Kante aus einem Knoten bis a) t erreicht oder b) Sackgasse v erreicht. (a) Bestimme die kleinste Kap. ε entlang d. Wegs. Erhöhe den Fluss um ε, vermindere die Kap. um ε und entferne gesättigte Kanten. (b) Gehe einen Knoten zurück, entferne v und seine eingehenden Kanten. WS03/04 32 Analyse Satz 2: Ein blockierender Fluss kann in Zeit O(ne) berechnet werden. Beweis: k =Tiefe des Schichtnetzwerks Konstruktion eines Wegs benötigt Zeit O(k + # durchlaufene Kanten, die in Sackgassen enden). Höchstens e Wege werden konstruiert. Gesamtzeit: O(ke + e) = O(ne) WS03/04 33 Verbesserter Algorithmus Arbeite mit dem Schichtnetzwerk. Potenzial eines Knotens v bzgl. f PO(v ) = min ∑ c(e ) − f (e ), ∑ c(e ) − f (e ) e∈ein (v ) e∈aus (v ) PO* = min {PO(v): v ∈ V} WS03/04 34 Verbesserter Algorithmus Wähle v mit PO(v) = PO*. Schiebe PO* Flusseinheiten von v in höhere Schichten. 4 4 2 2 2 Vl t 3 3 5 4 2 Vl-1 2 1 3 4 WS03/04 1 Vl+1 35 Verbesserter Algorithmus Schicht Vh: Menge Sh ⊆ Vh, die PO* zusätzliche Flusseinheiten hat. PO* = ∑ S [x], x∈S h S [x ] = Überfluss am Knoten x. Ziehe PO* Flusseinheiten nach v aus niedrigeren Schichten. Fluss erhöht sich um PO* Einheiten. Vereinfache das Netzwerk, indem gesättigte Kanten und Knoten mit Ein- oder Ausgangsgrad gleich 0 entfernt werden. (Mindestens ein Knoten wird entfernt.) WS03/04 36 Das Schieben von Fluss Algorithmus schiebe(x,S,h); \\ x ist Knoten in Schicht Vh und bei x sind S zusätzliche Flusseinheiten verfügbar. Diese werden in Knoten der Schicht Vh+1 geschoben. 1. while S >0 do 2. Sei e = (x,y) die erste aus x ausgehende Kante; δ min(S, c(e) – f(e)); 3. 4. Erhöhe den Fluss auf e um δ, vermindere c(e) um δ, füge y zu Sh+1 hinzu (falls noch nicht El.), erhöhe S[y] um δ; 5. S S - δ; 6. if c(e) = 0 then entferne e aus dem Graphen endif; 7. endwhile; 8. Entferne x aus Sh und setze S[x] auf Null; 9. if (aus(x) = ∅ und x ≠ t) or (ein(x) = ∅ und x ≠ s) then 10. Füge x zur Menge del hinzu; 11. endif; WS03/04 37 Algorithmus für blockierenden Fluss for all x ∈ V do S[x] 0 endfor; for all l, 0 ≤ l ≤ k, do Sl ∅ endfor; del ∅ while SN ist nicht leer do Berechne PO[v] für alle v ∈ V und PO* = min {PO[v]; v ∈ V}; Sei v ∈ Vl ein Knoten mit PO* = PO[v]; 6. S[v]PO*; Sl{v}; 7. for h von l bis k – 1 do 8. for all x ∈ Sh do schiebe(x,S[x], h) endfor; 9. endfor; 10. S[v]PO*; Sl{v} 11. for h von l bis 1 do 12. for all x ∈ Sh do ziehe(x,S[x],h) endfor; 13. endfor; 14. vereinfache(del) 15. endwhile; 1. 2. 3. 4. 5. WS03/04 38 Ergebnis Satz 3: Ein blockierender Fluss in einem Schichtnetzwerk kann in Zeit O(n2) berechnet werden. Beweis: 1-3: O(n) Schleife 4-15: O(n)-mal ausgeführt. Jede Ausführung kostet O(n), wenn wir schiebe, ziehe, vereinfache ignorieren. Alle Ausführungen von schiebe / ziehe benötigen Zeit O(n + e). Alle Ausführungen von vereinfache benötigen Zeit O(n + e). WS03/04 39 Ergebnis Satz 4: Ein maximaler Fluss kann in Zeit O(n3) berechnet werden. Beweis: Ein Schichtnetzwerk und ein blockierender Fluss können in Zeit O(n2) berechnet werden. WS03/04 40 8. d-beschränkte Netzwerke Definition: Sei d eine natürliche Zahl. N = (V,E,c) ist d-beschränkt, wenn c(e) ∈ {1,2,...,d} für alle e ∈ E. 1-beschränkte Netzwerke heißen (0,1)-Netzwerke. Anwendung unserer Flussalgorithmen auf d-beschränkte Netzwerke: alle berechneten Flüsse sind ganzzahlig, d.h. f(e) ∈ IN0 der maximale Fluss ist ganzzahlig WS03/04 41 d-beschränkte Netzwerke Satz 5: Ein blockierender Fluss kann in einem d-beschränkten Netzwerk in Zeit O(de) berechnet werden. Für d = 1 ergibt sich Zeit O(e). Beweis: DFS-Algorithmus Zeit für die Konstruktion eines Wegs: O(# Kanten auf s-t-Weg + # durchlaufenen Kanten, die in Sackgassen enden) Jede Kante ist in höchstens d Wegen enthalten. WS03/04 42 Maximale Flüsse in Restnetzwerken Lemma 4: Seien N ein Netzwerk und fmax der Wert eines maximalen (s,t)-Flusses. Seien RN das Restnetzwerk bzgl. eines Flusses f und fmax der Wert eines maximalen (s,t)-Flusses in RN. Dann gilt fmax = fmax + W(f). Beweis: Sei (S,V – S) ein (s,t)-Schnitt. C(S,V – S): Kapazität von (S,V – S) bzgl. N C(S,V – S): Kapazität von (S,V – S) bzgl. RN WS03/04 43 Also Cmin = Cmin − W ( f ), wobei Cmin , Cmin die minimalen Kapazitäten von (s, t ) − Schnitten in N bzw. RN sind. WS03/04 44 9. Einfache Netzwerke Definition: Ein Netzwerk N = (V,E,c) ist einfach, wenn indeg(v) = 1 oder outdeg(v) = 1 für alle v ∈ V. Satz 6: Sei N = (V,E,c) ein einfaches (0,1)-Netzwerk. Dann kann ein maximaler Fluss in Zeit O(n1/2e) berechnet werden. WS03/04 45 Restnetzwerke einfacher Netzwerke Behauptung: Sei N ein einfaches Netzwerk und f ein Fluss in N. Dann ist RN einfach. Beweis: Sei v ∈ V und indeg(v) = 1 (outdeg(v) = 1 analog). Ist f(e) = 0 für e ∈ ein(v), dann ist f(e´) = 0 für alle e´ ∈ aus(v), und v hat Eingangsgrad 1 in RN. 0 e 0 0 0 1 e 1 0 0 Ist f(e) = 1 für e ∈ ein(v), dann ist f(e´) = 1 für genau ein e´ ∈ aus(v), und v hat Eingangsgrad 1 in RN. WS03/04 46 Beweis von Satz 6 Blockierender Fluss kann in Zeit O(e) berechnet werden. Wir zeigen: # Iterationen = O(n1/2). fmax = Wert eines maximalen (s,t)-Flusses. fmax < n1/2: ok Angenommen fmax ≥ n1/2. Sei Iteration l diejenige, in der der Flusswert auf ≥ fmax – n1/2 ansteigt. Wir zeigen, dass das Schichtnetzwerk in Iteration l Tiefe ≤ n1/2 hat. f : zulässiger (s,t)-Fluss unmittelbar vor Iteration l RN: Restnetzwerk bzgl. f. WS03/04 47 Beweis von Satz 6 Wegen Lemma 4 gibt es in RN einen Fluss f mit Wert ( ) f max = f max − W ( f ) ≥ f max − f max − n1/ 2 = n1/ 2 O.B.d.A. ist f ganzzahlig, d.h. f(e) ∈ {0,1}. RN ist einfach, und daher läuft höchstens eine Flusseinheit durch jeden Knoten v ∈V – {s,t}. f besteht aus n1/2 knotendisjunkten Wegen von s nach t. Also gibt es einen Weg mit < n1/2 Zwischenknoten. WS03/04 48 10. Matchings in bipartiten Graphen G = (V,E) ungerichteter Graph. Matching M ist eine Kantenmenge M ⊆ E , so dass keine zwei Kanten e1, e2 ∈ M, e1≠e2 , einen gemeinsamen Endknoten haben. Ein maximales Matching ist ein Matching maximaler Kardinalität. WS03/04 49 Matchings in bipartiten Graphen Ein ungerichteter Graph G = (V,E) ist bipartit, wenn V = V1∪V2 für V1,V2 ⊆ V mit V1∩V2 = ∅ und E ⊆ V1× V2. WS03/04 50 Matchings in bipartiten Graphen Satz 7: Sei G = (V1∪V2,E),E ⊆ V1×V2, ein bipartiter Graph. Dann kann ein maximales Matching in Zeit O(n1/2e) berechnet werden. Beweis: Konstruiere einfaches Netzwerk wie folgt: (Alle Kapazitäten sind 1.) s WS03/04 t 51