]> mj.ucw.cz Git - ga.git/blob - 2-dinic/2-dinic.tex
Dijkstra: Oprava preklepu
[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.eps}{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.eps}{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.eps}{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.eps}{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.eps}{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.eps}{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.eps}{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