]> mj.ucw.cz Git - ads2.git/commitdiff
Dinic: Korektury
authorMartin Mares <mj@ucw.cz>
Mon, 7 Nov 2011 19:15:01 +0000 (20:15 +0100)
committerMartin Mares <mj@ucw.cz>
Mon, 7 Nov 2011 19:15:01 +0000 (20:15 +0100)
3-dinic/3-dinic.tex

index 871d164ca1599c6135f3fdc99dec72e96eaf1065..f63926173164e8167851d9be33cd3df53f9c0b67 100644 (file)
@@ -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 (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 (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 (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 (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