From: Martin Mares Date: Mon, 7 Nov 2011 19:15:01 +0000 (+0100) Subject: Dinic: Korektury X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=b45ae1ffbf11f3d18fc85621fb96da365f826290;p=ads2.git Dinic: Korektury --- diff --git a/3-dinic/3-dinic.tex b/3-dinic/3-dinic.tex index 871d164..f639261 100644 --- a/3-dinic/3-dinic.tex +++ b/3-dinic/3-dinic.tex @@ -27,7 +27,7 @@ P $$r(uv) = c(uv) - f(uv) + f(vu).$$ Nyní uká¾eme, jak tok zlep¹it pomocí toku v~pøíslu¹né síti rezerv: -\s{Lemma (o~zlep¹ování tokù):} Pro libovolný tok~$f$ v~síti~$S$ a libovolný tok~$g$ v~síti $R(S,f)$ +\s{Lemma Z (o~zlep¹ování tokù):} Pro libovolný tok~$f$ v~síti~$S$ a libovolný tok~$g$ v~síti $R(S,f)$ lze v~èase $\O(m)$ nalézt tok~$f'$ v~síti~$S$ takový, ¾e $\vert f' \vert = \vert f \vert + \vert g \vert$. @@ -78,20 +78,24 @@ a v \h{Dinicùv algoritmus} -Dinicùv algoritmus bude postupnì hledat nìjaké toky~$g$ v~síti rezerv, pùvodnì nulový +Dinicùv algoritmus bude postupnì hledat nìjaké pomocné toky v~síti rezerv, pùvodnì nulový tok pomocí nich zlep¹ovat, a¾ se dostane k~maximálnímu toku. Poèet potøebných iterací -pøitom bude záviset na tom, jak \uv{kvalitní} je tok~$g$ -- na jednu stranu bychom -chtìli, aby byl podobný maximálnímu toku, na druhou stranu jeho výpoètem nechceme +pøitom bude záviset na tom, jak \uv{kvalitní} pomocné toky se¾ene -- na jednu stranu bychom +chtìli, aby byly podobné maximálnímu toku, na druhou stranu jejich výpoètem nechceme trávit pøíli¹ mnoho èasu. Vhodným kompromisem jsou blokující toky: \s{Definice:} Tok~$f$ je {\I blokující}, jestli¾e pro~ka¾dou orientovanou -cestu~$P$ ze~$z$ do~$s$ existuje hrana~$e \in P$ taková, ¾e $f(e) = c(e)$ -(té budeme øíkat {\I nasycená hrana}). +cestu~$P$ ze~$z$ do~$s$ existuje hrana~$e \in P$, pro ní¾ $f(e) = c(e)$. \s{Definice:} Sí» je {\I vrstevnatá (proèi¹tìná)}, pokud v¹echny její vrcholy a~hrany le¾í na~nejkrat¹ích cestách ze~$z$ do~$s$. (Abychom vyhovìli na¹í definici sítì, musíme ke~ka¾dé takové hranì pøidat hranu opaènou s~nulovou kapacitou, -ale ty ná¹ algoritmus nebude pou¾ívat a ani udr¾ovat v~pamìti.) +ale ty algoritmus nebude pou¾ívat a ani udr¾ovat v~pamìti.) + +\s{Pozorování:} Proèi¹tìná sí» se skládá z~vrstev. V~$i$-té vrstvì le¾í ty vrcholy, +jeji¾ vzdálenost od zdroje je rovna~$i$. Z~$i$-té vrstvy vedou hrany pouze do vrstev +$0,1,\ldots,i,i+1$ -- tedy pouze uvnitø vrstvy, zpìt a o~právì jednu vrstvu dopøedu. +Proto se takové síti také øíká {\I vrstevnatá.} \figure{dinic-cistasit.eps}{Proèi¹tìná sí» rozdìlená do~vrstev}{0.4\hsize} @@ -114,12 +118,13 @@ ale ty n \:Rozdìlíme vrcholy do~vrstev podle vzdálenosti od~$z$. \:Odstraníme vrstvy za~$s$ (tedy vrcholy vzdálenìj¹í ne¾~$\ell$). \:Odstraníme hrany do~pøedchozích vrstev a hrany uvnitø vrstev. -\:Odstraníme \uv{slepé ulièky}, tedy vrcholy s~$\deg^{out}(v) = 0$, a~to -opakovanì pomocí fronty. (Nejdøíve zaøadíme do~fronty v¹echny vrcholy s~ -$\deg^{out}(v) = 0$. Pak dokud není fronta prázdná, v¾dy vybereme vrchol~$v$ -z~fronty, odstraníme~$v$ a~v¹echny hrany~$uv$. Pro~ka¾dý takový vrchol~$u$ -zkontrolujeme, zda se $\deg^{out}(u)$ nesní¾il na~nulu. Pokud sní¾il, -zaøadíme~$u$ na konec~fronty.) +\:Odstraníme \uv{slepé ulièky}, tedy vrcholy s~$\deg^{out}(v) = 0$: +opakovanì pomocí fronty~$F$: +\::$F \leftarrow \{ v\ne s \mid \deg^{out}(v) = 0 \}.$ +\::Dokud $F\ne\emptyset$, opakujeme: +\:::Vezmeme vrchol~$v$ z~$F$. +\:::Sma¾eme~$v$ i v¹echny hrany, které do nìj vedou. +\:::Pokud nìjakému vrcholu klesl $\deg^{out}$ na~0, pøidáme ho do~$F$. \endalgo \figure{dinic-neprocistenasit.eps}{Neproèi¹tìná sí». Obsahuje zpìtné hrany, hrany uvnitø vrstvy a~slepé ulièky.}{0.45\hsize} @@ -130,16 +135,17 @@ orientovanou cestu ze~zdroje do stoku -- to se ve~vrstevnat staèí vyrazit ze~zdroje a pak následovat libovolnou hranu. A¾ cestu najdeme, tok~$g$ podél ní zlep¹íme, jak nejvíce to pùjde. -Pokud nyní tok na nìjaké hranì dosáhl její rezervy, hranu sma¾eme. Tím jsme -mohli poru¹it proèi¹tìnost -- to pokud jsme smazali nìjakému vrcholu poslední -odchozí nebo poslední pøíchozí hranu. Takových vrcholù se opìt pomocí fronty -postupnì zbavíme a sí» doèistíme. Pokraèujeme zlep¹ením po dal¹í cestì, -dokud nìjaké cesty existují.% +Pokud nyní tok na nìjakých hranách dosáhl jejich rezervy, tyto hrany sma¾eme. Tím jsme +mohli poru¹it proèi¹tìnost -- pakli¾e nìjaký vrchol pøi¹el o~poslední odchozí nebo poslední +pøíchozí hranu. Takových vrcholù se opìt pomocí fronty zbavíme a sí» doèistíme. +Pokraèujeme zlep¹ováním po dal¹ích cestách, dokud nìjaké existují.% \foot{V¹imnìte si, ¾e algoritmus skonèí tím, ¾e sma¾e v¹echny vrcholy i hrany. Také si v¹imnìte, ¾e vrcholy s~nulovým vstupním stupnìm jsme ani nemuseli mazat, proto¾e se do nich algoritmus pøi hledání cest nikdy nedostane.} -Hledání blokujícího toku tedy mù¾eme zapsat takto: +Celé hledání blokujícího toku tedy vypadá následovnì: + +\nobreak \algo \:$g \leftarrow$ nulový tok. @@ -152,20 +158,21 @@ Hled \h{Analýza Dinicova algoritmu} -\s{Lemma (o~korektnosti):} Pokud se~algoritmus zastaví, vydá maximální tok. +\s{Lemma K (o~korektnosti):} Pokud se~algoritmus zastaví, vydá maximální tok. \proof Z~lemmatu o~zlep¹ování tokù plyne, ¾e~$f$ je stále korektní tok. Algoritmus se zastaví tehdy, kdy¾ u¾ neexistuje cesta ze~$z$ do~$s$ po hranách s~kladnou -rezervou. To je pøesnì tehdy, kdy¾ se zastaví i Fordùv-Fulkersonùv algoritmus, +rezervou. Tehdy by se zastavil i Fordùv-Fulkersonùv algoritmus, a ten, jak u¾ víme, je korektní. \qed Nyní rozebereme èasovou slo¾itost. Rozdìlíme si k~tomu úèelu algoritmus na {\I fáze} -- tak budeme øíkat jednotlivým prùchodùm vnìj¹ím cyklem. -Pøedpokládejme, ¾e graf neobsahuje izolované vrcholy, tak¾e $n=\O(m)$. +Také budeme pøedpokládat, ¾e graf na vstupu neobsahuje izolované vrcholy, tak¾e +$\O(n+m) = \O(m)$. -\s{Lemma (o~slo¾itosti fází):} Ka¾dá fáze trvá $\O(nm)$. +\s{Lemma S (o~slo¾itosti fází):} Ka¾dá fáze trvá $\O(nm)$. \proof Sestrojení sítì rezerv, mazání hran s~nulovou rezervou, hledání nejkrat¹í cesty @@ -181,13 +188,13 @@ vypadne alespo \uv{rovnou za nosem} pøitom trvá $\O(n)$. Celkem tedy $\O(nm)$ plus èi¹tìní, které jsme ale u¾ zapoèítali. -Dohromady tedy jedna fáze dobìhne v~èase $\O(m + m + nm) = \O(nm)$. +Celá jedna fáze proto dobìhne v~èase $\O(m + m + nm) = \O(nm)$. \qed Zbývá nám jen urèit, kolik probìhne fází. K~tomu se bude hodit následující lemma: -\s{Lemma (o~délce cest):} Délka $\ell$ nejkrat¹í cesty ze~$z$ do~$s$ vypoètená v~kroku~4 +\s{Lemma C (o~délce cest):} Délka $\ell$ nejkrat¹í cesty ze~$z$ do~$s$ vypoètená v~kroku~4 Dinicova algoritmu po ka¾dé fázi vzroste alespoò o~1. \proof @@ -222,10 +229,10 @@ V \s{Vìta:} Dinicùv algoritmus najde maximální tok v~èase $\O(n^2m)$. \proof -Jeliko¾ ka¾dá cesta obsahuje nejvý¹e~$n$ vrcholù, z~lemmatu o~délce cest plyne, -¾e fází probìhne nejvý¹e~$n$. Jedna fáze ov¹em trvá $\O(nm)$, co¾ dává celkovou -slo¾itost $\O(n^2m)$. Speciálnì se tedy algoritmus v¾dy zastaví, tak¾e podle -lemmatu o~korektnosti vydá maximální tok. +Jeliko¾ ka¾dá cesta obsahuje nejvý¹e~$n$ vrcholù, z~lemmatu~C plyne, +¾e fází probìhne nejvý¹e~$n$. Ka¾dá fáze podle lemmatu~S trvá $\O(nm)$, +co¾ dává celkovou slo¾itost $\O(n^2m)$. Speciálnì se tedy algoritmus v¾dy zastaví, tak¾e podle +lemmatu~K o~korektnosti vydá maximální tok. \qed \ss{Pár poznámek na závìr:} @@ -236,8 +243,10 @@ Nez existuje alespoò jeden maximální tok. V~sítích s~malými celoèíselnými kapacitami se algoritmus chová daleko lépe, -ne¾ øíká ná¹ odhad. Uveïme bez dùkazu alespoò jeden takový výsledek: pøi hledání -nejvìt¹ího párování pøevodem na~toky, který jsme si ukázali na minulé pøedná¹ce, -by Dinicùv algoritmus dobìhl v~èase $\O(\sqrt n \cdot m)$. +ne¾ øíká ná¹ odhad. Snadno se dá dokázat, ¾e pro jednotkové kapacity dobìhne +v~èase $\O(nm)$ (stejnì jako Fordùv-Fulkersonùv). Uveïme bez dùkazu je¹tì +jeden silnìj¹í výsledek: v~síti vzniklé pøi hledání nejvìt¹ího párování +algoritmem z~minulé pøedná¹ky je slo¾itost Dinicova algoritmu omezena $\O(\sqrt +n \cdot m)$. \bye