]> mj.ucw.cz Git - ads2.git/commitdiff
Dinic: Prepsano, ted daleko lepe odpovida tomu, jak to posledni roky prednasim
authorMartin Mares <mj@ucw.cz>
Fri, 4 Nov 2011 21:25:04 +0000 (22:25 +0100)
committerMartin Mares <mj@ucw.cz>
Fri, 4 Nov 2011 21:25:04 +0000 (22:25 +0100)
3-dinic/3-dinic.tex

index 42acc0803ffa0608e02bd19a9b29ff57570e0f48..0a66a68b52dd9760e2b3764bd756315671f5bca4 100644 (file)
@@ -13,205 +13,223 @@ a~najde maxim
 
 Fordùv-Fulkersonùv algoritmus má ov¹em znaèné nevýhody. Funguje pouze
 pro~racionální kapacity a~je pomìrnì pomalý. Nyní si~uká¾eme jiný algoritmus,
-který nevylep¹uje tok pomocí cest, ale pomocí tokù\dots Budeme k~tomu
-potøebovat sí» rezerv.
+který nevylep¹uje tok pomocí cest, ale pomocí tokù~\dots
 
-\s{Definice:} {\I Sí» rezerv} k~toku~$f$ v~síti $S=(V,E,z,s,c)$ je sí» $R=(S,f)=(V,E,z,s,r)$, kde~$r(e)$ je rezerva hrany~$e$ v~toku~$f$.
+\h{Sí» rezerv a zlep¹ující toky}
 
-\s{Konvence:} Pro~hranu~$e$ znaèí~$\overleftarrow{e}$ hranu opaènou. Napø. pokud $e=uv$, tak $\overleftarrow{e}=vu$.
+\s{Definice:} {\I Sí» rezerv} k~toku~$f$ v~síti $S=(V,E,z,s,c)$ je sí» $R(S,f)=(V,E,z,s,r)$,
+kde~$r(e)$ je rezerva hrany~$e$ pøi toku~$f$.
 
-Je dùle¾ité si~uvìdomit, ¾e sí» rezerv je závislá jak na~pùvodní síti~$S$, tak na~nìjakém toku~$f$ v~síti~$S$. Sí» rezerv~$R$ se~pak od sítì~$S$ li¹í pouze kapacitami -- sí»~$R$ má jako kapacitu hrany rezervu hrany v pùvodní síti. Pro~pøipomenutí: rezervu hrany~$e$ v~síti $S=(V,E,z,s,c)$ s~tokem~$f$ jsme si~definovali jako $r(e)=c(e) - f(e) + f(\overleftarrow{e})$.
+Je dùle¾ité si~uvìdomit, ¾e sí» rezerv konstruujeme pro konkrétní tok v~pùvodní síti.
+Od pùvodní sítì se li¹í pouze tím, ¾e kapacit hran jsme nahradili jejich rezervami.
+Pøipomeòme je¹tì, ¾e rezervu hrany~$uv$ jsme definovali jako
+$$r(uv) = c(uv) - f(uv) + f(vu).$$
+Nyní uká¾eme, jak toky zlep¹ovat pomocí tokù v~pøíslu¹né síti rezerv:
 
-Ne¾ si~uká¾eme samotný algoritmus, doká¾eme si~následující lemma.
-
-\s{Lemma:} Pro~ka¾dý tok~$f$ v~síti~$S$ a~pro~ka¾dý 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$.
+\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)$
+lze v~èase $\O(m)$ nalézt tok~$f'$ v~síti~$S$ takový, ¾e
+$\vert f' \vert = \vert f \vert + \vert g \vert$.
 
 \proof
+Nejprve uká¾eme, jak tok~$f'$ sestrojit. V~druhém kroku doká¾eme, ¾e konstrukce
+opravdu dává korektní tok. Nakonec nahlédneme, ¾e jeho velikost je taková, jakou
+lemma slibuje.
 
-Dùkaz rozdìlíme do~tøí krokù. V~prvním kroku si~uká¾eme, jak budeme tok~$f'$ v~síti~$S$ konstruovat. V~druhém kroku doká¾eme, ¾e takto zkonstruované~$f'$ je opravdu tok. A~nakonec uká¾eme, ¾e splòuje po¾adovanou vlastnost, tedy ¾e jeho velikost je souèet velikostí tokù~$f$ a~$g$.
-
-\>{\it 1. konstrukce~$f'$}
+\>{\I Konstrukce~$f'$:} Pro ka¾dou dvojici hran $uv$ a $vu$ urèíme $f'(uv)$ a $f'(vu)$ následovnì:
 
-\noindent
-Pro ka¾dou dvojici hran~$e, \overleftarrow{e}$ urèíme~$f'(e)$ a~$f'(\overleftarrow{e})$ následovnì:
+\def\irtri{\raise0.2ex\hbox{$\triangleright$}} % Signs frequently used for \itemize
 
 \itemize\ibull
-\:Pokud~$g(e) = g(\overleftarrow{e}) = 0$, pak nastavme:
-       \itemize\ibull
-       \:$f'(e) := f(e)$,
-       \:$f'(\overleftarrow{e}) := f(\overleftarrow{e})$.
+\:Pokud $g(uv)=g(vu)=0$, polo¾íme:
+       \itemize\irtri
+       \:$f'(uv) := f(uv)$,
+       \:$f'(vu) := f(vu)$.
        \endlist
        
-\:Pokud~$g(e) > 0$ a~$g(\overleftarrow{e}) = 0$, pak polo¾me:
-       \itemize\ibull
-       \:$\varepsilon := \min (g(e), f(\overleftarrow{e}))$,
-       \:$f'(e) := f(e) + g(e) - \varepsilon$,
-       \:$f'(\overleftarrow{e}) := f(\overleftarrow{e}) - \varepsilon$.
+\:Pokud~$g(uv)>0$ a~$g(vu)=0$, pak polo¾me:
+       \itemize\irtri
+       \:$\varepsilon := \min (g(uv), f(vu))$,
+       \:$f'(uv) := f(uv) + g(uv) - \varepsilon$.
+       \:$f'(vu) := f(vu) - \varepsilon$,
        \endlist
 
-\:Pøípad~$g(e) = 0$ a~$g(\overleftarrow{e}) > 0$ vyøe¹íme obdobnì.
+\:Pøípad~$g(uv)=0$ a~$g(vu)>0$ vyøe¹íme symetricky.
 
-\:Pokud~$g(e) > 0$ a~$g(\overleftarrow{e}) > 0$, pak odeèteme od toku~$g$ cirkulaci po cyklu tvoøeném hranami~$e$ a $\overleftarrow{e}$:
-       \itemize\ibull
-       \:$\delta := \min (g(e),g(\overleftarrow{e}))$,
-       \:$g'(e) := g(e) - \delta$,
-       \:$g'(\overleftarrow{e}) := g(\overleftarrow{e}) - \delta$.     
+\:V~ostatních pøípadech je $g(uv)>0$ i $g(vu)>0$. Tehdy odeèteme od~toku~$g$ cirkulaci po cyklu $uvu$:
+       \itemize\irtri
+       \:$\delta := \min (g(uv),g(vu))$,
+       \:$g'(uv) := g(uv) - \delta$,
+       \:$g'(vu) := g(vu) - \delta$.
        \endlist
-
-       Tok $g'$ nyní spadá pod nìkterý z~pøedchozích pøípadù, které u¾ umíme vyøe¹it.
+  Tím jsme velikost toku~$g$ nezmìnili a alespoò jednu z~hodnot $g(uv)$ a $g(vu)$
+  jsme vynulovali, tak¾e mù¾eme pou¾ít nìkterý z~pøedchozích pøípadù.
        
 \endlist
 
-\>{\it 2. $f'$ je tok}
-
-\numlist{\ndotted}
-
-\:Nejdøíve ovìøme první podmínku: $\forall e \in E: 0 \leq f(e) \leq c(e)$. Vezmìme libovolnou hranu~$e \in E$. Podle toho, co teèe po~hranách~$e$ a~$\overleftarrow{e}$ v~toku~$g$, jsme rozdìlili konstrukci toku na~tøi pøípady:
-
-       \numlist{\ndotted}      
-       
-       \:Pokud po~hranách~$e$ a~$\overleftarrow{e}$ netekl ¾ádný tok~$g$, pak jsme nastavili $f'(e) := f(e)$ a~$f'(\overleftarrow{e}) := f(\overleftarrow{e})$. Tedy pokud~$f$ dodr¾oval kapacity, tak pro~$f'$ musí platit to samé.
-
-
-       \:Pokud po~hranì~$e$ tekl tok~$g$ nenulový a~po opaèné nulový, tak jsme zvolili: $f'(e) := f(e) + g(e) - \varepsilon$. Víme, ¾e jsme si~$\varepsilon$ vybrali tak, ¾e $\varepsilon \leq g(e)$. Proto $f'(e) \geq 0$.
-
-       Teï ovìøme, ¾e $f'(e) \leq c(e)$. V~pøípadì, ¾e $\varepsilon = g(e)$, tak $f'(e) = f(e) \leq c(e)$. V~opaèném pøípadì platí, ¾e $\varepsilon = f(\overleftarrow{e})$. Pak ov¹em
-       $$f'(e) = f(e) + g(e) - f(\overleftarrow{e}) \leq $$
-       $$\leq f(e) + \left[ c(e) - f(e) + f(\overleftarrow{e}) \right] - f(\overleftarrow{e}) = c(e).$$
-       Vyu¾ili jsme, ¾e~$g$ je tok v~síti rezerv, tedy $g(e) \leq  c(e) - f(e) + f(\overleftarrow{e})$.
-
-       Pro tok $f'(\overleftarrow{e})$ platí, ¾e $\varepsilon \leq f(\overleftarrow{e})$. Proto $f'(\overleftarrow{e}) = f(\overleftarrow{e}) - \varepsilon \geq 0$. Zároveò $f'(\overleftarrow{e}) \leq f(\overleftarrow{e}) \leq c(\overleftarrow{e})$.
-
-       Tím jsme dokázali, ¾e~$f'(e)$ i~$f'(\overleftarrow{e})$ dodr¾ují kapacity.
-
-       \:V posledním pøípadì tekl po~obou hranách kladný tok~$g$. Men¹í tok z~$g(e)$ a~$g(\overleftarrow{e})$ jsme vynulovali a~od vìt¹ího odeèetli ten men¹í. Tok~$g'(e)$ a~$g'(\overleftarrow{e})$ tedy zùstal korektní a~tok~$f'$ u¾ konstruujeme podle pøedchozího pøípadu.
-
-       \endlist
-
-\:Teï musíme je¹tì dokázat, ¾e nový tok neporu¹uje Kirchhoffovy zákony: $$\forall v~\in V \setminus \{z,s\}: f'^\Delta(v)=0.$$
-       % neboli $$\forall v~\in V \setminus \{z,s\}: \sum_{u: uv \in E}{f'(uv)}=\sum_{u: vu \in E}{f'(vu)}.$$
-
-       Vezmìme si~libovolnou hranu~$e = uv \in E$. Uvìdomme si, ¾e pøi~pøechodu z~$f(e)$ na~$f'(e)$ a~z~$f(\overleftarrow{e})$ na~$f'(\overleftarrow{e})$ bylo:
-       \itemize\idot
-       \:$f^\Delta(u)$ sní¾eno o~$g(e)$
-       \:$f^\Delta(v)$ zvý¹eno o~$g(e)$.
+\>{\I Funkce~$f'$ je tok:}
+Nejprve si v¹imneme, ¾e na¹e konstrukce nikdy nevytváøí záporná èísla, ani èísla
+pøekraèující kapacity (ovìøte si v~jednotlivých pøípadech a vyu¾ijte toho, ¾e funkce~$g$
+je omezena kapacitami v~síti rezerv, èili rezervami v~pùvodní síti).
+
+Zbývá ovìøit Kirchhoffùv zákon. Doká¾eme, ¾e seètením tokù seèteme i jejich pøebytky,
+tedy ¾e pro v¹echny vrcholu~$v$ je $f'^\Delta(v) = f^\Delta(v) + g^\Delta(v)$.
+Pokud tedy zákon platil pro $f$ i~$g$, musí platit i pro~$f'$.
+
+Uvedenou rovnost ovìøíme takto: Víme, ¾e k~pøebytku vrcholu~$v$ ka¾dá dvojice hran
+$uv$ a $vu$ pøispívá hodnotou $\delta = f(uv) - f(vu)$. Nahlédneme, ¾e tato hodnota se zvý¹í
+o~$g(uv) - g(vu)$, co¾ je pøesnì pøíspìvek uvedené dvojice hran k~pøebytku~$g^\Delta(v)$:
+
+       \itemize\irtri
+       \:V~prvním pøípadì na¹í konstrukce se $\delta$ nemìní a $g(uv) = g(vu) = 0$.
+       \:V~druhém pøípadì se $\delta$ zvìt¹í o~$g(uv) - \varepsilon + \varepsilon = g(uv)$,
+         pøièem¾ $g(vu)=0$.
+       \:Tøetí pøípad symetricky.
+       \:Ve~ètvrtém pøípadì upravíme~$g$ tak, ¾e se nezmìní $g(uv)-g(vu)$ a pokraèujeme
+         nìkterým z~pøedchozích pøípadù.
        \endlist
-       Seèteme-li úpravy na v¹ech hranách, dostaneme: $$f'^\Delta(v) = f^\Delta(v) + \sum_{u:uv \in E} g(uv) - \sum_{u:vu \in E} g(vu) =$$ $$= f^\Delta(v) + g^+(v) - g^-(v) = f^\Delta(v) + g^\Delta(v).$$
-
-       Jeliko¾~$f$ byl tok, tak $f^\Delta(v) = 0$ a jeliko¾~$g$ byl tok, tak $g^\Delta(v) = 0$. Proto $f'^\Delta(v) = f^\Delta(v) + g^\Delta(v) = 0$.
-       
-\endlist
 
 Tím jsme dokázali, ¾e~$f'$ je tok v~síti~$S$.
 
-\>{\it 3. $\vert f' \vert = \vert f \vert + \vert g \vert$}
-
-Pou¾ijme vztah pro souèet pøebytkù z pøedchozího kroku:
+\>{\I Velikost toku~$f'$:}
+Pou¾ijme právì dokázaný vztah pro souèet pøebytkù:
 $$\vert f' \vert = f'^\Delta(s) = f^\Delta(s) + g^\Delta(s) = \vert f \vert + \vert g \vert.$$
-\qed
-
+\qeditem
 
-Pro algoritmus budeme potøebovat vybírat kvalitní toky~$g$ v~síti rezerv. Pokud se~nám to bude daøit, bude se~tok~$f'$ rychle zvìt¹ovat, a¾ bychom mohli dojít k~maximálnímu toku. Nejlépe by se~nám hodily co nejvìt¹í toky v~síti rezerv. Kdybychom si~dali za cíl najít v¾dy maximální tok v~síti rezerv, výsledek by byl sice krásný (dostali bychom tak rovnou i~maximální tok v~pùvodní síti), ale problém hledání maximálního toku bychom pouze pøenesli na~jinou sí». Na¹e po¾adavky na~tento tok budou tedy takové, aby byl dostateènì velký, ale abychom bìhem jeho hledání nestrávili moc èasu. Podívejme se, jak se~s~tímto problémem vyrovná {\I Dinicùv algoritmus}. Nejdøíve si~ale zadefinujme nìkolik pojmù.
+\h{Dinicùv algoritmus}
 
-\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)$.
+Dinicùv algoritmus bude postupnì hledat nìjaké toky~$g$ 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
+trávit pøíli¹ mnoho èasu. Vhodným kompromisem jsou blokující toky:
 
-\s{Definice:} Sí» je {\I vrstevnatá (proèi¹tìná)}, kdy¾ v¹echny vrcholy a~hrany le¾í na~nejkrat¹ích cestách ze~$z$ do~$s$.
+\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}).
 
-Dinicùv algoritmus zaèíná s~nulovým tokem. Potom v¾dy podle toku~$f$ sestrojí sí» rezerv a~v~ní vyma¾e hrany s~nulovou rezervou. Pokud v~této promazané síti rezerv neexistuje cesta ze~zdroje do~stoku, tak skonèí a~prohlásí tok~$f$ za maximální. Jinak proèistí sí» rezerv tak, aby se~z ní stala vrstevnatá sí» (rozdìlí vrcholy do~vrstev podle vzdálenosti od zdroje a~odstraní pøebyteèné hrany). Ve~vrstevnaté síti najde blokující tok, pomocí nìho¾ zlep¹í tok~$f$. Pak opìt pokraèuje sestrojením sítì rezerv na~tomto vylep¹eném toku~$f$ atd.
+\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.)
 
 \figure{dinic-cistasit.eps}{Proèi¹tìná sí» rozdìlená do~vrstev}{0.4\hsize}
 
-\s{Algoritmus (Dinicùv)}
+\s{Dinicùv algoritmus:}
 
 \algo
-\:$f \leftarrow$ nulový tok.
-\:Sestrojíme sí» rezerv~$R$ a~sma¾eme $e: r(e) = 0$.
-\:$l \leftarrow$ délka nejkrat¹í cesty ze~$z$ do~$s$ v~$R$.
-\:Pokud $l = \infty$, zastavíme se~a vrátíme~$f$.
-\:Proèistíme sí» $R \rightarrow$ sí»~$C$.
-\:$g \leftarrow$ blokující tok v~$C$.
-\:Zlep¹íme tok~$f$ pomocí~$g$.
-\:GOTO 2.
+\:$f \leftarrow \hbox{nulový tok.}$
+\:Opakujeme:
+\::Sestrojíme sí» rezerv~$R$ a~sma¾eme hrany s~nulovou rezervou.
+\::$\ell \leftarrow$ délka nejkrat¹í cesty ze~$z$ do~$s$ v~$R$.
+\::Pokud $l = \infty$, zastavíme se~a vrátíme~$f$.
+\::Proèistíme sí»~$R$.
+\::$g \leftarrow \hbox{blokující tok v~$R$.}$
+\::Zlep¹íme tok~$f$ pomocí~$g$.
 \endalgo
 
-\s{Pozorování:} Pokud se~algoritmus zastaví, vydá maximální tok.
-
-\proof
-Víme, ¾e~$f$ je stále korektní tok (jediné, jak ho mìníme je pøièítání toku~$g$, co¾ je, jak jsme si~dokázali, \uv{ne¹kodná operace}). Jakmile neexistuje cesta ze~$z$ do~$s$ v~$R$, tak je $f$ maximální tok, nebo» v~tuto dobu by se~zastavil (a vydal maximální tok) i~Fordùv-Fulkersonùv algoritmus, který je korektní.
-\qed
-
-A teï je¹tì musíme ujasnit, jak budeme èistit sí» rezerv a~vybírat blokující tok~$g$.
-
-\s{Algoritmus proèi¹tìní sítì rezerv}
+\s{Èi¹tìní sítì} podrobnìji:
 
 \algo
 \:Rozdìlíme vrcholy do~vrstev podle vzdálenosti od~$z$.
-\:Odstraníme vrstvy za~$s$ (tedy vrcholy, které jsou od~$z$ vzdálenìj¹í ne¾~$s$), hrany do~minulý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~tím nesní¾il výstupní stupeò vrcholu~$u$ na~nulu ($\deg^{out}(u) = 0$). Pokud sní¾il, tak ho zaøadíme do~fronty.)
+\: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.)
 \endalgo
 
 \figure{dinic-neprocistenasit.eps}{Neproèi¹tìná sí». Obsahuje zpìtné hrany, hrany uvnitø vrstvy a~slepé ulièky.}{0.45\hsize}
 
-Hledání blokujícího toku zaèneme s~tokem nulovým. Pak vezmeme v¾dy orientovanou cestu ze~zdroje do~stoku v~síti~$C$. V~této cestì najdeme hranu s~nejni¾¹í hodnotou výrazu $r(e) - g(e)$ (neboli $c(e) - f(e)$ v~pùvodní síti). Tuto hodnotu oznaèíme~$\varepsilon$. Pak ke~ v¹em hranám na~této cestì pøièteme~$\varepsilon$. Pokud tok~$g$ na~nìjaké hranì dosáhne kapacity hrany, co¾ je zde~$r(e)$, tak hranu vyma¾eme. Následnì sí» doèistíme, aby splòovala podmínky vrstevnaté sítì. A~pokud je¹tì existuje nìjaká orientovaná cesta ze~zdroje do~stoku, tak opìt pokraèujeme s~touto cestou.
+\s{Hledání blokujícího toku podrobnìji:}
+Zaèneme s~nulovým tokem~$g$ a budeme ho postupnì zlep¹ovat. Poka¾dé najdeme nìjakou
+orientovanou cestu ze~zdroje do stoku -- to se ve~vrstevnaté síti dìlá snadno,
+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í.%
+\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.}
 
-\s{Algoritmus hledání blokujícího toku}
+Hledání blokujícího toku tedy mù¾eme zapsat takto:
 
 \algo
 \:$g \leftarrow$ nulový tok.
-\:Dokud existuje orientovaná cesta~$P$ ze~$z$ do~$s$ v~$C$, opakuj:
-\::$\varepsilon \leftarrow \min_{e \in P} (r(e) - g(e))$.
-\::Pro~$\forall e \in P: g(e) \leftarrow g(e) + \varepsilon$.
-\:::Pokud $g(e) = r(e)$, sma¾eme~$e$ z~$C$.
-\::Doèistíme sí» zase pomocí fronty.
+\:Dokud v~$R$ existuje orientovaná cesta~$P$ ze~$z$ do~$s$, opakujeme:
+\::$\varepsilon \leftarrow \min_{e \in P} \left(r(e) - g(e)\right)$.
+\::Pro v¹echny $e \in P: g(e) \leftarrow g(e) + \varepsilon$.
+\::Pokud $g(e) = r(e)$, sma¾eme~$e$ z~$R$.
+\::Doèistíme sí» pomocí fronty.
 \endalgo
 
-\s{Èasová slo¾itost} Rozeberme si~jednotlivé kroky algoritmu.
-
-\numlist{\ndotted}
-\:Inicializace toku~$f$ \dots $\O(m)$.
-\:Sestrojení sítì rezerv a~smazání hran s~nulovou rezervou \dots $\O(m + n)$.
-\:Najití nejkrat¹í cesty (prohledáváním do~¹íøky) \dots $\O(m + n)$.
-\:Zkontrolování délky nejkrat¹í cesty \dots $\O(1)$.
-\:Proèi¹tìní sítì \dots $\O(m + n)$.
-       \numlist{\ndotted}
-       \:Rozdìlení vrcholù do~vrstev -- provedlo ji¾ prohledávání do~¹íøky \dots $\O(1)$.
-       \:Odstranìní nìkterých hran \dots $\O(m + n)$.
-       \:Odstranìní \uv{slepých ulièek} pomocí fronty -- ka¾dou hranu odstraníme nejvý¹e jedenkrát, ka¾dý vrchol se~dostane do~fronty nejvý¹e jedenkrát \dots $\O(m + n)$.
-       \endlist
-\:Najití blokujícího toku~$g$ \dots $\O(m \cdot n)$.
-       \numlist{\ndotted}
-       \:Inicializace toku~$g$ \dots $\O(m)$.
-       \:Najití orientované cesty v~proèi¹tìné síti rezerv (staèí vzít libovolnou cestu ze~zdroje, nebo» ka¾dá z~nich v~této síti vede do~stoku) \dots $\O(n)$.
-       \:Výbìr minima z~výrazu $r(e) - g(e)$ pøes v¹echny hrany cesty -- ta mù¾e být dlouhá nejvý¹e~$n$ \dots $\O(n)$.
-       \:Pøepoèítání v¹ech hran cesty \dots $\O(n)$.
-       \:Smazání hran cesty, jejich¾ tok~$g(e)$ se~zvý¹il na~hodnotu~$r(e)$ \dots $\O(n)$.
-       \:Doèi¹»ování vyøe¹me zvlá¹».
-       \endlist
-       
-       Vnitøní cyklus (kroky 2 a¾ 6) provedeme nejvý¹e~$m$ krát, nebo» pøi~ka¾dém prùchodu vyma¾eme alespoò jednu hranu (tak jsme si~volili~$\varepsilon$).
-       
-       Èi¹tìní bìhem celého hledání blokujícího toku~$g$ v~proèi¹tìné síti rezerv trvá dohromady $\O(m + n)$, nebo» ka¾dou hranu a~vrchol sma¾eme nejvý¹e jedenkrát.
-       
-       Najití blokujícího toku bude tedy trvat $\O(m \cdot n + (m + n)) = \O(m \cdot n)$.
-       
-\:Zlep¹ení toku~$f$ pomocí toku~$g$ \dots $\O(m)$.
-\:Skok na~2. krok \dots $\O(1)$.
-\endlist
+\h{Analýza Dinicova algoritmu}
 
-Zbývá nám jen urèit, kolikrát projdeme vnìj¹ím cyklem (fází). Doká¾eme si~lemma, ¾e hodnota~$l$ vzroste mezi prùchody vnìj¹ím cyklem (fázemi) alespoò o~1. Z~toho plyne, ¾e vnìj¹ím cyklem mù¾eme projít nejvý¹e $n$-krát, nebo» cesta v síti na~$n$ vrcholech mù¾e být dlouhá nejvý¹e $n$.
+\s{Lemma (o~korektnosti):} Pokud se~algoritmus zastaví, vydá maximální tok.
 
-Uvìdomme si, ¾e uvnitø vnìj¹ího cyklu pøevládá èlen $\O(m \cdot n)$, tak¾e celková èasová slo¾itost bude $\O(n^2 \cdot m)$.
+\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,
+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)$.
 
-\s{Lemma:} Hodnota~$l$ (délka nejkrat¹í cesty ze~$z$ do~$s$ v~proèi¹tìné síti) vzroste mezi fázemi alespoò o~1.
+\s{Lemma (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
+i koneèné zlep¹ování toku trvají $\O(m)$.
+
+Èi¹tìní sítì (i se v¹emi doèi¹»ováními bìhem hledání blokujícího toku) pracuje
+takté¾ v~$\O(m)$: Smazání hrany trvá konstantní èas, smazání vrcholu
+po smazání v¹ech incidentních hran takté¾. Ka¾dý vrchol i hrana jsou smazány
+nejvý¹e jednou za~fázi.
+
+Hledání blokujícího toku projde nejvý¹e~$m$ cest, proto¾e poka¾dé ze~sítì
+vypadne alespoò jedna hrana a u¾ se tam nevrátí. Nalezení cesty metodou
+\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)$.
+\qed
 
-Podíváme se~na~prùbìh jednoho prùchodu vnìj¹ím cyklem. Délku aktuálnì nejkrat¹í cesty ze~zdroje do~stoku oznaème~$l$. V¹echny pùvodní cesty délky~$l$ se~bìhem prùchodu zaruèenì nasytí, proto¾e tok~$g$ 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, tak v~protismìru z~dosud nulové rezervy vyrobíme nenulovou. Rozmysleme si~tedy, jaké hrany mohou pøibývat.
+Zbývá nám jen urèit, kolik probìhne fází. K~tomu se bude hodit následující
+lemma:
 
-Hrany mohou pøibývat jen tehdy, kdy¾ jsme po~opaèné hranì nìco poslali. Ale my nìco posíláme po~hranách pouze z~vrstvy do~té následující. Hrany tedy pøibývají do~minulé vrstvy.
+\s{Lemma (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.
 
-Vznikem nových hran by proto mohly vzniknout nové cesty ze~zdroje do~stoku, které pou¾ívají zpìtné hrany. Jen¾e cesta ze~zdroje do~stoku, která pou¾ije zpìtnou hranu, musí alespoò jednou skoèit o~vrstvu zpìt a~nikdy nemù¾e skoèit o~více ne¾ jednu vrstvu dopøedu, a~proto je její délka alespoò $l+2$. Pokud cesta novou zpìtnou hranu nepou¾ije, má buï délku~$> l$, co¾ je v~poøádku, nebo má délku~$= l$, pak je zablokovaná.
+\proof
+Oznaème~$R_i$ sí» rezerv v~$i$-té fázi poté, co jsme z~ní smazali hrany
+s~nulovou rezervou, ale je¹tì pøed proèi¹tìním. Nech» nejkrat¹í cesta
+ze~$z$ do~$s$ v~$R_i$ je dlouhá~$\ell$.
+
+Jak se li¹í~$R_{i+1}$ od $R_i$? Pøedev¹ím z~ka¾dé cesty délky~$\ell$
+jsme smazali alespoò jednu hranu: ka¾dá taková cesta toti¾ byla blokujícím
+tokem zablokována, tak¾e alespoò jedné její hranì klesla rezerva na nulu, èím¾
+hrana vypadla. ®ádná z~pùvodních cest délky~$\ell$ tedy ji¾ v~$R_{i+1}$ neexistuje.
+
+To ov¹em nestaèí -- hrany mohou také pøibývat. Pokud nìjaká hrana mìla nulovou
+rezervu a bìhem fáze jsme zvý¹ili tok v~protismìru, rezerva se zvìt¹ila a hrana
+se v~$R_{i+1}$ najednou objevila. Uká¾eme ale, ¾e v¹echny cesty, které tím novì
+vznikly, jsou pøíli¹ dlouhé.
+
+Rozdìlme vrcholy grafu do~vrstev podle vzdáleností od zdroje v~$R_i$. Tok jsme
+zvy¹ovali pouze na hranách vedoucích o~jednu vrstvu dopøedu, tak¾e jediné
+hrany, které se mohou objevit, vedou o~jednu vrstvu zpìt. Ov¹em ka¾dá cesta
+ze~zdroje do~spotøebièe, která se alespoò jednou vrátí o~vrstvu zpìt, musí
+mít délku alespoò $\ell+2$ (proto¾e spotøebiè je v~$\ell$-té vrstvì a neexistují
+hrany, které by vedly o~více ne¾~1 vrstvu dopøedu).
 
 Tím je lemma dokázáno.
 \qed
@@ -220,10 +238,25 @@ T
 
 V¹echna dokázaná tvrzení mù¾eme shrnout do~následující vìty:
 
-\s{Vìta:} Dinicùv algoritmus najde maximální tok v~èase $\O(n^2\cdot m)$.
+\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.
+\qed
+
+\ss{Pár poznámek na závìr:}
 
-\s{Poznámka:} Algoritmus se~chová hezky na~sítích s~malými celoèíselnými kapacitami, ale kupodivu i~na~rùzných jiných sítích. Èasto se~pou¾ívá, nebo» se~chová efektivnì. A~je mnoho zpùsobù, jak ho je¹tì vylep¹ovat, èi odhadovat ni¾¹í slo¾itost na~speciálních sítích.
+Na rozdíl od~Fordova-Fulkersonova algoritmu jsme tentokrát nikde nevy¾adovali
+racionálnost kapacit -- odhad èasové slo¾itosti se o~kapacity vùbec neopírá.
+Nezávisle jsme tedy dokázali, ¾e i v~sítích s~iracionálními kapacitami v¾dy
+existuje alespoò jeden maximální tok.
 
-\s{Poznámka:} Algoritmus nevy¾aduje racionální kapacity! Dal¹í z~dùvodù, proè maximální tok existuje i~v~síti s~iracionálními kapacitami.
+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)$.
 
 \bye