]> mj.ucw.cz Git - ads2.git/blob - 3-dinic/3-dinic.tex
Prechod na nova makra
[ads2.git] / 3-dinic / 3-dinic.tex
1 \input lecnotes.tex
2
3 \prednaska{3}{Dinicùv algoritmus}{}
4
5 Na~minulé pøedná¹ce jsme si~ukázali Fordùv-Fulkersonùv algoritmus. Tento
6 algoritmus hledal maximální tok tak, ¾e zaèal s~tokem nulovým a~postupnì ho
7 zvìt¹oval. Pro~ka¾dé zvìt¹ení potøeboval v~síti najít {\I nenasycenou cestu,}
8 tedy takovou, na~ní¾ mají v¹echny hrany kladnou rezervu. Podél takové cesty
9 pak tok zvìt¹il.
10
11 Ukázali jsme, ¾e tato cesta existuje právì tehdy, kdy¾ tok je¹tì není
12 maximální. Také jsme dokázali, ¾e pro racionální kapacity je tento
13 algoritmus koneèný a v¾dy najde maximální tok. V~obecném pøípadì to
14 ov¹em mù¾e trvat velice dlouho.
15
16 Nyní uká¾eme trochu slo¾itìj¹í, ale výraznì rychlej¹í algoritmus zalo¾ený
17 na my¹lence nezlep¹ovat toky pomocí cest, ale rovnou pomocí tokù~\dots
18
19 \h{Sí» rezerv a zlep¹ující toky}
20
21 \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)$,
22 kde~$r(e)$ je rezerva hrany~$e$ pøi toku~$f$.
23
24 Je dùle¾ité si~uvìdomit, ¾e sí» rezerv konstruujeme pro konkrétní tok v~pùvodní síti.
25 Od pùvodní sítì se li¹í pouze tím, ¾e kapacity hran jsme nahradili jejich rezervami.
26 Pøipomeòme je¹tì, ¾e rezervu hrany~$uv$ jsme definovali vztahem
27 $$r(uv) = c(uv) - f(uv) + f(vu).$$
28 Nyní uká¾eme, jak tok zlep¹it pomocí toku v~pøíslu¹né síti rezerv:
29
30 \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)$
31 lze v~èase $\O(m)$ nalézt tok~$f'$ v~síti~$S$ takový, ¾e
32 $\vert f' \vert = \vert f \vert + \vert g \vert$.
33
34 \proof
35 Nejdøív uká¾eme, jak tok~$f'$ sestrojit. Poté doká¾eme, ¾e konstrukce opravdu
36 dává korektní tok. Nakonec nahlédneme, ¾e jeho velikost je taková, jakou
37 lemma slibuje.
38
39 {\I Zjednodu¹ení toku~$g$:} Abychom si usnadnili práci, upravíme nejprve tok~$g$ tak,
40 aby pro ka¾dou dvojici hran $uv$ a~$vu$ byl tok~$g$ nenulový nejvý¹e na jedné z~nich.
41 Kdyby toti¾ jak $g(uv)$, tak $g(vu)$ byly kladné, mù¾eme od obou hodnot odeèíst
42 tu men¹í z~nich. Tím jsme nezmìnili pøebytky vrcholù, tím pádem ani velikost toku,
43 a~tok po jedné z~hran jsme vynulovali.
44
45 {\I Konstrukce~$f'$:} Pro ka¾dou dvojici hran $uv$ a~$vu$ takovou, ¾e $g(vu)=0$,
46 definujeme funkci~$f'$ následovnì:
47 $$\eqalign{
48         \delta &:= \min(f(vu), g(uv)) \cr
49         f'(vu) &:= f(vu) - \delta \cr
50         f'(uv) &:= f(uv) + g(uv) - \delta \cr
51 }$$
52 (Jinými slovy toté¾ jako pøi zlep¹ování toku ve~Fordovì-Fulkersonovì algoritmu.)
53
54 {\I Proè je to tok:} Funkce~$f'$ jistì není na ¾ádné hranì záporná. Kapacity
55 také nepøekroèí: na hranì~$vu$ tok pouze sni¾ujeme, na hranì~$uv$ ho zvý¹íme jen
56 tehdy, kdy¾ $\delta < g(uv)$. Tehdy musí být $\delta = f(vu)$. Vyu¾ijeme toho, ¾e
57 $g$ je tok v~síti rezerv, tak¾e $g(uv) \le r(uv) = c(uv) - f(uv) + f(vu)$.
58 Proto $f'(uv) = f(uv) + g(uv) - \delta \le f(uv) + c(uv) - f(uv) + f(vu) - f(vu)
59 = c(uv)$.
60
61 Je¹tì ovìøíme, ¾e $f'$~splòuje Kirchhoffùv zákon. Uká¾eme, ¾e pro ka¾dý vrchol~$v$
62 platí $f'^\Delta(v) = f^\Delta(v) + g^\Delta(v)$, tak¾e pokud zákon platil pro $f$
63 i~$g$, musí platit i pro~$f'$. V¹imneme si, ¾e za hranu~$uv$ na¹e konstrukce zvý¹í
64 zvý¹í $f^\Delta(u)$ o~$-g(uv)$ a~$f^\Delta(v)$ o~$g(uv)$. To je pøesnì tolik, èím
65 tato hrana pøispívá k~$g^\Delta(u)$ a~$g^\Delta(v)$. Pro hranu~$vu$, po které
66 neteklo nic, platí triviálnì toté¾.
67
68 {\I Velikost toku:} Staèí vyu¾ít toho, ¾e pøebytky se seèetly, abychom získali:
69 $$\vert f' \vert = f'^\Delta(s) = f^\Delta(s) + g^\Delta(s) = \vert f \vert + \vert g \vert.$$
70
71 {\I Èasová slo¾itost:} Jak zjednodu¹ení toku~$g$, tak výpoèet toku~$f'$ trvají
72 $\O(1)$ pro ka¾dou hranu, celkovì tedy $\O(m)$.
73 \qed
74
75 V¹imnìte si, ¾e zlep¹ení po nenasycené cestì je speciálním pøípadem tohoto
76 postupu -- odpovídá toti¾ toku v~síti rezerv, který je konstantní na oné cestì
77 a v¹ude jinde nulový.
78
79 \h{Dinicùv algoritmus}
80
81 Dinicùv algoritmus bude postupnì hledat nìjaké pomocné toky v~síti rezerv, pùvodnì nulový
82 tok pomocí nich zlep¹ovat, a¾ se dostane k~maximálnímu toku. Poèet potøebných iterací
83 pøitom bude záviset na tom, jak \uv{kvalitní} pomocné toky se¾ene -- na jednu stranu bychom
84 chtìli, aby byly podobné maximálnímu toku, na druhou stranu jejich výpoètem nechceme
85 trávit pøíli¹ mnoho èasu. Vhodným kompromisem jsou blokující toky:
86
87 \s{Definice:} Tok~$f$ je {\I blokující}, jestli¾e pro~ka¾dou orientovanou
88 cestu~$P$ ze~$z$ do~$s$ existuje hrana~$e \in P$, pro ní¾ $f(e) = c(e)$.
89
90 \s{Definice:} Sí» je {\I vrstevnatá (proèi¹tìná)}, pokud v¹echny její vrcholy
91 a~hrany le¾í na~nejkrat¹ích cestách ze~$z$ do~$s$. (Abychom vyhovìli na¹í definici
92 sítì, musíme ke~ka¾dé takové hranì pøidat hranu opaènou s~nulovou kapacitou,
93 ale ty algoritmus nebude pou¾ívat a ani udr¾ovat v~pamìti.)
94
95 \s{Pozorování:} Proèi¹tìná sí» se skládá z~vrstev. V~$i$-té vrstvì le¾í ty vrcholy,
96 jeji¾ vzdálenost od zdroje je rovna~$i$. Z~$i$-té vrstvy vedou hrany pouze do vrstev
97 $0,1,\ldots,i,i+1$ -- tedy pouze uvnitø vrstvy, zpìt a o~právì jednu vrstvu dopøedu.
98 Proto se takové síti také øíká {\I vrstevnatá.}
99
100 \figure{dinic-cistasit.eps}{Proèi¹tìná sí» rozdìlená do~vrstev}{0.4\hsize}
101
102 \algo{Dinic}
103 \:$f \leftarrow \hbox{nulový tok.}$
104 \:Opakujeme:
105 \::Sestrojíme sí» rezerv~$R$ a~sma¾eme hrany s~nulovou rezervou.
106 \::$\ell \leftarrow$ délka nejkrat¹í cesty ze~$z$ do~$s$ v~$R$.
107 \::Pokud $l = \infty$, zastavíme se~a vrátíme~$f$.
108 \::Proèistíme sí»~$R$.
109 \::$g \leftarrow \hbox{blokující tok v~$R$.}$
110 \::Zlep¹íme tok~$f$ pomocí~$g$.
111 \endalgo
112
113 \proc{Èi¹tìníSítì}
114 \:Rozdìlíme vrcholy do~vrstev podle vzdálenosti od~$z$.
115 \:Odstraníme vrstvy za~$s$ (tedy vrcholy vzdálenìj¹í ne¾~$\ell$).
116 \:Odstraníme hrany do~pøedchozích vrstev a hrany uvnitø vrstev.
117 \:Odstraníme \uv{slepé ulièky}, tedy vrcholy s~$\deg^{out}(v) = 0$:
118 opakovanì pomocí fronty~$F$:
119 \::$F \leftarrow \{ v\ne s \mid \deg^{out}(v) = 0 \}.$
120 \::Dokud $F\ne\emptyset$, opakujeme:
121 \:::Vezmeme vrchol~$v$ z~$F$.
122 \:::Sma¾eme~$v$ i v¹echny hrany, které do nìj vedou.
123 \:::Pokud nìjakému vrcholu klesl $\deg^{out}$ na~0, pøidáme ho do~$F$.
124 \endalgo
125
126 \figure{dinic-neprocistenasit.eps}{Neproèi¹tìná sí». Obsahuje zpìtné hrany, hrany uvnitø vrstvy a~slepé ulièky.}{0.45\hsize}
127
128 \s{Hledání blokujícího toku podrobnìji:}
129 Zaèneme s~nulovým tokem~$g$ a budeme ho postupnì zlep¹ovat. Poka¾dé najdeme nìjakou
130 orientovanou cestu ze~zdroje do stoku -- to se ve~vrstevnaté síti dìlá snadno,
131 staèí vyrazit ze~zdroje a pak následovat libovolnou hranu. A¾ cestu najdeme,
132 tok~$g$ podél ní zlep¹íme, jak nejvíce to pùjde.
133
134 Pokud nyní tok na nìjakých hranách dosáhl jejich rezervy, tyto hrany sma¾eme. Tím jsme
135 mohli poru¹it proèi¹tìnost -- pakli¾e nìjaký vrchol pøi¹el o~poslední odchozí nebo poslední
136 pøíchozí hranu. Takových vrcholù se opìt pomocí fronty zbavíme a sí» doèistíme.
137 Pokraèujeme zlep¹ováním po dal¹ích cestách, dokud nìjaké existují.%
138 \foot{V¹imnìte si, ¾e algoritmus skonèí tím, ¾e sma¾e v¹echny vrcholy i hrany.
139 Také si v¹imnìte, ¾e vrcholy s~nulovým vstupním stupnìm jsme ani nemuseli
140 mazat, proto¾e se do nich algoritmus pøi hledání cest nikdy nedostane.}
141
142 Celé hledání blokujícího toku tedy vypadá následovnì:
143
144 \nobreak
145
146 \proc{BlokujícíTok}
147 \:$g \leftarrow$ nulový tok.
148 \:Dokud v~$R$ existuje orientovaná cesta~$P$ ze~$z$ do~$s$, opakujeme:
149 \::$\varepsilon \leftarrow \min_{e \in P} \left(r(e) - g(e)\right)$.
150 \::Pro v¹echny $e \in P: g(e) \leftarrow g(e) + \varepsilon$.
151 \::Pokud $g(e) = r(e)$, sma¾eme~$e$ z~$R$.
152 \::Doèistíme sí» pomocí fronty.
153 \endalgo
154
155 \h{Analýza Dinicova algoritmu}
156
157 \s{Lemma K (o~korektnosti):} Pokud se~algoritmus zastaví, vydá maximální tok.
158
159 \proof
160 Z~lemmatu o~zlep¹ování tokù plyne, ¾e~$f$ je stále korektní tok. Algoritmus
161 se zastaví tehdy, kdy¾ u¾ neexistuje cesta ze~$z$ do~$s$ po hranách s~kladnou
162 rezervou. Tehdy by se zastavil i Fordùv-Fulkersonùv algoritmus,
163 a ten, jak u¾ víme, je korektní.
164 \qed
165
166 Nyní rozebereme èasovou slo¾itost. Rozdìlíme si k~tomu úèelu algoritmus
167 na {\I fáze} -- tak budeme øíkat jednotlivým prùchodùm vnìj¹ím cyklem.
168 Také budeme pøedpokládat, ¾e graf na vstupu neobsahuje izolované vrcholy, tak¾e
169 $\O(n+m) = \O(m)$.
170
171 \s{Lemma S (o~slo¾itosti fází):} Ka¾dá fáze trvá $\O(nm)$.
172
173 \proof
174 Sestrojení sítì rezerv, mazání hran s~nulovou rezervou, hledání nejkrat¹í cesty
175 i koneèné zlep¹ování toku trvají $\O(m)$.
176
177 Èi¹tìní sítì (i se v¹emi doèi¹»ováními bìhem hledání blokujícího toku) pracuje
178 takté¾ v~$\O(m)$: Smazání hrany trvá konstantní èas, smazání vrcholu
179 po smazání v¹ech incidentních hran takté¾. Ka¾dý vrchol i hrana jsou smazány
180 nejvý¹e jednou za~fázi.
181
182 Hledání blokujícího toku projde nejvý¹e~$m$ cest, proto¾e poka¾dé ze~sítì
183 vypadne alespoò jedna hrana a u¾ se tam nevrátí. Nalezení cesty metodou
184 \uv{rovnou za nosem} pøitom trvá $\O(n)$. Celkem tedy $\O(nm)$ plus èi¹tìní,
185 které jsme ale u¾ zapoèítali.
186
187 Celá jedna fáze proto dobìhne v~èase $\O(m + m + nm) = \O(nm)$.
188 \qed
189
190 Zbývá nám jen urèit, kolik probìhne fází. K~tomu se bude hodit následující
191 lemma:
192
193 \s{Lemma C (o~délce cest):} Délka $\ell$ nejkrat¹í cesty ze~$z$ do~$s$ vypoètená v~kroku~4
194 Dinicova algoritmu po ka¾dé fázi vzroste alespoò o~1.
195
196 \proof
197 Oznaème~$R_i$ sí» rezerv v~$i$-té fázi poté, co jsme z~ní smazali hrany
198 s~nulovou rezervou, ale je¹tì pøed proèi¹tìním. Nech» nejkrat¹í cesta
199 ze~$z$ do~$s$ v~$R_i$ je dlouhá~$\ell$.
200
201 Jak se li¹í~$R_{i+1}$ od $R_i$? Pøedev¹ím z~ka¾dé cesty délky~$\ell$
202 jsme smazali alespoò jednu hranu: ka¾dá taková cesta toti¾ byla blokujícím
203 tokem zablokována, tak¾e alespoò jedné její hranì klesla rezerva na nulu, èím¾
204 hrana vypadla. ®ádná z~pùvodních cest délky~$\ell$ tedy ji¾ v~$R_{i+1}$ neexistuje.
205
206 To ov¹em nestaèí -- hrany mohou také pøibývat. Pokud nìjaká hrana mìla nulovou
207 rezervu a bìhem fáze jsme zvý¹ili tok v~protismìru, rezerva se zvìt¹ila a hrana
208 se v~$R_{i+1}$ najednou objevila. Uká¾eme ale, ¾e v¹echny cesty, které tím novì
209 vznikly, jsou pøíli¹ dlouhé.
210
211 Rozdìlme vrcholy grafu do~vrstev podle vzdáleností od zdroje v~$R_i$. Tok jsme
212 zvy¹ovali pouze na hranách vedoucích o~jednu vrstvu dopøedu, tak¾e jediné
213 hrany, které se mohou objevit, vedou o~jednu vrstvu zpìt. Ov¹em ka¾dá cesta
214 ze~zdroje do~spotøebièe, která se alespoò jednou vrátí o~vrstvu zpìt, musí
215 mít délku alespoò $\ell+2$ (proto¾e spotøebiè je v~$\ell$-té vrstvì a neexistují
216 hrany, které by vedly o~více ne¾~1 vrstvu dopøedu).
217
218 Tím je lemma dokázáno.
219 \qed
220
221 \figure{dinic-cestashranouzpet.eps}{Cesta u¾ívající novou zpìtnou hranu}{0.4\hsize}
222
223 V¹echna dokázaná tvrzení mù¾eme shrnout do~následující vìty:
224
225 \s{Vìta:} Dinicùv algoritmus najde maximální tok v~èase $\O(n^2m)$.
226
227 \proof
228 Jeliko¾ ka¾dá cesta obsahuje nejvý¹e~$n$ vrcholù, z~lemmatu~C plyne,
229 ¾e fází probìhne nejvý¹e~$n$. Ka¾dá fáze podle lemmatu~S trvá $\O(nm)$,
230 co¾ dává celkovou slo¾itost $\O(n^2m)$. Speciálnì se tedy algoritmus v¾dy zastaví, tak¾e podle
231 lemmatu~K o~korektnosti vydá maximální tok.
232 \qed
233
234 \ss{Pár poznámek na závìr:}
235
236 Na rozdíl od~Fordova-Fulkersonova algoritmu jsme tentokrát nikde nevy¾adovali
237 racionálnost kapacit -- odhad èasové slo¾itosti se o~kapacity vùbec neopírá.
238 Nezávisle jsme tedy dokázali, ¾e i v~sítích s~iracionálními kapacitami v¾dy
239 existuje alespoò jeden maximální tok.
240
241 V~sítích s~malými celoèíselnými kapacitami se algoritmus chová daleko lépe,
242 ne¾ øíká ná¹ odhad. Snadno se dá dokázat, ¾e pro jednotkové kapacity dobìhne
243 v~èase $\O(nm)$ (stejnì jako Fordùv-Fulkersonùv). Uveïme bez dùkazu je¹tì
244 jeden silnìj¹í výsledek: v~síti vzniklé pøi hledání nejvìt¹ího párování
245 algoritmem z~minulé pøedná¹ky je slo¾itost Dinicova algoritmu omezena $\O(\sqrt
246 n \cdot m)$.
247
248 \bye