3 \prednaska{2}{Dinicův algoritmus a jeho varianty}{}
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.
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:
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.]
20 \s{Algoritmus (Dinic):}
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.)
37 \::Zlepšíme $f$ podle $f_B$
41 \figure{dinic-cistasit.epdf}{Pročištěná síť rozdělená do vrstev}{0.4\hsize}
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ě.
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:
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.
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)$.
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í.
71 V~každém průchodu Dinicova algoritmu vzroste $l$ alespoň~o~1.
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:
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ě.}
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
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}
102 \figure{dinic-cestashranouzpet.epdf}{Cesta užívající novou zpětnou hranu}{0.4\hsize}
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
121 \h{Speciální sítě (ubíráme na obecnosti)}
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ě.
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
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.}
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)$.
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.
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.
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.
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})$.
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.
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.
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)$.
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í.
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.
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)$.
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.
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)$
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
231 \h{Škálování kapacit}
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.
238 %\figure{dinic-sort.epdf}{Kroky postupného třídění podle řádů}{0.4\hsize}
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.
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ý.
248 \figure{dinic-scaling-original.epdf}{Původní síť, na hranách jsou jejich kapacity v binárním zápisu}{0.3\hsize}
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$.
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}
257 \>Přitom pro kapacity v~jednotlivých sítích platí:
259 $$ c_{i+1}(e) = \left\{
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}
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ž:
270 \s{Lemma:} $\vert f_i\vert - \vert 2f_{i-1}\vert \leq m.$
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$.
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)$.
281 \h{Algoritmus tří Indů}
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ů.
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ů:
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))$.
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.
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.
309 \finalfix{\goodbreak}
311 \s{Algoritmus:} (hledání blokujícího toku ve~vrstevnaté síti podle tří Indů)
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:
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$.
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.
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.
342 \h{Přehled variant Dinicova algoritmu}
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