3 \prednaska{2}{Dinicùv algoritmus a jeho varianty}{zapsal Bernard Lidický}
7 Dinicùv algoritmus je zalo¾en na my¹lence, ¾e ve Ford-Fulkersonovì algoritmu
8 není potøeba pøièítat jen zlep¹ující cesty, ale je mo¾né pøièítat rovnou zlep¹ující
9 toky, nejlépe takové, aby je nebylo obtí¾né najít, a~pøitom aby pùvodní tok
10 dostateènì zlep¹ovaly. Vhodnými objekty k~tomuto úèelu jsou:
12 \s{Definice:} {\I Blokující tok} je tok takový, ¾e ka¾dá orientovaná $st$-cesta
13 obsahuje alespoò jednu nasycenou hranu. [Tj. takový tok, který by na¹el F-F algoritmus,
14 kdyby neuva¾oval rezervy v~protismìru.]
16 \s{Algoritmus (Dinic):}
19 \:Zaèni s~libovolným tokem~$f$, napøíklad prázdným (v¹ude nulovým).
20 \:Iterativnì vylep¹uj tok podle zlep¹ujících tokù v síti rezerv: {\I (vnìj¹í cyklus)}
21 \::Sestroj sí» rezerv.
22 \::Najdi nejkrat¹í $st$-cestu. Kdy¾ ¾ádná neexistuje, skonèi.
23 \::Proèisti sí», tj. nech v ní pouze vrcholy a hrany na nejkrat¹ích $st$-cestách.
24 \::Najdi blokující tok $f_B$:
25 \:::$f_B \leftarrow \<prázdný tok>$
26 \:::Postupnì pøidáváme $st$-cesty: {\I (vnitøní cyklus)}
27 \::::Najdi $st$-cestu. Napø. hladovì metodou rovnou za nosem.
28 \::::Po¹li co nejvíce po cestì.
29 \::::Sma¾ nasycené hrany. (Pozor, smazáním hran mohou vzniknout slepé ulièky,
30 èím¾ se zneèistí sí» a nebude fungovat metoda rovnou za nosem.)
32 \::Zlep¹i $f$ podle $f_B$
35 \figure{dinic-cistasit.eps}{Proèi¹tìná sí» rozdìlená do vrstev}{0.3\hsize}
37 \s{Slo¾itost algoritmu:}
38 Oznaèíme $l$ délku nejkrat¹í $st$-cesty, $n$ poèet vrcholù sítì a $m$ poèet hran sítì.
41 \: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$.
42 \:Vnitøní cyklus se provede maximálnì $m$-krát, proto¾e se v¾dy alespoò jedna hrana nasytí
43 a ze sítì vypadne, tak¾e krok~6 mimo podkroku~12 bude trvat $\O(mn)$.
44 \:Èi¹tìní a doèi¹»ování sítì dohromady provedeme takto:
46 \:Rozvrstvíme vrcholy do vrstev podle vzdálenosti od $s$.
47 \:Zaøízneme dlouhé cesty (del¹í, ne¾ do vrstvy obsahující $t$).
48 \:Dr¾íme si frontu vrcholù, které mají $\deg^+ = 0$ èi $\deg^- = 0$.
49 \:Vrcholy z~fronty vybíráme a zahazujeme vèetnì hran, které vedou do/z nich.
50 A pøípadnì pøidáváme do~fronty vrcholy, kterým klesl jeden ze stupòù na 0
51 pøi vyhazování hran. Vyma¾ou se tím slepé ulièky, které by vadily v podkroku~9.
53 Tedy kroky 5 a 12 dohromady spotøebují èas $\O(m)$.
54 \:Jeden prùchod vnìj¹ím cyklem tedy trvá $\O(mn)$.
58 V~ka¾dém prùchodu Dinicova algoritmu vzroste $l$ alespoò~o~1.
61 Vnìj¹ím cyklem projdeme $\O(n)$ krát, proto¾e nejdel¹í cesta bude mít
62 délku $\leq n$. Celková slo¾itost algoritmu tedy bude $\O(n^2m)$
64 \s{Korektnost algoritmu:}
65 Korektnost Dinicova algoritmu plyne z korektnosti F-F algoritmu. Kdy¾ se Dinicùv
66 algoritmus zastaví, musí vydat maximální tok. Pokud ne, tak podle F-F algoritmu
67 existuje zlep¹ující cesta, ale to je ve sporu s~krokem~4, který po¾aduje, ¾e ¾ádná
68 zlep¹ující cesta neexistuje.
71 Podíváme se na~prùbìh jednoho prùchodu vnìj¹ím cyklem.
72 Délku aktuálnì nejkrat¹í $st$-cesty oznaème~$l$.
73 V¹echny pùvodní cesty délky~$l$ se bìhem prùchodu zaruèenì nasytí, proto¾e
74 tok~$f_B$ je blokující. Musíme v¹ak dokázat, ¾e nemohou vzniknout ¾ádné
75 nové cesty délky~$l$ nebo men¹í. V~síti rezerv toti¾ mohou hrany nejen
76 ubývat, ale i pøibývat: pokud po¹leme tok po~hranì, po~které je¹tì nic
77 neteklo, mù¾e se stát, ¾e v~protismìru z~dosud nulové rezervy vyrobíme
78 nenulovou. Rozmysleme si tedy, jaké hrany mohou pøibývat:
80 Vnìj¹í cyklus zaèíná s neproèi¹tìnou sítí. Pøíklad takové sítì je na obrázku nìkde
81 okolo. Po proèi¹tìní zùstanou v~síti jen èerné hrany, tedy hrany vedoucí z~$i$-té
82 vrstvy do~$(i+1)$-ní. Èervené a modré\foot{Modré jsou ty, které vedou v rámci jedné vrstvy,
83 èervené vedou zpìt èi za~spotøebiè èi do~slepých ulièek. Pøi vyti¹tìní na papír není snadné
84 je barevnì odli¹it od èerných.} se zahodí.
86 \figure{dinic-neprocistenasit.eps}{Neproèi¹tìná sí». Obsahuje zpìtné hrany, hrany uvnitø vrstvy a slepé ulièky.}{0.3\hsize}
88 Nové hrany mohou vznikat výhradnì jako opaèné k~èerným hranám (hrany ostatních barev
89 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 \figure{dinic-zpetnahrana.eps}{Vznik nové zpìtné hrany}{0.3\hsize}
93 Vznikem nových hran by proto mohly vzniknout nové $st$-cesty, které pou¾ívají
94 zpìtné hrany. Jen¾e $st$-cesta, která pou¾ije zpìtnou hranu, musí alespoò jednou skoèit zpìt
95 a nikdy nemù¾e skoèit dopøedu o~více ne¾ jednu vrstvu, a~proto je její délka alespoò $l+2$.
96 Tím je vìta dokázána. \qed
98 \figure{dinic-cestashranouzpet.eps}{Cesta u¾ívající novou zpìtnou hranu}{0.3\hsize}
100 \h{Implementaèní poznámky}
103 \:Není potøeba tak brutální èi¹tìní. Vrcholy se vstupním stupnìm 0 nám
104 nevadí -- stejnì se do nich nedostaneme. Vadí jen vrcholy s výstupním stupnìm 0, kde by mohl
105 havarovat postup v podkroku 9.
106 \:Je mo¾né dìlat prohledávání a èi¹tìní souèasnì. Jednodu¹e metodou Hrrr na nì a kdy¾
107 to nevyjde (dostaneme se do slepé ulièky), kus ustoupíme a pøi ústupu èistíme sí»
108 odstraòováním slepé ulièky.
109 \:U¾ pøi prohledáváni si rovnou udr¾ujeme minimum z rezerv a pøi zpáteèní cestì
110 opravujeme kapacity.\foot{Jak se asi zkombinuje s pøedchozím, kde musíme ustupovat?
111 V ka¾dé úrovni rekurze si zapamatujeme minimum, jaké bylo, kdy¾ jsme tam pøi¹li. Pokud
112 se vracíme, recyklujeme toto minimum.}
113 \:V prùbìhu výpoètu udr¾ujeme jen sí» rezerv a tok vypoèteme a¾ nakonec z rezerv a kapacit.
114 \:Kdy¾ budeme chtít hledat minimální øez, spustíme po~Dinicovu algoritmu je¹tì jednu iterací F-F
118 \h{Speciální sítì (ubíráme na obecnosti)}
120 Dále se budeme vìnovat modifikacím Dinicova algoritmu na speciální druhy sítí,
121 kde je mo¾né dostat lep¹í èasovou slo¾itost ne¾ v~obecném pøípadì.
123 \s{Jednotkové kapacity:}
124 V¹echny rezervy jsou jen 0 nebo~1. Na $st$-cestì má v¹echno kapacitu/rezervu~1.
125 Mù¾eme poslat~1~a rovnou celou cestu zahodit -- není potøeba si pamatovat minimum z~rezerv.
126 Kdy¾ máme $m$ hran, poèet zlep¹ení po cestách délky $l$ bude maximálnì $m/l$.
127 Proto slo¾itost podkrokù 9, 10 a 11 bude $m/l \cdot \O(l) = \O(m)$.%
128 \foot{Nebo by ¹lo argumentovat, ¾e ka¾dou hranu pou¾ijeme jen $1\times$.}
129 Tedy pro jednotkové kapacity dostáváme slo¾itost $\O(nm)$.
131 \s{Jednotkové kapacity znovu a lépe:}
132 Vnitøní cyklus lépe udìlat nepùjde. Je potøeba alespoò lineární èas pro èi¹tìní.
133 Mù¾eme se ale pokusit lépe odhadnout poèet iterací vnìj¹ího cyklu.
135 Sledujme stav sítì po $k$ iteracích vnìj¹ího cyklu a pokusme se odhadnout, kolik iterací
136 je¹tì algoritmus udìlá. Oznaème~$l$ délku nejkrat¹í $st$-cesty.
137 Víme, ¾e $l>k$, proto¾e v ka¾dé iteraci vzroste $l$ alespoò o 1.
139 Máme tok $f_k$ a chceme dostat maximální tok $f$. Rozdíl $f-f_k$ je tok v~síti rezerv
140 (tok v~pùvodní síti to ov¹em být nemusí!), oznaème si ho~$f_R$.
141 Ka¾dá iterace velkého cyklu zlep¹í $f_k$ alespoò o 1. Tedy nám zbývá je¹tì
142 nejvý¹e $\vert f_R \vert$ iterací.
143 Proto bychom chtìli omezit velikost toku $f_R$. Napøíklad øezem.
145 Najdeme v síti rezerv øez $C$. Kde ho vzít?\foot{Pøeci v øeznictví. Kdepak, spí¹e v cukrárnì.
146 Myslíte, ¾e v cukrárnì mají Dinicovy øezy? Myslím, ¾e v cukrárnì je vìt¹ina øezù minimální.}
147 Poèítejme jen hrany zleva doprava. Tìch je jistì nejvý¹e $m$ a tvoøí alespoò $k$ rozhraní mezi
148 vrstvami. Tedy existuje rozhraní vrstev
149 s~nejvý¹e $m/k$ hranami\foot{Princip holubníku a nìjaká ta $\pm1$.}.
150 Toto rozhraní je øez. Tedy existuje øez $C$, pro nìj¾ $\vert C\vert \leq m/k$,
151 a~algoritmu zbývá maximálnì $m/k$ dal¹ích krokù.
152 Celkový poèet krokù je nejvý¹ $k + m/k$, tak¾e staèí zvolit $k = \sqrt{m}$ a získáme
153 odhad na~poèet krokù $\O(\sqrt{m})$.
155 Celkovì slo¾itost Dinicova algoritmu pro jednotkové kapacity znovu a lépe
156 je $\O(\sqrt{m} \cdot m) = \O(m^{3/2})$. Pomohli jsme si pro øídké grafy.
158 \s{Jednotkové kapacity a jeden ze stupòù roven 1:}
159 Úlohu hledání maximálního párování v~bipartitním grafu, pøípadnì hledání
160 vrcholovì disjunktních cest v~obecném grafu lze pøevést (viz pøedchozí kapitola)
161 na~hledání maximálního toku v~síti, v~ní¾ $\forall v \neq s,t: \min(\deg^-(v), \deg^+(v)) \leq 1$.
162 Pro takovou sí» mù¾eme odhad je¹tì tro¹ku upravit. My¹lenka je stejná jako minule. Pokusíme
163 se nalézt v síti po $k$ krocích nìjaký malý øez. Místo rozhraní budeme hledat jednu malou
164 vrstvu a z malé vrstvy vytvoøíme malý øez: Pro ka¾dý vrchol z vrstvy vezmeme tu hranu,
165 která je ve svém smìru sama.
167 \figure{dinic-vrcholrez.eps}{Øez podle vrcholù ve vrstvì}{0.2\hsize}
169 Po $k$ krocích máme alespoò $k$ vrstev. Tedy existuje vrstva $\delta$ s nejvý¹e $n/k$ vrcholy.
170 Tedy existuje øez $C$ o~velikosti $\vert C\vert \leq n/k$ (získáme z vrstvy $\delta$ vý¹e popsaným postupem).
171 Algoritmu zbývá do konce $\leq n/k$ iterací vnìj¹ího cyklu, celkem tedy udìlá $k + n/k$ krokù.
172 Nyní staèí zvolit $k = \sqrt{n}$ a slo¾itost
173 celého algoritmu vyjde $\O(\sqrt{n}\cdot m)$\foot{Poèet iterací vnìj¹ího cyklu je $\O(\sqrt{n})$ a
174 vnitøní cyklus má $\O(m)$.}.
176 \s{Tøetí pokus pro jednotkové kapacity bez omezení na stupnì vrcholù v síti:}
177 Hlavní my¹lenkou je opìt po $k$ krocích najít nìjaký malý øez. Najdeme dvì malé
178 sousední vrstvy a v¹echny hrany mezi nimi budou tvoøit námi hledaný malý øez.
180 Oznaème $s_i$ poèet vrcholù v $i$-té vrstvì. Souèet poètu vrcholù ve dvou
181 sousedních vrstvách oznaèíme $t_i = s_i + s_{i+1}$. Bude tedy platit nerovnost:
182 $$\sum_i t_i \leq 2\sum_i s_i \leq 2n.$$
183 Podle holubníkového principu existuje $i$ takové, ¾e $t_i \leq 2n/k$, èili
184 $s_i + s_{i+1} \leq 2n/k$. Poèet hran mezi $s_i$ a $s_{i+1}$ je velikost øezu
185 $C$, a to je shora omezeno $s_i \cdot s_{i+1}$. Nejhor¹í pøípad nastane, kdy¾ $s_i = s_{i+1} = n/k$,
186 a~proto $\vert C\vert \leq {(n/k)}^2$.
187 Proto poèet iterací velkého cyklu je $\leq k + {(n/k)}^2$.
188 Chytøe zvolíme $k = n^{2/3}$. Slo¾itost celého algoritmu pak bude $\O(n^{2/3}m)$.
190 \s{Obecný odhad pro celoèíselné kapacity:}
191 Tento odhad je zalo¾en na velikosti
192 maximálního toku $f$ a pøedpokladu celoèíselných kapacit.
193 Za jednu iteraci velkého cyklu projdeme malým cyklem maximálnì tolikrát,
194 o kolik se v nìm zvedl tok, proto¾e ka¾dá zlep¹ující cesta ho zvedne alespoò o $1$.
195 Zlep¹ující cesta se tedy hledá maximálnì $\vert f\vert$-krát za celou dobu bìhu algoritmu.
196 Cestu najedeme v èase $\O(n)$. Celkem na hledání
197 cest spotøebujeme $\O(\vert f\vert\cdot n)$ za celou dobu bìhu algoritmu.
199 Nesmíme ale zapomenout na cleanupy. V jedné iteraci velkého cyklu stojí cleanupy $\O(m)$ a velkých
200 iterací je $\leq n$. Proto celková slo¾itost algoritmu èiní $\O(\vert f\vert n + nm)$
202 Pokud navíc budeme pøedpokládat, ¾e kapacita hran je nejvý¹e~$C$ a $G$ není multigraf,
203 mù¾eme vyu¾ít toho, ¾e $\vert f\vert \le Cn$ (omezeno øezem okolo~$s$) a získat odhad
208 Základní my¹lenka je podobná, jako u algoritmu pro tøídìní dlouhých èísel postupnì po øádech pomocí
209 radix-sortu. Pro jistotu si ho pøipomeòme. Algoritmus nejprve setøídí èísla podle poslední%
210 \foot{Poslední cifrou myslíme nejménì významnou cifru.}
211 cifry, poté podle pøedposlední, pøedpøedposlední a tak dále.
213 \figure{dinic-sort.eps}{Kroky postupného tøídìní podle øádù}{0.2\hsize}
215 V na¹em pøípadì budeme postupnì budovat sítì a v nich poèítat toky, a¾ nakonec získáme tok pro celou sí».
217 Pøedpokládejme celoèíselné kapacity. Maximální tok v síti $G$ budeme hledat tak, ¾e hranám postupnì
218 budeme zvìt¹ovat kapacity bit po bitu v binárním zápisu a¾ k jejich skuteèné kapacitì.
219 Pøitom po~ka¾dém posunu zavoláme Dinicùv algoritmus. Pomocí pøedchozího odhadu uká¾eme, ¾e jedno
220 volání Dinice nebude pøíli¹ drahé.
222 \figure{dinic-scaling-original.eps}{Pùvodní sí», na hranách jsou jejich kapacity v binárním zápisu}{0.2\hsize}
224 Oznaème $k$ poèet bitù v zápisu nejvìt¹í kapacity z celé sítì. $k = \lfloor \log_2C \rfloor$.
225 Postupnì budeme budovat sítì $G_i$ s~kapacitami $c_i(e) = \lfloor {c(e) / 2^{k-i}} \rfloor$.
226 $G_0$ je nejoøezanìj¹í sí», kde ka¾dá hrana má kapacitu rovnou nejvy¹¹ímu bitu v~binárním zápisu
227 její skuteèné kapacity. $G_k$ je pùvodní sí» $G$.
229 $$ c_{i+1}(e) = \left\{
231 2c_i(e), &\hbox{\quad pokud $(k-i-1)$-tý bitík je 0} \cr
232 2c_i(e)+1, &\hbox{\quad pokud $(k-i-1)$-tý bitík je 1} \cr}
236 \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.8\hsize}
238 Na spoètení maximálního toku $f_i$ v síti $G_i$ zavoláme Dinicùv algoritmus,
239 ov¹em do zaèátku nepou¾ijeme nulový tok, nýbr¾ tok $2f_{i-1}$. Rozdíl toku z inicializace
240 a výsledného bude malý, toti¾:
241 $$ \vert f_i\vert - \vert 2f_{i-1}\vert \leq m.$$
244 Vezmeme minimální øez $R$ v $G_{i-1}$. Platí $\vert f_{i-1}\vert = \vert R\vert$\foot{F-F vìta.}.
245 Øez $R$ obsahuje $\leq m$ hran. V $G_{i}$ má øez $R$ kapacitu maximálnì $2\vert R\vert+m$.
246 Maximální tok je omezen ka¾dým øezem. Tedy i øezem $R$. Proto tok vzroste o $\leq m$.
249 Proto podle pøedchozího odhadu výpoèet toku $f_i$ trvá $\O(mn)$. Takový tok se bude poèítat $k$-krát,
250 tak¾e celková slo¾itost vyjde $\O(mn\log C)$.
254 $$\vbox{\halign{# \hfil \quad &# \hfil \cr
255 \it verze &\it èas \cr\noalign{\smallskip\hrule\smallskip}
256 standardní &$\O(n^2m)$ \cr
257 jednotkové kapacity &$\O(nm)$ \cr
258 jednotkové kapacity podruhé &$\O(\sqrt{m}\cdot m) = \O(m^{3/2})$ \cr
259 jednotkové kapacity, 1 stupeò $\leq 1$ &$\O(\sqrt{n}\cdot m)$ \cr
260 jednotkové kapacity veseleji &$\O(n^{2/3}m)$ \cr
261 celoèíselné kapacity &$\O(\vert f\vert\cdot n + nm)$ \cr
262 celoèíselné kapacity $ \leq C$ &$\O(Cn^2 + mn)$ \cr
263 celoèíselné kapacity $ \leq C$ &$\O(mn\log C)$ \cr