$$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$.
\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}
\: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}
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.
\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
\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
\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:}
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