]> mj.ucw.cz Git - ga.git/blob - 2-dinic/2-dinic.tex
58d7936fef656a5a4a6c6de3e769637cdd27213f
[ga.git] / 2-dinic / 2-dinic.tex
1 \input ../sgr.tex
2
3 \prednaska{2}{Dinicův algoritmus a jeho varianty}{}
4
5 Maximální tok v~síti už umíme najít pomocí Fordova-Fulkersonova algoritmu
6 z~minulé kapitoly. Nyní pojednáme o~efektivnějším Dinicově algoritmu
7 a o~různých jeho variantách pro sítě ve~speciálním tvaru.
8
9 \h{Dinicův algoritmus}
10
11 Dinicův algoritmus je založen na~následující myšlence: Ve~Fordově-Fulkersonově algoritmu
12 nemusíme přičítat jen zlepšující cesty, ale je možné přičítat rovnou zlepšující
13 toky. Nejlépe toky takové, aby je nebylo obtížné najít, a~přitom aby původní tok
14 dostatečně obohatily. Vhodnými objekty k~tomuto účelu jsou blokující toky:
15
16 \s{Definice:} {\I Blokující tok} je tok takový, že každá orientovaná $st$-cesta
17 obsahuje alespoň jednu nasycenou hranu. [Tj. takový tok, který by našel F-F algoritmus,
18 kdyby neuvažoval rezervy v~protisměru.]
19
20 \s{Algoritmus (Dinic):}
21
22 \algo
23 \:Začneme s~libovolným tokem~$f$, například prázdným (všude nulovým).
24 \:Iterativně vylepšujeme tok pomocí zlepšujících toků: {\I (vnější cyklus)}
25 \::Sestrojíme síť rezerv: vrcholy a hrany jsou tytéž, kapacity jsou určeny rezervami v~původní síti.
26 Dále budeme pracovat s~ní.
27 \::Najdeme nejkratší $st$-cestu. Když žádná neexistuje, skončíme.
28 \::Pročistíme síť, tj. ponecháme v ní pouze vrcholy a hrany na nejkratších $st$-cestách.
29 \::Najdeme v~pročištěné síti blokující tok $f_B$:
30 \:::$f_B \leftarrow \<prázdný tok>$
31 \:::Postupně přidáváme $st$-cesty: {\I (vnitřní cyklus)}
32 \::::Najdeme $st$-cestu. Např. hladově -- \uv{rovnou za nosem}.
33 \::::Pošleme co nejvíce po~nalezené cestě.
34 \::::Smažeme nasycené hrany. (Pozor, smazáním hran mohou vzniknout slepé uličky,
35 čímž se znečistí síť a nebude fungovat hladové hledání cest.)
36 \::::Dočistíme síť.
37 \::Zlepšíme $f$ podle $f_B$
38 \endalgo
39
40 \finalfix{\vskip-3pt}
41 \figure{dinic-cistasit.epdf}{Pročištěná síť rozdělená do vrstev}{0.4\hsize}
42 \finalfix{\vskip-6pt}
43
44 \s{Složitost algoritmu:}
45 Označme $l$ délku nejkratší $st$-cesty, $n$ počet vrcholů sítě a $m$ počet hran sítě.
46
47 \itemize\ibull
48 \:Jeden průchod vnitřním cyklem trvá $\O(l)$, což můžeme odhadnout jako $\O(n)$, protože vždy platí $l \leq n$.
49 \:Vnitřní cyklus se provede maximálně $m$-krát, protože se vždy alespoň jedna hrana nasytí
50   a ze sítě vypadne, takže krok~6 mimo podkroku~12 bude trvat $\O(mn)$.
51 \:Čištění a dočišťování sítě dohromady provedeme takto:
52   \itemize\ibull
53   \:Rozvrstvíme vrcholy podle vzdálenosti od $s$.
54   \:Zařízneme dlouhé cesty (delší, než do vrstvy obsahující $t$).
55   \:Držíme si frontu vrcholů, které mají $\deg^+ = 0$ či $\deg^- = 0$.
56   \:Vrcholy z~fronty vybíráme a zahazujeme včetně hran, které vedou do/z nich.
57     A případně přidáváme do~fronty vrcholy, kterým při tom klesl jeden ze stupňů na 0.
58     Vymažou se tím slepé uličky, které by vadily v podkroku~9.
59   \endlist
60   Takto kroky 5 a 12 dohromady spotřebují čas $\O(m)$.
61   \:Jeden průchod vnějším cyklem tedy trvá $\O(mn)$.
62   \:Jak za chvíli dokážeme, každým průchodem vnějším cyklem $l$ vzroste, takže průchodů
63     bude maximálně~$n$ a celý algoritmus tak poběží v~čase $\O(n^2m)$.
64 \endlist
65
66 \s{Korektnost algoritmu:}
67 Když se Dinicův algoritmus zastaví, nemůže už existovat žádná zlepšující cesta
68 (viz krok~4) a tehdy, jak už víme z~analýzy F-F algoritmu, je nalezený tok maximální.
69
70 \s{Věta:}
71 V~každém průchodu Dinicova algoritmu vzroste $l$ alespoň~o~1.
72
73 \proof
74 Podíváme se na~průběh jednoho průchodu vnějším cyklem.
75 Délku aktuálně nejkratší $st$-cesty označme~$l$.
76 Všechny původní cesty délky~$l$ se během průchodu zaručeně nasytí, protože
77 tok~$f_B$ je blokující. Musíme však dokázat, že nemohou vzniknout žádné
78 nové cesty délky~$l$ nebo menší. V~síti rezerv totiž mohou hrany nejen
79 ubývat, ale i přibývat: pokud pošleme tok po~hraně, po~které ještě nic
80 neteklo, tak v~protisměru z~dosud nulové rezervy vyrobíme nenulovou.
81 Rozmysleme si tedy, jaké hrany mohou přibývat:
82
83 Vnější cyklus začíná s nepročištěnou sítí. Příklad takové sítě je na~následujícím obrázku.
84 Po~pročištění zůstanou v~síti jen černé hrany, tedy hrany vedoucí z~$i$-té
85 vrstvy do~$(i+1)$-ní. Červené a modré\foot{Modré jsou ty, které vedou v rámci jedné vrstvy,
86 červené vedou zpět či za~spotřebič či do~slepých uliček. Při vytištění na papír vypadají všechny černě.}
87 se zahodí.
88
89 Nové hrany mohou vznikat výhradně jako opačné k~černým hranám (hrany ostatních barev
90 padly za oběť pročištění). Jsou to tedy vždy zpětné hrany vedoucí z~$i$-té vrstvy do~$(i-1)$-ní.
91 Vznikem nových hran by proto mohly vzniknout nové $st$-cesty, které používají
92 zpětné hrany. Jenže $st$-cesta, která použije zpětnou hranu, musí alespoň jednou skočit
93 o~vrstvu zpět a nikdy nemůže skočit o~více než jednu vrstvu dopředu, a~proto je její
94 délka alespoň $l+2$. Tím je věta dokázána. \qed
95
96 % posunut dále, aby vyšla sazba
97 \figure{dinic-neprocistenasit.epdf}{Nepročištěná síť. Obsahuje zpětné hrany, hrany uvnitř vrstvy a slepé uličky.}{0.45\hsize}
98
99 % HACK
100 \vskip -10pt
101
102 \figure{dinic-cestashranouzpet.epdf}{Cesta užívající novou zpětnou hranu}{0.4\hsize}
103
104 \h{Poznámky}
105
106 \itemize\ibull
107 \:Není potřeba tak puntičkářské čištění. Vrcholy se vstupním stupněm 0 nám
108    nevadí -- stejně se do nich nedostaneme. Vadí jen vrcholy s výstupním stupněm 0, kde by mohl
109    havarovat postup v podkroku 9.
110 \:Je možné dělat prohledávání a čištění současně. Jednoduše prohledáváním do~hloubky:
111    \uv{Hrrr na ně!} a když
112    to nevyjde (dostaneme se do slepé uličky), kus ustoupíme a při ústupu čistíme síť
113    odstraňováním slepé uličky.
114 \:Už při prohledávání si rovnou udržujeme minimum z rezerv a při zpáteční cestě
115    opravujeme kapacity. Snadno zkombinujeme s~prohledáváním do~hloubky.
116 \:V průběhu výpočtu udržujeme jen síť rezerv a tok vypočteme až nakonec z rezerv a kapacit.
117 \:Když budeme chtít hledat minimální řez, spustíme po~Dinicovu algoritmu ještě jednu iterací F-F
118    algoritmu.
119 \endlist
120
121 \h{Speciální sítě (ubíráme na obecnosti)}
122
123 Při převodu různých úloh na~hledání maximálního toku často dostaneme síť v~nějakém
124 speciálním tvaru -- třeba s~omezenými kapacitami či stupni vrcholů. Podíváme se
125 proto podrobněji na~chování Dinicova algoritmu v~takových případech a ukážeme,
126 že často pracuje překvapivě efektivně.
127
128 \s{Jednotkové kapacity:}
129 Pokud síť neobsahuje cykly délky~2 (dvojice navzájem opačných hran), všechny rezervy
130 jsou jen 0 nebo~1. Pokud obsahuje, mohou rezervy být i dvojky, a~proto síť upravíme tak,
131 že ke~každé hraně přidáme hranu opačnou s~nulovou kapacitou a rezervu proti směru
132 toku přiřkneme jí. Vzniknou tím sice paralelní hrany, ale to tokovým algoritmům
133 nikterak nevadí.%
134 \foot{Často se to implementuje tak, že protisměrné hrany vůbec nevytvoříme a když
135 hranu nasytíme, tak v~síti rezerv prostě obrátíme její orientaci.}
136
137 Při hledání blokujícího toku tedy budou mít všechny hrany na~nalezené $st$-cestě
138 stejnou, totiž jednotkovou, rezervu, takže vždy z~grafu odstraníme celou cestu.
139 Když máme $m$ hran, počet zlepšení po cestách délky $l$ bude maximálně $m/l$.
140 Proto složitost podkroků 9, 10 a 11 bude $m/l \cdot \O(l) = \O(m)$.%
141 \foot{Nebo by šlo argumentovat, tím že každou hranu použijeme jen $1\times$.}
142 Tedy pro jednotkové kapacity dostáváme složitost $\O(nm)$.
143
144 \s{Jednotkové kapacity znovu a lépe:}
145 Vnitřní cyklus lépe udělat nepůjde. Je potřeba alespoň lineární čas pro čištění.
146 Můžeme se ale pokusit lépe odhadnout počet iterací vnějšího cyklu.
147
148 Sledujme stav sítě po $k$ iteracích vnějšího cyklu a pokusme se odhadnout, kolik iterací
149 ještě algoritmus udělá. Označme~$l$ délku nejkratší $st$-cesty.
150 Víme, že $l>k$, protože v každé iteraci vzroste $l$ alespoň o 1.
151
152 Máme tok $f_k$ a chceme dostat maximální tok $f$. Rozdíl $f-f_k$ je tok v~síti rezerv
153 (tok v~původní síti to ovšem být nemusí!), označme si ho~$f_R$.
154 Každá iterace velkého cyklu zlepší $f_k$ alespoň o 1. Tedy nám zbývá ještě
155 nejvýše $\vert f_R \vert$ iterací.
156 Proto bychom chtěli omezit velikost toku $f_R$. Například řezem.
157
158 Najdeme v síti rezerv nějaký dost malý řez $C$. Kde ho vzít?\foot{Přeci v řeznictví. Kdepak, spíše v cukrárně.
159 Myslíte, že v cukrárně mají Dinicovy řezy? Myslím, že v cukrárně je většina řezů minimální. {\sl (odposlechnuto na~přednášce)}}
160 Počítejme jen hrany zleva doprava. Těch je jistě nejvýše $m$ a tvoří alespoň $k$ rozhraní mezi
161 vrstvami. Tedy existuje rozhraní vrstev
162 s~nejvýše $m/k$ hranami\foot{Princip holubníku a nějaká ta $\pm1$.}.
163 Toto rozhraní je řez. Tedy existuje řez~$C$, pro nějž $\vert C\vert \leq m/k$,
164 a~algoritmu zbývá maximálně $m/k$ dalších kroků.
165 Celkový počet kroků je nejvýš $k + m/k$, takže stačí zvolit $k = \sqrt{m}$ a získáme
166 odhad na~počet kroků $\O(\sqrt{m})$.
167
168 Tím jsme dokázali, že celková složitost Dinicova algoritmu pro jednotkové
169 kapacity je $\O(m^{3/2})$. Tím jsme si pomohli pro řídké grafy.
170
171 \vbox{
172 \inlinefig{dinic-vrcholrez.epdf}{0.2\hsize}
173 \s{Jednotkové kapacity a jeden ze stupňů roven 1:}
174 Úlohu hledání maximálního párování v~bipartitním grafu, případně hledání
175 vrcholově disjunktních cest v~obecném grafu lze převést (viz předchozí kapitola)
176 na~hledání maximálního toku v~síti, v~níž má každý vrchol~$v\ne s,t$ buďto vstupní
177 nebo výstupní stupeň roven jedné.
178 Pro takovou síť můžeme předchozí odhad ještě trošku upravit. Pokusíme
179 se nalézt v síti po~$k$~krocích nějaký malý řez. Místo rozhraní budeme hledat jednu malou
180 vrstvu a z~malé vrstvy vytvoříme malý řez tak, že pro každý vrchol z~vrstvy vezmeme tu hranu,
181 která je ve~svém směru sama.
182
183 }
184
185 Po $k$ krocích máme alespoň $k$ vrstev, a~proto existuje vrstva $\delta$ s nejvýše $n/k$ vrcholy.
186 Tedy existuje řez $C$ o~velikosti $\vert C\vert \leq n/k$ (získáme z vrstvy $\delta$ výše popsaným postupem).
187 Algoritmu zbývá do konce $\leq n/k$ iterací vnějšího cyklu, celkem tedy udělá $k + n/k$ iterací.
188 Nyní stačí zvolit $k = \sqrt{n}$ a složitost
189 celého algoritmu vyjde $\O(\sqrt{n}\cdot m)$.
190
191 Mimochodem, hledání maximálního párování pomocí Dinicova algoritmu je také ekvivalentní
192 známému Hopcroft-Karpově algoritmu \cite{hopcroft:matching}. Ten je založen na~střídavých
193 cestách z~předchozí kapitoly a v~každé iteraci nalezne množinu vrcholově disjuktních
194 nejkratších střidavých cest, která je maximální vzhledem k~inkluzi.
195 Touto množinou pak aktuální párování přexoruje, čímž ho zvětší. Všimněte si, že tyto
196 množiny cest odpovídají právě blokujícím tokům v~pročištěné síti rezerv, takže můžeme
197 i~zde použít náš odhad na~počet iterací.
198
199 \s{Třetí pokus pro jednotkové kapacity bez omezení na stupně vrcholů v síti:}
200 Hlavní myšlenkou je opět po $k$ krocích najít nějaký malý řez. Najdeme dvě malé
201 sousední vrstvy a všechny hrany mezi nimi budou tvořit námi hledaný malý řez.
202 Budeme tentokrát předpokládat, že naše síť není multigraf, případně že
203 násobnost hran je alespoň omezena konstantou.
204
205 Označme $s_i$ počet vrcholů v $i$-té vrstvě. Součet počtu vrcholů ve dvou
206 sousedních vrstvách označíme $t_i = s_i + s_{i+1}$. Bude tedy platit nerovnost:
207 $$\sum_i t_i \leq 2\sum_i s_i \leq 2n.$$
208 Podle holubníkového principu existuje $i$ takové, že $t_i \leq 2n/k$, čili
209 $s_i + s_{i+1} \leq 2n/k$. Počet hran mezi $s_i$ a $s_{i+1}$ je velikost řezu
210 $C$, a to je shora omezeno $s_i \cdot s_{i+1}$. Nejhorší případ nastane, když $s_i = s_{i+1} = n/k$,
211 a~proto $\vert C\vert \leq {(n/k)}^2$.
212 Proto počet iterací velkého cyklu je $\leq k + {(n/k)}^2$.
213 Chytře zvolíme $k = n^{2/3}$. Složitost celého algoritmu pak bude $\O(n^{2/3}m)$.
214
215 \s{Obecný odhad pro celočíselné kapacity:}
216 Tento odhad je založen na velikosti
217 maximálního toku $f$ a předpokladu celočíselných kapacit.
218 Za jednu iteraci velkého cyklu projdeme malým cyklem maximálně tolikrát,
219 o kolik se v něm zvedl tok, protože každá zlepšující cesta ho zvedne alespoň o $1$.
220 Zlepšující cesta se tedy hledá maximálně  $\vert f\vert$-krát za celou dobu běhu algoritmu.
221 Cestu najdeme v čase $\O(n)$. Celkem na~hledání
222 cest spotřebujeme $\O(\vert f\vert\cdot n)$ za celou dobu běhu algoritmu.
223
224 Nesmíme ale zapomenout na čištění. V jedné iteraci velkého cyklu nás stojí čištění $\O(m)$ a velkých
225 iterací je $\leq n$. Proto celková složitost algoritmu činí $\O(\vert f\vert n + nm)$
226
227 Pokud navíc budeme předpokládat, že kapacita hran je nejvýše~$C$ a $G$ není multigraf,
228 můžeme využít toho, že $\vert f\vert \le Cn$ (omezeno řezem okolo~$s$) a získat odhad
229 $\O(Cn^2 + nm)$.
230
231 \h{Škálování kapacit}
232
233 Pokud jsou kapacity hran větší celá čísla omezená nějakou konstantou~$C$, můžeme si pomoci následujícím algoritmem.
234 Jeho základní myšlenka je podobná, jako u~třídění čísel postupně po řádech pomocí
235 radix-sortu neboli přihrádkového třídění. Pro jistotu si ho připomeňme. Algoritmus nejprve setřídí čísla podle poslední
236 (nejméně významné) cifry, poté podle předposlední, předpředposlední a tak dále.
237
238 %\figure{dinic-sort.epdf}{Kroky postupného třídění podle řádů}{0.4\hsize}
239
240 V našem případě budeme postupně budovat sítě čím dál podobnější zadané
241 síti a v~nich počítat toky, až nakonec získáme tok pro ni.
242
243 Přesněji: Maximální tok v síti $G$ budeme hledat tak, že hranám postupně
244 budeme zvětšovat kapacity bit po bitu v~binárním zápisu až k~jejich skutečné kapacitě.
245 Přitom po~každém posunu zavoláme Dinicův algoritmus, aby dopočítal maximální tok.
246 Pomocí předchozího odhadu ukážeme, že jeden takový krok nebude příliš drahý.
247
248 \figure{dinic-scaling-original.epdf}{Původní síť, na hranách jsou jejich kapacity v binárním zápisu}{0.3\hsize}
249
250 Označme $k$ index nejvyššího bitu v~zápisu kapacit v~zadané síti ($k = \lfloor \log_2C \rfloor$).
251 Postupně budeme budovat sítě $G_i$ s~kapacitami $c_i(e) = \lfloor {c(e) / 2^{k-i}} \rfloor$.
252 $G_0$ je nejořezanější síť, kde každá hrana má kapacitu rovnou nejvyššímu bitu v~binárním zápisu
253 její skutečné kapacity, až $G_k$ je původní síť $G$.
254
255 \figure{dinic-scaling-g.epdf}{Sítě $G_0$, $G_1$ a $G_2$, jak vyjdou pro síť z~předchozího obrázku}{0.9\hsize}
256
257 \>Přitom pro kapacity v~jednotlivých sítích platí:
258
259 $$ c_{i+1}(e) = \left\{
260 \eqalign{
261            2c_i(e),   &\hbox{\quad pokud $(k-i-1)$-tý bit je 0,}  \cr
262            2c_i(e)+1, &\hbox{\quad pokud $(k-i-1)$-tý bit je 1.}  \cr}
263 \right.
264 $$
265
266 Na spočtení maximálního toku $f_i$ v síti $G_i$ zavoláme Dinicův algoritmus,
267 ovšem do začátku nepoužijeme nulový tok, nýbrž tok $2f_{i-1}$. Rozdíl toku z inicializace
268 a výsledného bude malý, totiž:
269
270 \s{Lemma:} $\vert f_i\vert - \vert 2f_{i-1}\vert \leq m.$
271
272 \proof
273 Vezmeme minimální řez $R$ v~$G_{i-1}$. Podle F-F věty víme, že $\vert f_{i-1}\vert = \vert R\vert$.
274 Řez $R$ obsahuje $\leq m$ hran, a~tedy v~$G_{i}$ má tentýž řez kapacitu maximálně $2\vert R\vert+m$.
275 Maximální tok je omezen každým řezem, tedy i řezem $R$, a~proto tok vzroste nejvýše o~$m$.
276 \qed
277
278 Podle předchozího odhadu pro celočíselné kapacity výpočet toku $f_i$ trvá $\O(mn)$.
279 Takový tok se bude počítat $k$-krát, pročež celková složitost vyjde $\O(mn\log C)$.
280
281 \h{Algoritmus tří Indů}
282
283 Překvapení na~konec: Dinicův algoritmus lze poměrně snadno zrychlit i ve~zcela obecném
284 případě. Malhotra, Kumar a Maheshwari vymysleli efektivnější algoritmus \cite{threeinds}
285 na~hledání blokujícího toku ve~vrstevnaté síti, který běží v~čase $\O(n^2)$ a použijeme-li
286 ho v~Dinicově algoritmu, zrychlíme hledání maximálního toku na~$\O(n^3)$.
287 Tento algoritmus vešel do~dějin pod názvem Metoda tří Indů.
288
289 Mějme tedy nějakou vrstevnatou síť. Začneme s~nulovým tokem a budeme ho postupně zlepšovat.
290 Průběžně si budeme udržovat rezervy hran~$r(e)$\foot{počítáme pouze rezervu ve~směru hrany, neboť
291 nám stačí najít blokující tok, ne~nutně maximální} a také následující rezervy vrcholů:
292
293 \s{Definice:} $r^+(v)$ je součet rezerv všech hran vstupujících do~$v$, $r^-(v)$ součet
294 rezerv hran vystupujících z~$v$ a konečně $r(v):=\min(r^+(v),r^-(v))$.
295
296 V~každé iteraci algoritmu nalezneme vrchol s~nejnižším~$r(v)$ a zvětšíme tok tak, aby se
297 tato rezerva vynulovala. Za~tímto účelem nejdříve přepravíme $r(v)$ jednotek toku ze~zdroje
298 do~$v$: u~každého vrcholu~$w$ si budeme pamatovat {\I plán} $p(w)$, což bude množství
299 tekutiny, které potřebujeme dostat ze~zdroje do~$w$. Nejdříve budou plány všude nulové
300 až na~$p(v)=r(v)$. Pak budeme postupovat po~vrstvách směrem ke~zdroji a plány všech
301 vrcholů splníme tak, že je převedeme na~plány vrcholů v~následující vrstvě, až doputujeme
302 ke~zdroji, jehož plán je splněn triviálně. Nakonec analogickým způsobem protlačíme $r(v)$
303 jednotek z~$v$ do~spotřebiče.
304
305 Během výpočtu průběžně přepočítáváme všechna $r^+$, $r^-$ a~$r$ podle toho, jak se mění
306 rezervy jednotlivých hran (při každé úpravě rezervy to zvládneme v~konstantním čase)
307 a síť čistíme stejně jako u~Dinicova algoritmu.
308
309 \finalfix{\goodbreak}
310
311 \s{Algoritmus:} (hledání blokujícího toku ve~vrstevnaté síti podle tří Indů)
312
313 \algo
314 \:$f_B\leftarrow\<prázdný tok>$.
315 \:Spočítáme rezervy všech hran a $r^+$, $r^-$ a $r$ všech vrcholů. (Tyto hodnoty
316   budeme posléze udržovat při každé změně toku po~hraně.)
317 \:Dokud v~síti existují vrcholy s~nenulovou rezervou, vezmeme vrchol $v$ s~nejmenším $r(v)$
318   a provedeme pro něj: {\I (vnější cyklus)}
319 \::Převedeme $r(v)$ jednotek toku z~$s$ do~$v$ následovně:
320 \:::Položíme $p(v)\leftarrow r(v)$, $p(\cdot)=0$.
321 \:::Procházíme vrcholy sítě po~vrstvách od~$v$ směrem k~$s$. Pro každý vrchol~$w$ provedeme:
322 \::::Dokud $p(w)>0$:
323 \:::::Vezmeme libovolnou hranu $uw$ a tok po~ní zvýšíme o~$\delta=\min(r(uw), p(w))$. Tím se
324       $p(w)$ sníží~o~$\delta$ a $p(u)$ zvýší~o~$\delta$.
325 \:::::Pokud se hrana~$uw$ nasytila, odstraníme jí ze sítě a síť dočistíme.
326 \::Analogicky převedeme $r(v)$ jednotek z~$v$ do~$t$.
327 \endalgo
328
329 \s{Analýza:} Nejprve si všimneme, že cyklus v~kroku~8 opravdu dokáže vynulovat $p(w)$.
330 Součet všech $p(w)$ přes každou vrstvu je totiž nejvýše roven $r(v)$, takže speciálně každé
331 $p(w)\le r(v)$. Jenže $r(v)$ jsme vybrali jako nejmenší, takže $p(w)\le r(v)\le r(w)\le r^+(w)$,
332 a~proto je plánovaný tok kudy přivést. Proto se algoritmus zastaví a vydá blokující tok.
333
334 Zbývá odhadnout časovou složitost: Když oddělíme převádění plánů po~hranách (kroky 7--9),
335 zbytek jedné iterace vnějšího cyklu trvá~$\O(n)$ a těchto iterací je nejvýše~$n$. Všechna převedení
336 plánu si rozdělíme na~ta, kterými se nějaká hrana nasytila, a~ta, která skončila vynulováním $p(w)$.
337 Těch prvních je $\O(m)$, protože každou takovou hranu vzápětí odstraníme a čištění, jak už víme,
338 trvá také lineárně dlouho. Druhý případ nastane pro každý vrchol nejvýše jednou za~iteraci.
339 Dohromady tedy trvají všechna převedení $\O(n^2)$, stejně jako zbytek algoritmu.
340 \qed
341
342 \h{Přehled variant Dinicova algoritmu}
343
344 \medskip
345
346 \centerline{\vbox{\halign{# \hfil \quad &# \hfil \cr
347 \it varianta &\it čas \cr\noalign{\smallskip\hrule\smallskip}
348 standardní                              &$\O(n^2m)$      \cr
349 jednotkové kapacity                    &$\O(\sqrt{m}\cdot m) = \O(m^{3/2})$   \cr
350 jednotkové kapacity, 1 stupeň $\leq 1$  &$\O(\sqrt{n}\cdot m)$   \cr
351 jednotkové kapacity, prostý graf        &$\O(n^{2/3}m)$    \cr
352 celočíselné kapacity                    &$\O(\vert f\vert\cdot n + nm)$     \cr
353 celočíselné kapacity $ \leq C$          &$\O(Cn^2 + mn)$   \cr
354 celočíselné kapacity $ \leq C$ (škálování)&$\O(mn\log C)$    \cr
355 tři Indové                            &$\O(n^3)$         \cr
356 }}}
357
358 \references
359
360 \bye