From: Martin Mares Date: Tue, 31 Oct 2006 21:30:54 +0000 (+0100) Subject: Revize 2. kapitoly. X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=1137db43ae7b1c1aeed4e91b52deffbda8792694;p=ga.git Revize 2. kapitoly. --- diff --git a/2-dinic/2-dinic.tex b/2-dinic/2-dinic.tex index a96e168..5e339c3 100644 --- a/2-dinic/2-dinic.tex +++ b/2-dinic/2-dinic.tex @@ -1,21 +1,19 @@ -%%%%%%%%%%%% -% Zápisek druhého semináøe z grafových algoritmù - ze dne 13.3.2006 -% Téma Dinicùv algoritmus a v¹emo¾né jeho modifikace. -% Zapsal Bernard Lidický - bernard@matfyz.cz -% -% Verze z 29. dubna 2006 -% -%%%%%%%%%%% - \input ../sgr.tex -\prednaska{2}{Dinicùv algoritmus a jeho analýza}{zapsal Bernard Lidický} +\prednaska{2}{Dinicùv algoritmus a jeho varianty}{zapsal Bernard Lidický} \h{Dinicùv algoritmus} Dinicùv algoritmus je zalo¾en na my¹lence, ¾e ve Ford-Fulkersonovì algoritmu není potøeba pøièítat jen zlep¹ující cesty, ale je mo¾né pøièítat rovnou zlep¹ující -toky. Funguje takto: +toky, nejlépe takové, aby je nebylo obtí¾né najít, a~pøitom aby pùvodní tok + dostateènì zlep¹ovaly. Vhodnými objekty k~tomuto úèelu jsou: + +\s{Definice:} {\I Blokující tok} je tok takový, ¾e ka¾dá orientovaná $st$-cesta +obsahuje alespoò jednu nasycenou hranu. [Tj. takový tok, který by na¹el F-F algoritmus, +kdyby neuva¾oval rezervy v~protismìru.] + +\s{Algoritmus (Dinic):} \algo \:Zaèni s~libovolným tokem~$f$, napøíklad prázdným (v¹ude nulovým). @@ -52,8 +50,7 @@ Ozna A pøípadnì pøidáváme do~fronty vrcholy, kterým klesl jeden ze stupòù na 0 pøi vyhazování hran. Vyma¾ou se tím slepé ulièky, které by vadily v podkroku~9. \endlist - Tedy kroky 5 a 12 dohromady spotøebují èas $\O(m)$\foot{Pøesnìji $\O(m+n)$, pokud by v síti byly izolované - vrcholy, ale ty mù¾eme zahodit úplnì u¾ na zaèátku.}. + Tedy kroky 5 a 12 dohromady spotøebují èas $\O(m)$. \:Jeden prùchod vnìj¹ím cyklem tedy trvá $\O(mn)$. \endlist @@ -65,46 +62,40 @@ Vn délku $\leq n$. Celková slo¾itost algoritmu tedy bude $\O(n^2m)$ \s{Korektnost algoritmu:} -Korektnost Dinicova algoritmu plyne z korektnosti FF algoritmu. Kdy¾ se Dinicùv -algoritmus zastaví, musí vydat maximální tok. Pokud ne, tak podle FF algoritmu +Korektnost Dinicova algoritmu plyne z korektnosti F-F algoritmu. Kdy¾ se Dinicùv +algoritmus zastaví, musí vydat maximální tok. Pokud ne, tak podle F-F algoritmu existuje zlep¹ující cesta, ale to je ve sporu s~krokem~4, který po¾aduje, ¾e ¾ádná zlep¹ující cesta neexistuje. \s{Dùkaz vìty:} -Podíváme se na výpoèet jednoho prùchodu vnìj¹ím cyklem. +Podíváme se na~prùbìh jednoho prùchodu vnìj¹ím cyklem. Délku aktuálnì nejkrat¹í $st$-cesty oznaème~$l$. -Vypozorujeme, ¾e délka cest, které pøípadnì vzniknou pøi hledání a sycení -v¹ech cest délky $l$, musí být vìt¹í ne¾ $l$. Jinak øeèeno, nestane se, -¾e by vznikaly nové krátké cesty. +V¹echny pùvodní cesty délky~$l$ se bìhem prùchodu zaruèenì nasytí, proto¾e +tok~$f_B$ je blokující. Musíme v¹ak dokázat, ¾e nemohou vzniknout ¾ádné +nové cesty délky~$l$ nebo men¹í. V~síti rezerv toti¾ mohou hrany nejen +ubývat, ale i pøibývat: pokud po¹leme tok po~hranì, po~které je¹tì nic +neteklo, mù¾e se stát, ¾e v~protismìru z~dosud nulové rezervy vyrobíme +nenulovou. Rozmysleme si tedy, jaké hrany mohou pøibývat: Vnìj¹í cyklus zaèíná s neproèi¹tìnou sítí. Pøíklad takové sítì je na obrázku nìkde -okolo. Po proèi¹tìní zùstanou v~síti jen èerné hrany. Èervené a modré\foot{Modré jsou -ty, které vedou v rámci jedné vrstvy, èervené vedou zpìt èi za~spotøebiè èi do~slepých -ulièek. Pøi vyti¹tìní na papír není snadné je barevnì odli¹it od èerných.} se zahodí. +okolo. Po proèi¹tìní zùstanou v~síti jen èerné hrany, tedy hrany vedoucí z~$i$-té +vrstvy do~$(i+1)$-ní. Èervené a modré\foot{Modré jsou ty, které vedou v rámci jedné vrstvy, +èervené vedou zpìt èi za~spotøebiè èi do~slepých ulièek. Pøi vyti¹tìní na papír není snadné +je barevnì odli¹it od èerných.} se zahodí. + \figure{dinic-neprocistenasit.eps}{Neproèi¹tìná sí». Obsahuje zpìtné hrany, hrany uvnitø vrstvy a slepé ulièky.}{0.3\hsize} -Nové hrany tak mohou vznikat jen díky èerným hranám, proto¾e s hranami zahozenými pøi èi¹tìní algoritmus -dále nepoèítá. - -Nová hrana mù¾e vzniknout zlep¹ení toku po nìjaké zlep¹ující cestì, proto¾e -kdy¾ po hranì po¹leme nìjaký tok, zvedne se rezerva hrany opaèné, která mohla být -nulová\foot{Tedy po zpìtné hranì ne¹lo nic poslat a nepoèítalo se s ní.}. -Tím vznikne nová zpìtná hrana. ®ádné novì dopøedné hrany pøeskakující více vrstev nevznikají. -\figure{dinic-zpetnahrana.eps}{Vznik nové zpìtné hrany}{0.3\hsize} -Poka¾dé, kdy¾ se zlep¹í tok podél nìjaké cesty, budou v grafu ke v¹em hranám cesty -existovat hrany opaèného smìru s~nenulovou rezervou. Nìkteré -tyto opaèné hrany u¾ v~grafu mohly být, ale tím lépe pro nás\foot{Tento odstavec -je spí¹e informativní a slou¾í malinko pro osvícení ètenáøe. V dùkazu nemá ¾ádný smysl.}. +Nové hrany mohou vznikat výhradnì jako opaèné k~èerným hranám (hrany ostatních barev +padly za obì» proèi¹tìní). Jsou to tedy v¾dy zpìtné hrany vedoucí z~$i$-té vrstvy do~$(i-1)$-ní. -Vznikem nových hran by mohly vzniknout nové $st$-cesty, které pou¾ívají -zpìtné hrany. Ale $st$-cesta, která pou¾ívá zpìtnou hranu, musí alespoò jednou skoèit zpìt. -Tedy její délka je alespoò $l+2$. +\figure{dinic-zpetnahrana.eps}{Vznik nové zpìtné hrany}{0.3\hsize} -\figure{dinic-cestashranouzpet.eps}{Cesta u¾ívající novou zpìtnou hranu}{0.3\hsize} +Vznikem nových hran by proto mohly vzniknout nové $st$-cesty, které pou¾ívají +zpìtné hrany. Jen¾e $st$-cesta, která pou¾ije zpìtnou hranu, musí alespoò jednou skoèit zpìt +a nikdy nemù¾e skoèit dopøedu o~více ne¾ jednu vrstvu, a~proto je její délka alespoò $l+2$. +Tím je vìta dokázána. \qed -Tedy ve vnitøním cyklu zaniknou v¹echny $st$-cesty délky $l$ a pøitom nevzniknou ¾ádné nové krat¹í $st$-cesty. -Proto délka nejkrat¹ích cest vzroste alespoò o 1. -\qed +\figure{dinic-cestashranouzpet.eps}{Cesta u¾ívající novou zpìtnou hranu}{0.3\hsize} \h{Implementaèní poznámky} @@ -112,7 +103,7 @@ Proto d \:Není potøeba tak brutální èi¹tìní. Vrcholy se vstupním stupnìm 0 nám nevadí -- stejnì se do nich nedostaneme. Vadí jen vrcholy s výstupním stupnìm 0, kde by mohl havarovat postup v podkroku 9. -\:Je mo¾né dìlat prohledávání a èi¹tìní souèasnì. Jednodu¹e metodou HRRR na nì a kdy¾ +\:Je mo¾né dìlat prohledávání a èi¹tìní souèasnì. Jednodu¹e metodou Hrrr na nì a kdy¾ to nevyjde (dostaneme se do slepé ulièky), kus ustoupíme a pøi ústupu èistíme sí» odstraòováním slepé ulièky. \:U¾ pøi prohledáváni si rovnou udr¾ujeme minimum z rezerv a pøi zpáteèní cestì @@ -120,178 +111,154 @@ Proto d V ka¾dé úrovni rekurze si zapamatujeme minimum, jaké bylo, kdy¾ jsme tam pøi¹li. Pokud se vracíme, recyklujeme toto minimum.} \:V prùbìhu výpoètu udr¾ujeme jen sí» rezerv a tok vypoèteme a¾ nakonec z rezerv a kapacit. -\:Kdy¾ budeme chtít hledat minimální øez, spustíme Dinicùv algoritmus, pak jednou iterací FF - algoritmu dostaneme jeden z minimálních øezù\foot{Samozøejmì získáme i maximální tok.}. +\:Kdy¾ budeme chtít hledat minimální øez, spustíme po~Dinicovu algoritmu je¹tì jednu iterací F-F + algoritmu. \endlist -\s{Na pøemý¹lení:} Máme minimální øez. Jak zjistíme maximální tok? - \h{Speciální sítì (ubíráme na obecnosti)} -Dále se budeme vìnovat modifikacím algoritmu na speciální druhy sítí, +Dále se budeme vìnovat modifikacím Dinicova algoritmu na speciální druhy sítí, kde je mo¾né dostat lep¹í èasovou slo¾itost ne¾ v~obecném pøípadì. \s{Jednotkové kapacity:} V¹echny rezervy jsou jen 0 nebo~1. Na $st$-cestì má v¹echno kapacitu/rezervu~1. Mù¾eme poslat~1~a rovnou celou cestu zahodit -- není potøeba si pamatovat minimum z~rezerv. -Kdy¾ máme $m$ hran, zlep¹eních po cestách délky $l$ bude maximálnì $m/l$. +Kdy¾ máme $m$ hran, poèet zlep¹ení po cestách délky $l$ bude maximálnì $m/l$. Proto slo¾itost podkrokù 9, 10 a 11 bude $m/l \cdot \O(l) = \O(m)$.% \foot{Nebo by ¹lo argumentovat, ¾e ka¾dou hranu pou¾ijeme jen $1\times$.} Tedy pro jednotkové kapacity dostáváme slo¾itost $\O(nm)$. \s{Jednotkové kapacity znovu a lépe:} -Vnitøní cyklus lépe udìlat nepùjde. Je potøeba alespoò $\O(m)$ pro èi¹tìní. +Vnitøní cyklus lépe udìlat nepùjde. Je potøeba alespoò lineární èas pro èi¹tìní. Mù¾eme se ale pokusit lépe odhadnout poèet iterací vnìj¹ího cyklu. -Sledujeme stav sítì po $k$ iteracích vnìj¹ího cyklu a pokusíme se odhadnout, kolik iterací -je¹tì algoritmus udìlá. Oznaème délku nejkrat¹í $st$-cesty $l$. -Víme, ¾e $l \geq k$, proto¾e v ka¾dé iteraci vzroste $l$ alespoò o 1. +Sledujme stav sítì po $k$ iteracích vnìj¹ího cyklu a pokusme se odhadnout, kolik iterací +je¹tì algoritmus udìlá. Oznaème~$l$ délku nejkrat¹í $st$-cesty. +Víme, ¾e $l>k$, proto¾e v ka¾dé iteraci vzroste $l$ alespoò o 1. -Máme tok $f_k$ a chceme dostat maximální tok $f$. $f - f_k$ je tok v~síti rezerv. -Tedy $\exists f_R$ tok v síti rezerv takový, ¾e -zlep¹ení $f_k$ podle $f_R$ je $f$. +Máme tok $f_k$ a chceme dostat maximální tok $f$. Rozdíl $f-f_k$ je tok v~síti rezerv +(tok v~pùvodní síti to ov¹em být nemusí!), oznaème si ho~$f_R$. Ka¾dá iterace velkého cyklu zlep¹í $f_k$ alespoò o 1. Tedy nám zbývá je¹tì nejvý¹e $\vert f_R \vert$ iterací. Proto bychom chtìli omezit velikost toku $f_R$. Napøíklad øezem. - + Najdeme v síti rezerv øez $C$. Kde ho vzít?\foot{Pøeci v øeznictví. Kdepak, spí¹e v cukrárnì. Myslíte, ¾e v cukrárnì mají Dinicovy øezy? Myslím, ¾e v cukrárnì je vìt¹ina øezù minimální.} -Poèítejme jen hrany zleva doprava. Tìch je jistì nejvý¹e $m$ a tvoøí $k-1$ rozhraní mezi -$k$ vrstvami. Tedy existuje rozhraní vrstev +Poèítejme jen hrany zleva doprava. Tìch je jistì nejvý¹e $m$ a tvoøí alespoò $k$ rozhraní mezi +vrstvami. Tedy existuje rozhraní vrstev s~nejvý¹e $m/k$ hranami\foot{Princip holubníku a nìjaká ta $\pm1$.}. -Toto rozhraní je øez. Tedy existuje øez $C$, ¾e $\vert C\vert \leq m/k$ -Algoritmu tedy zbývá maximálnì $m/k$ krokù. -Celkový poèet krokù je nejvý¹ $k + m/k$. Staèí zvolit $k = \sqrt{m}$. Poèet krokù -pak bude $\O(\sqrt{m})$. +Toto rozhraní je øez. Tedy existuje øez $C$, pro nìj¾ $\vert C\vert \leq m/k$, +a~algoritmu zbývá maximálnì $m/k$ dal¹ích krokù. +Celkový poèet krokù je nejvý¹ $k + m/k$, tak¾e staèí zvolit $k = \sqrt{m}$ a získáme +odhad na~poèet krokù $\O(\sqrt{m})$. -Celkovì slo¾itost Dinicova algoritmu pro jednotkové kapacity znovu a lépe -je $\O(\sqrt{m} m) = \O(m^{3/2})$. Pomohli jsme si pro øídké grafy. +Celkovì slo¾itost Dinicova algoritmu pro jednotkové kapacity znovu a lépe +je $\O(\sqrt{m} \cdot m) = \O(m^{3/2})$. Pomohli jsme si pro øídké grafy. \s{Jednotkové kapacity a jeden ze stupòù roven 1:} -Úlohu hledání maximálního párování v bipartitním grafu lze -hezky pøevést na hledání maximálního toku. Z grafu se vytvoøí -sí» tak, ¾e v¹echny vrcholy jedné partity se napojí na $s$ a v¹echny -vrcholy druhé partity se napojí na $t$.\foot{$s,t$ jsou novì pøidané vrcholy.} -Na v¹echny hrany se dají jednotkové kapacity a orientace ka¾dé bude smìrem\foot{% -V¹echny hrany v bipartitním grafu se zorientují smìrem ke komponentì, kde je napojený -vrchol $t$. Hrany obsahující vrchol $t$ se zorientují smìrem do $t$. Hrany obsahující vrchol -$s$ se zorientují smìrem od $s$. Snad je to intuitivnì vidìt. Pro jistotu je nìkde okolo -obrázek popisované sítì.} k~$t$. -Najde se maximální tok a hrany v~toku tvoøí maximální párování. Proto mù¾e být -u¾iteèné zkoumat tento speciální pøípad sítí. - -\figure{dinic-bipartitni.eps}{Sí» vzniklá z bipartitního grafu}{0.4\hsize} - -Sí» se vyznaèuje tím, ¾e ka¾dý vrchol krom $s$ a $t$ má vstupní nebo výstupní stupeò 1. +Úlohu hledání maximálního párování v~bipartitním grafu, pøípadnì hledání +vrcholovì disjunktních cest v~obecném grafu lze pøevést (viz pøedchozí kapitola) +na~hledání maximálního toku v~síti, v~ní¾ $\forall v \neq s,t: \min(\deg^-(v), \deg^+(v)) \leq 1$. Pro takovou sí» mù¾eme odhad je¹tì tro¹ku upravit. My¹lenka je stejná jako minule. Pokusíme se nalézt v síti po $k$ krocích nìjaký malý øez. Místo rozhraní budeme hledat jednu malou -vrstvu a z malé vrstvy vytvoøíme malý øez. Pro ka¾dý vrchol z vrstvy vezmeme tu hranu, -která je ve svém smìru sama, a tím získáme øez. +vrstvu a z malé vrstvy vytvoøíme malý øez: Pro ka¾dý vrchol z vrstvy vezmeme tu hranu, +která je ve svém smìru sama. \figure{dinic-vrcholrez.eps}{Øez podle vrcholù ve vrstvì}{0.2\hsize} -Tedy $\forall v \neq s,t: \min(\deg^-(v), \deg^+(v)) \leq 1$. -Po $k$ krocích máme $k$ vrstev. Tedy existuje vrstva $\delta$ s nejvý¹e $n/k$ vrcholy\foot{Holubníkový princip.}. -Tedy existuje øez $C$, ¾e $\vert C\vert \leq n/k$, který získáme z vrstvy $\delta$ vý¹e popsaným postupem. -Algoritmu zbývá do konce $\leq n/k$ iterací vnìj¹ího cyklu. Algoritmus celkem udìlá $k + n/k$ krokù% -\foot{Mo¾ná chybí nìjaké $\pm1$, ale to nehraje roli.}. Staèí zvolit $k = \sqrt{n}$ a slo¾itost -celého algoritmu vyjde $\O(\sqrt{n}m)$\foot{Poèet iterací vnìj¹ího cyklu je $\O(\sqrt{n})$ a +Po $k$ krocích máme alespoò $k$ vrstev. Tedy existuje vrstva $\delta$ s nejvý¹e $n/k$ vrcholy. +Tedy existuje øez $C$ o~velikosti $\vert C\vert \leq n/k$ (získáme z vrstvy $\delta$ vý¹e popsaným postupem). +Algoritmu zbývá do konce $\leq n/k$ iterací vnìj¹ího cyklu, celkem tedy udìlá $k + n/k$ krokù. +Nyní staèí zvolit $k = \sqrt{n}$ a slo¾itost +celého algoritmu vyjde $\O(\sqrt{n}\cdot m)$\foot{Poèet iterací vnìj¹ího cyklu je $\O(\sqrt{n})$ a vnitøní cyklus má $\O(m)$.}. \s{Tøetí pokus pro jednotkové kapacity bez omezení na stupnì vrcholù v síti:} -Hlavní my¹lenkou je opìt po $k$ krocích najít nìjaký malý øez. Najdeme dvì malé\foot{Co do souètu -poètu vrcholù v obou vrstvách.} sousední vrstvy a v¹echny hrany mezi nimi budou tvoøit námi hledaný malý øez. +Hlavní my¹lenkou je opìt po $k$ krocích najít nìjaký malý øez. Najdeme dvì malé +sousední vrstvy a v¹echny hrany mezi nimi budou tvoøit námi hledaný malý øez. Oznaème $s_i$ poèet vrcholù v $i$-té vrstvì. Souèet poètu vrcholù ve dvou -sousedních vrstvách oznaèíme $t_i = s_i + s_{i+1}$. Bude tedy platit nerovnost -$$\sum_i t_i \leq 2\sum_i s_i \leq 2n {\rm .}$$ - -Tedy existuje $i$, ¾e $t_i \leq 2n/k$\foot{Holubníkový princip. Zase.}. -Tedy $\exists i: s_i + s_{i+1} \leq 2n/k$. Poèet hran mezi $s_i$ a $s_{i+1}$ je velikost øezu -$C$ a to je men¹í ne¾ $s_i \cdot s_{i+1}$. -Nejhor¹í pøípad je, kdy¾ $s_i = s_{i+1} = n/k$. Tedy $\vert C\vert \leq {(n/k)}^2$. -Pro jistotu je¹tì jednou v celku jako dlouhá nerovnost: -$$ \<\# hran mezi>\ s_i, s_{i+1} = \vert C\vert \leq s_i\cdot s_{i+1} \leq {(n/k)}^2 {\rm .}$$ -Proto poèet iterací velkého cyklu je $\leq \ + k + {(n/k)}^2$. +sousedních vrstvách oznaèíme $t_i = s_i + s_{i+1}$. Bude tedy platit nerovnost: +$$\sum_i t_i \leq 2\sum_i s_i \leq 2n.$$ +Podle holubníkového principu existuje $i$ takové, ¾e $t_i \leq 2n/k$, èili +$s_i + s_{i+1} \leq 2n/k$. Poèet hran mezi $s_i$ a $s_{i+1}$ je velikost øezu +$C$, a to je shora omezeno $s_i \cdot s_{i+1}$. Nejhor¹í pøípad nastane, kdy¾ $s_i = s_{i+1} = n/k$, +a~proto $\vert C\vert \leq {(n/k)}^2$. +Proto poèet iterací velkého cyklu je $\leq k + {(n/k)}^2$. Chytøe zvolíme $k = n^{2/3}$. Slo¾itost celého algoritmu pak bude $\O(n^{2/3}m)$. -\s{Poslední odhad pro celoèíselné kapacity:} -Poslední\foot{Samozøejmì následuje je¹tì jeden algoritmus i s odhadem pro celoèíselné kapacity. -Ale to u¾ není pøímo Dinicùv algoritmus. Jen Dinice pou¾ívá jako podprogram.} odhad je zalo¾en na velikosti +\s{Obecný odhad pro celoèíselné kapacity:} +Tento odhad je zalo¾en na velikosti maximálního toku $f$ a pøedpokladu celoèíselných kapacit. Za jednu iteraci velkého cyklu projdeme malým cyklem maximálnì tolikrát, o kolik se v nìm zvedl tok, proto¾e ka¾dá zlep¹ující cesta ho zvedne alespoò o $1$. -Zlep¹ující cesta se tedy hledá maximálnì $\vert f\vert$ krát za celou dobu bìhu algoritmu. +Zlep¹ující cesta se tedy hledá maximálnì $\vert f\vert$-krát za celou dobu bìhu algoritmu. Cestu najedeme v èase $\O(n)$. Celkem na hledání -cest spotøebujeme $\O(\vert f\vert n)$ za celou dobu bìhu algoritmu. +cest spotøebujeme $\O(\vert f\vert\cdot n)$ za celou dobu bìhu algoritmu. Nesmíme ale zapomenout na cleanupy. V jedné iteraci velkého cyklu stojí cleanupy $\O(m)$ a velkých -iterací je $\leq n$. Proto celková slo¾itost algoritmu je $\O(\vert f\vert n + nm)$ +iterací je $\leq n$. Proto celková slo¾itost algoritmu èiní $\O(\vert f\vert n + nm)$ -Pokud navíc budeme pøedpokládat omezení na maximální kapacitu hran $ \leq C$, -lze získat je¹tì jeden odhad tím, ¾e odhadneme maximální velikost toku jako $ \leq Cn$. -Co¾ lze odùvodnit napøíklad tak, ¾e z $s$ jde maximálnì $n$~hran\foot{Nepøedpokládáme multigraf.} -a kapacita ka¾dé je $ \leq C$. Proto celkový tok musí být $ \leq Cn$. -Dostaneme odhad $\O(Cn^2 + nm)$. +Pokud navíc budeme pøedpokládat, ¾e kapacita hran je nejvý¹e~$C$ a $G$ není multigraf, +mù¾eme vyu¾ít toho, ¾e $\vert f\vert \le Cn$ (omezeno øezem okolo~$s$) a získat odhad +$\O(Cn^2 + nm)$. \h{Scaling kapacit} -Základní my¹lenka je podobná, jako u algoritmu pro tøídìní dlouhých èísel postupnì po øádech pomocí +Základní my¹lenka je podobná, jako u algoritmu pro tøídìní dlouhých èísel postupnì po øádech pomocí radix-sortu. Pro jistotu si ho pøipomeòme. Algoritmus nejprve setøídí èísla podle poslední% \foot{Poslední cifrou myslíme nejménì významnou cifru.} -cifry, poté podle pøedposlední, pøedpøedposlední a tak dále. +cifry, poté podle pøedposlední, pøedpøedposlední a tak dále. \figure{dinic-sort.eps}{Kroky postupného tøídìní podle øádù}{0.2\hsize} 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í». - + Pøedpokládejme celoèíselné kapacity. Maximální tok v síti $G$ budeme hledat tak, ¾e hranám postupnì -budeme zvìt¹ovat kapacity bit po bitu v binárním zápisu, a¾ k jejich skuteèné kapacitì. +budeme zvìt¹ovat kapacity bit po bitu v binárním zápisu a¾ k jejich skuteèné kapacitì. Pøitom po~ka¾dém posunu zavoláme Dinicùv algoritmus. Pomocí pøedchozího odhadu uká¾eme, ¾e jedno volání Dinice nebude pøíli¹ drahé. \figure{dinic-scaling-original.eps}{Pùvodní sí», na hranách jsou jejich kapacity v binárním zápisu}{0.2\hsize} -Oznaème $k$ poèet bitù v zápisu nejvìt¹í kapacity z celé sítì. $k = \lceil \log_2C \rceil$. -Postupnì budeme budovat sítì $G_i$ s kapacitami $C_i(e) = \lfloor {C(e) / 2^{k-i}} \rfloor$. -$G_0$ je nejoøezanìj¹í sí», kde ka¾dá hrana má kapacitu jako je nejvy¹¹í bit v binárním zápisu +Oznaème $k$ poèet bitù v zápisu nejvìt¹í kapacity z celé sítì. $k = \lfloor \log_2C \rfloor$. +Postupnì budeme budovat sítì $G_i$ s~kapacitami $c_i(e) = \lfloor {c(e) / 2^{k-i}} \rfloor$. +$G_0$ je nejoøezanìj¹í sí», kde ka¾dá hrana má kapacitu rovnou nejvy¹¹ímu bitu v~binárním zápisu její skuteèné kapacity. $G_k$ je pùvodní sí» $G$. - $$ C_{i+1}(e) = \left\{ +$$ c_{i+1}(e) = \left\{ \eqalign{ - 2C_i(e), &\hbox{\quad pokud $(k-i-1)$-tý bitík je 0} \cr - 2C_i(e)+1, &\hbox{\quad pokud $(k-i-1)$-tý bitík je 1} \cr} + 2c_i(e), &\hbox{\quad pokud $(k-i-1)$-tý bitík je 0} \cr + 2c_i(e)+1, &\hbox{\quad pokud $(k-i-1)$-tý bitík je 1} \cr} \right. - $$ +$$ \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} -Na spoètení maximálního toku $f_i$ v síti $G_i$ zavoláme Dinicùv algoritmus, +Na spoètení maximálního toku $f_i$ v síti $G_i$ zavoláme Dinicùv algoritmus, ov¹em do zaèátku nepou¾ijeme nulový tok, nýbr¾ tok $2f_{i-1}$. Rozdíl toku z inicializace -a výsledného bude malý. - -Tvrdíme, ¾e: +a výsledného bude malý, toti¾: $$ \vert f_i\vert - \vert 2f_{i-1}\vert \leq m.$$ \s{Dùkaz:} -Vezmeme minimální øez $R$ v $G_{i-1}$. Platí $\vert f_{i-1}\vert = \vert R\vert$\foot{Minimaxová vìta.}. +Vezmeme minimální øez $R$ v $G_{i-1}$. Platí $\vert f_{i-1}\vert = \vert R\vert$\foot{F-F vìta.}. Øez $R$ obsahuje $\leq m$ hran. V $G_{i}$ má øez $R$ kapacitu maximálnì $2\vert R\vert+m$. Maximální tok je omezen ka¾dým øezem. Tedy i øezem $R$. Proto tok vzroste o $\leq m$. - -Proto podle pøedchozího odhadu výpoèet toku $f_i$ trvá $\O(mn)$. Tok se bude poèítat $k$-krát. -Celková slo¾itost bude $\O(mn\log C)$. \qed +Proto podle pøedchozího odhadu výpoèet toku $f_i$ trvá $\O(mn)$. Takový tok se bude poèítat $k$-krát, +tak¾e celková slo¾itost vyjde $\O(mn\log C)$. + \h{Dinicova tabulka} $$\vbox{\halign{# \hfil \quad &# \hfil \cr \it verze &\it èas \cr\noalign{\smallskip\hrule\smallskip} standardní &$\O(n^2m)$ \cr jednotkové kapacity &$\O(nm)$ \cr -jednotkové kapacity podruhé &$\O(\sqrt{m}m) = \O(m^{3/2})$ \cr -jednotkové kapacity, 1 stupeò $\leq 1$ &$\O(\sqrt{n}m)$ \cr +jednotkové kapacity podruhé &$\O(\sqrt{m}\cdot m) = \O(m^{3/2})$ \cr +jednotkové kapacity, 1 stupeò $\leq 1$ &$\O(\sqrt{n}\cdot m)$ \cr jednotkové kapacity veseleji &$\O(n^{2/3}m)$ \cr -celoèíselné kapacity &$\O(\vert f\vert n + nm)$ \cr +celoèíselné kapacity &$\O(\vert f\vert\cdot n + nm)$ \cr celoèíselné kapacity $ \leq C$ &$\O(Cn^2 + mn)$ \cr celoèíselné kapacity $ \leq C$ &$\O(mn\log C)$ \cr }}$$ diff --git a/2-dinic/dinic-bipartitni.eps b/2-dinic/dinic-bipartitni.eps deleted file mode 100644 index bc8b0ab..0000000 --- a/2-dinic/dinic-bipartitni.eps +++ /dev/null @@ -1,420 +0,0 @@ -%!PS-Adobe-2.0 EPSF-2.0 -%%Title: Diagram1.dia -%%Creator: Dia v0.94 -%%CreationDate: Thu Apr 27 13:18:41 2006 -%%For: bernard -%%Orientation: Portrait -%%Magnification: 1.0000 -%%BoundingBox: 0 0 674 341 -%%BeginSetup -%%EndSetup -%%EndComments -%%BeginProlog -[ /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /space /exclam /quotedbl /numbersign /dollar /percent /ampersand /quoteright -/parenleft /parenright /asterisk /plus /comma /hyphen /period /slash /zero /one -/two /three /four /five /six /seven /eight /nine /colon /semicolon -/less /equal /greater /question /at /A /B /C /D /E -/F /G /H /I /J /K /L /M /N /O -/P /Q /R /S /T /U /V /W /X /Y -/Z /bracketleft /backslash /bracketright /asciicircum /underscore /quoteleft /a /b /c -/d /e /f /g /h /i /j /k /l /m -/n /o /p /q /r /s /t /u /v /w -/x /y /z /braceleft /bar /braceright /asciitilde /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef /.notdef -/space /exclamdown /cent /sterling /currency /yen /brokenbar /section /dieresis /copyright -/ordfeminine /guillemotleft /logicalnot /hyphen /registered /macron /degree /plusminus /twosuperior /threesuperior -/acute /mu /paragraph /periodcentered /cedilla /onesuperior /ordmasculine /guillemotright /onequarter /onehalf -/threequarters /questiondown /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla -/Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde -/Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex -/Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring -/ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis -/eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave -/uacute /ucircumflex /udieresis /yacute /thorn /ydieresis] /isolatin1encoding exch def -/cp {closepath} bind def -/c {curveto} bind def -/f {fill} bind def -/a {arc} bind def -/ef {eofill} bind def -/ex {exch} bind def -/gr {grestore} bind def -/gs {gsave} bind def -/sa {save} bind def -/rs {restore} bind def -/l {lineto} bind def -/m {moveto} bind def -/rm {rmoveto} bind def -/n {newpath} bind def -/s {stroke} bind def -/sh {show} bind def -/slc {setlinecap} bind def -/slj {setlinejoin} bind def -/slw {setlinewidth} bind def -/srgb {setrgbcolor} bind def -/rot {rotate} bind def -/sc {scale} bind def -/sd {setdash} bind def -/ff {findfont} bind def -/sf {setfont} bind def -/scf {scalefont} bind def -/sw {stringwidth pop} bind def -/tr {translate} bind def - -/ellipsedict 8 dict def -ellipsedict /mtrx matrix put -/ellipse -{ ellipsedict begin - /endangle exch def - /startangle exch def - /yrad exch def - /xrad exch def - /y exch def - /x exch def /savematrix mtrx currentmatrix def - x y tr xrad yrad sc - 0 0 1 startangle endangle arc - savematrix setmatrix - end -} def - -/mergeprocs { -dup length -3 -1 roll -dup -length -dup -5 1 roll -3 -1 roll -add -array cvx -dup -3 -1 roll -0 exch -putinterval -dup -4 2 roll -putinterval -} bind def -/dpi_x 300 def -/dpi_y 300 def -/conicto { - /to_y exch def - /to_x exch def - /conic_cntrl_y exch def - /conic_cntrl_x exch def - currentpoint - /p0_y exch def - /p0_x exch def - /p1_x p0_x conic_cntrl_x p0_x sub 2 3 div mul add def - /p1_y p0_y conic_cntrl_y p0_y sub 2 3 div mul add def - /p2_x p1_x to_x p0_x sub 1 3 div mul add def - /p2_y p1_y to_y p0_y sub 1 3 div mul add def - p1_x p1_y p2_x p2_y to_x to_y curveto -} bind def -/start_ol { gsave 1.1 dpi_x div dup scale} bind def -/end_ol { closepath fill grestore } bind def -28.346000 -28.346000 scale --2.500000 -14.003022 translate -%%EndProlog - - -1.000000 1.000000 1.000000 srgb -n 18.960000 8.055822 0.950000 5.861600 0 360 ellipse f -0.100000 slw -[] 0 sd -[] 0 sd -0.000000 0.000000 0.000000 srgb -n 18.960000 8.055822 0.950000 5.861600 0 360 ellipse cp s -1.000000 1.000000 1.000000 srgb -n 15.185000 7.955822 0.462500 0.450000 0 360 ellipse f -0.100000 slw -[] 0 sd -[] 0 sd -0.000000 0.000000 0.000000 srgb -n 15.185000 7.955822 0.462500 0.450000 0 360 ellipse cp s -1.000000 1.000000 1.000000 srgb -n 25.671000 8.187822 0.450000 0.450000 0 360 ellipse f -0.100000 slw -[] 0 sd -[] 0 sd -0.000000 0.000000 0.000000 srgb -n 25.671000 8.187822 0.450000 0.450000 0 360 ellipse cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 15.512040 7.637622 m 18.419170 5.984009 l s -[] 0 sd -0 slj -0 slc -n 18.745128 5.798600 m 18.434124 6.263118 l 18.419170 5.984009 l 18.186912 5.828507 l ef -n 18.745128 5.798600 m 18.434124 6.263118 l 18.419170 5.984009 l 18.186912 5.828507 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 15.512040 8.274022 m 18.422626 10.310358 l s -[] 0 sd -0 slj -0 slc -n 18.729891 10.525330 m 18.176889 10.443544 l 18.422626 10.310358 l 18.463519 10.033857 l ef -n 18.729891 10.525330 m 18.176889 10.443544 l 18.422626 10.310358 l 18.463519 10.033857 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 15.647500 7.955822 m 18.473418 8.041133 l s -[] 0 sd -0 slj -0 slc -n 18.848248 8.052448 m 18.340931 8.287247 l 18.473418 8.041133 l 18.356019 7.787475 l ef -n 18.848248 8.052448 m 18.340931 8.287247 l 18.473418 8.041133 l 18.356019 7.787475 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 19.013500 3.933422 m 22.283474 10.039186 l s -[] 0 sd -0 slj -0 slc -n 22.460516 10.369763 m 22.004075 10.047022 l 22.283474 10.039186 l 22.444845 9.810966 l ef -n 22.460516 10.369763 m 22.004075 10.047022 l 22.283474 10.039186 l 22.444845 9.810966 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 19.269500 8.093422 m 21.957872 5.947052 l s -[] 0 sd -0 slj -0 slc -n 22.250928 5.713079 m 22.016169 6.220414 l 21.957872 5.947052 l 21.704205 5.829673 l ef -n 22.250928 5.713079 m 22.016169 6.220414 l 21.957872 5.947052 l 21.704205 5.829673 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 18.885500 12.253422 m 22.202993 8.243405 l s -[] 0 sd -0 slj -0 slc -n 22.442032 7.954467 m 22.315939 8.499077 l 22.202993 8.243405 l 21.930688 8.180358 l ef -n 22.442032 7.954467 m 22.315939 8.499077 l 22.202993 8.243405 l 21.930688 8.180358 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 19.141500 10.589422 m 22.059297 10.590193 l s -[] 0 sd -0 slj -0 slc -n 22.434297 10.590293 m 21.934231 10.840160 l 22.059297 10.590193 l 21.934363 10.340160 l ef -n 22.434297 10.590293 m 21.934231 10.840160 l 22.059297 10.590193 l 21.934363 10.340160 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 22.661500 5.917422 m 24.958749 7.583788 l s -[] 0 sd -0 slj -0 slc -n 25.262299 7.803975 m 24.710774 7.712758 l 24.958749 7.583788 l 25.004357 7.308025 l ef -n 25.262299 7.803975 m 24.710774 7.712758 l 24.958749 7.583788 l 25.004357 7.308025 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 22.725500 7.901422 m 24.737371 8.132318 l s -[] 0 sd -0 slj -0 slc -n 25.109926 8.175074 m 24.584682 8.366435 l 24.737371 8.132318 l 24.641691 7.869696 l ef -n 25.109926 8.175074 m 24.584682 8.366435 l 24.737371 8.132318 l 24.641691 7.869696 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 22.789500 10.525422 m 24.970408 8.807276 l s -[] 0 sd -0 slj -0 slc -n 25.264977 8.575211 m 25.026928 9.081010 l 24.970408 8.807276 l 24.717508 8.688251 l ef -n 25.264977 8.575211 m 25.026928 9.081010 l 24.970408 8.807276 l 24.717508 8.688251 l cp s -gsave 14.597500 10.118322 translate 0.035278 -0.035278 scale -start_ol -6314 6050 moveto -6023 4487 lineto -5441 4766 4866 4911 conicto -4292 5056 3780 5056 conicto -3194 5056 2877 4902 conicto -2560 4749 2560 4465 conicto -2560 4297 2736 4196 conicto -2912 4096 3428 3985 conicto -3785 3918 lineto -4987 3660 5469 3254 conicto -5952 2848 5952 2126 conicto -5952 1034 5110 421 conicto -4269 -192 2758 -192 conicto -2127 -192 1467 -90 conicto -807 12 120 215 conicto -416 1793 lineto -946 1475 1551 1313 conicto -2156 1152 2790 1152 conicto -3408 1152 3720 1302 conicto -4032 1453 4032 1743 conicto -4032 1944 3856 2055 conicto -3680 2167 3131 2284 conicto -2774 2351 lineto -1726 2575 1279 3011 conicto -832 3448 832 4221 conicto -832 5269 1610 5834 conicto -2389 6400 3834 6400 conicto -4467 6400 5079 6312 conicto -5692 6225 6314 6050 conicto -end_ol grestore -gsave 25.613500 10.255322 translate 0.035278 -0.035278 scale -start_ol -4037 8003 moveto -3703 6228 lineto -5709 6228 lineto -5430 4800 lineto -3423 4800 lineto -2919 2171 lineto -2897 2082 2888 2021 conicto -2880 1960 2880 1904 conicto -2880 1650 3047 1539 conicto -3215 1428 3610 1428 conicto -4624 1428 lineto -4344 0 lineto -2704 0 lineto -1822 0 1359 378 conicto -896 757 896 1470 conicto -896 1625 912 1803 conicto -929 1981 961 2166 conicto -1460 4800 lineto -501 4800 lineto -770 6228 lineto -1736 6228 lineto -2072 8003 lineto -4037 8003 lineto -end_ol grestore -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 15.185000 8.405822 m 18.375125 11.865157 l s -[] 0 sd -0 slj -0 slc -n 18.629346 12.140832 m 18.106601 11.942746 l 18.375125 11.865157 l 18.474167 11.603785 l ef -n 18.629346 12.140832 m 18.106601 11.942746 l 18.375125 11.865157 l 18.474167 11.603785 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 15.185000 7.505822 m 18.416343 4.216682 l s -[] 0 sd -0 slj -0 slc -n 18.679147 3.949177 m 18.507078 4.481053 l 18.416343 4.216682 l 18.150405 4.130647 l ef -n 18.679147 3.949177 m 18.507078 4.481053 l 18.416343 4.216682 l 18.150405 4.130647 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 22.405500 3.997422 m 25.350846 7.371108 l s -[] 0 sd -0 slj -0 slc -n 25.597471 7.653599 m 25.080310 7.441361 l 25.350846 7.371108 l 25.456965 7.112528 l ef -n 25.597471 7.653599 m 25.080310 7.441361 l 25.350846 7.371108 l 25.456965 7.112528 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 22.642000 12.297922 m 25.360633 9.012855 l s -[] 0 sd -0 slj -0 slc -n 25.599718 8.723955 m 25.473537 9.268545 l 25.360633 9.012855 l 25.088338 8.949765 l ef -n 25.599718 8.723955 m 25.473537 9.268545 l 25.360633 9.012855 l 25.088338 8.949765 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 19.013500 3.805422 m 21.854697 3.805422 l s -[] 0 sd -0 slj -0 slc -n 22.229697 3.805422 m 21.729697 4.055422 l 21.854697 3.805422 l 21.729697 3.555422 l ef -n 22.229697 3.805422 m 21.729697 4.055422 l 21.854697 3.805422 l 21.729697 3.555422 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 19.077500 12.253422 m 21.982697 12.253422 l s -[] 0 sd -0 slj -0 slc -n 22.357697 12.253422 m 21.857697 12.503422 l 21.982697 12.253422 l 21.857697 12.003422 l ef -n 22.357697 12.253422 m 21.857697 12.503422 l 21.982697 12.253422 l 21.857697 12.003422 l cp s -0.100000 slw -[] 0 sd -[] 0 sd -n 22.291900 8.091422 0.950000 5.861600 0 360 ellipse cp s -1.000000 1.000000 1.000000 srgb -n 3.500000 7.911600 0.950000 5.861600 0 360 ellipse f -0.100000 slw -[] 0 sd -[] 0 sd -0.000000 0.000000 0.000000 srgb -n 3.500000 7.911600 0.950000 5.861600 0 360 ellipse cp s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 3.553500 3.789200 m 7.053300 10.324100 l s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 3.809500 7.949200 m 6.878300 5.499100 l s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 3.425500 12.109200 m 7.053300 7.724100 l s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 3.681500 10.445200 m 7.086100 10.446100 l s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 3.553500 3.661200 m 6.881500 3.661200 l s -0.100000 slw -[] 0 sd -[] 0 sd -0 slc -n 3.617500 12.109200 m 7.009500 12.109200 l s -0.100000 slw -[] 0 sd -[] 0 sd -n 6.831900 7.947200 0.950000 5.861600 0 360 ellipse cp s -0.100000 slw -[0.200000] 0 sd -[0.200000] 0 sd -0 slj -0 slc -n 9.297500 8.575000 m 11.547500 7.075000 11.397500 9.425000 12.998695 8.304163 c s -[] 0 sd -0 slj -0 slc -n 13.305907 8.089115 m 13.039657 8.580654 l 12.998695 8.304163 l 12.752926 8.171038 l ef -n 13.305907 8.089115 m 13.039657 8.580654 l 12.998695 8.304163 l 12.752926 8.171038 l cp s -showpage