]> mj.ucw.cz Git - ads2.git/blob - 3-dinic/3-dinic.tex
Voroneho diagramy: Oprava preklepu
[ads2.git] / 3-dinic / 3-dinic.tex
1 \input lecnotes.tex
2
3 \prednaska{3}{Dinicùv algoritmus}{}
4
5 V~minulé kapitole jsme ukázali Fordùv-Fulkersonùv algoritmus. Tento
6 algoritmus hledá maximální tok tak, ¾e zaène s~tokem nulovým a~postupnì ho
7 zvìt¹uje. Pro~ka¾dé zvìt¹ení potøebuje 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 zlep¹í.
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
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¹í Dinicùv 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 (To je vlastnì 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'$. Staèí si v¹imnout, ¾e za hranu~$uv$ na¹e konstrukce
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 tzv. blokující toky:
86
87 \s{Definice:} Tok je {\I blokující}, jestli¾e na~ka¾dé orientované
88 cestì ze~zdroje do~spotøebièe existuje alespoò jedna hrana, na ní¾ je
89 tok roven kapacitì.
90
91 \s{Definice:} Sí» je {\I vrstevnatá (proèi¹tìná)}, pokud v¹echny její vrcholy
92 a~hrany le¾í na~nejkrat¹ích cestách ze~$z$ do~$s$. (Abychom vyhovìli na¹í definici
93 sítì, musíme ke~ka¾dé takové hranì pøidat hranu opaènou s~nulovou kapacitou,
94 ale ty algoritmus nebude pou¾ívat a ani udr¾ovat v~pamìti.)
95
96 \s{Pozorování:} Pøedstavme si rozdìlení sítì na vrstvy, pøièem¾ v~$i$-té vrstvì le¾í
97 ty vrcholy, jejich¾ vzdálenost od zdroje je rovna~$i$. Z~$i$-té vrstvy mohou hrany vést
98 pouze do vrstev $0,1,\ldots,i,i+1$ -- tedy pouze uvnitø vrstvy, zpìt a o~právì jednu
99 vrstvu dopøedu. Po~proèi¹tìní zbudou pouze hrany do~následující vrstvy, proto se
100 proèi¹tìné síti také øíká {\I vrstevnatá.}
101
102 \figure{dinic-cistasit.eps}{Proèi¹tìná sí» rozdìlená do~vrstev}{0.4\hsize}
103
104 \algo{Dinic}
105 \algin Sí» $(V,E,c,z,s)$.
106 \:$f \leftarrow \hbox{nulový tok.}$
107 \:Opakujeme:
108 \::Sestrojíme sí» rezerv~$R$ a~sma¾eme hrany s~nulovou rezervou.
109 \::$\ell \leftarrow$ délka nejkrat¹í cesty ze~$z$ do~$s$ v~$R$.
110 \::Pokud $\ell = \infty$, zastavíme se~a vrátíme výsledek~$f$.
111 \::Proèistíme sí»~$R$.
112 \::$g \leftarrow \hbox{blokující tok v~$R$.}$
113 \::Zlep¹íme tok~$f$ pomocí~$g$.
114 \algout Maximální tok~$f$.
115 \endalgo
116
117 \proc{Èi¹tìníSítì}
118 \:Rozdìlíme vrcholy do~vrstev podle vzdálenosti od~$z$.
119 \:Odstraníme vrstvy za~$s$ (tedy vrcholy ve~vzdálenosti vìt¹í ne¾~$\ell$).
120 \:Odstraníme hrany do~pøedchozích vrstev a hrany uvnitø vrstev.
121 \:Odstraníme \uv{slepé ulièky}, tedy vrcholy s~$\deg^-(v) = 0$:
122 \::$F \leftarrow \{ v\ne s \mid \deg^+(v) = 0 \}.$ \cmt{fronta vrcholù ke~smazání}
123 \::Dokud $F\ne\emptyset$, opakujeme:
124 \:::Odebereme vrchol~$v$ z~$F$.
125 \:::Sma¾eme ze sítì vrchol~$v$ i v¹echny hrany, které do nìj vedou.
126 \:::Pokud nìjakému vrcholu klesl $\deg^+$ na~0, pøidáme ho do~$F$.
127 \endalgo
128
129 \figure{dinic-neprocistenasit.eps}{Neproèi¹tìná sí». Obsahuje zpìtné hrany, hrany uvnitø vrstvy a~slepé ulièky.}{0.45\hsize}
130
131 \s{Jak nalézt blokující tok:}
132 Zaèneme s~nulovým tokem~$g$ a budeme ho postupnì zlep¹ovat. Poka¾dé najdeme nìjakou
133 orientovanou cestu ze~zdroje do stoku -- to se ve~vrstevnaté síti dìlá snadno,
134 staèí vyrazit ze~zdroje a pak následovat libovolnou hranu. A¾ cestu najdeme,
135 tok~$g$ podél ní zlep¹íme, jak nejvíce to pùjde.
136
137 Pokud nyní tok na nìjakých hranách dosáhl jejich rezervy, tyto hrany sma¾eme. Tím jsme
138 mohli poru¹it proèi¹tìnost -- pakli¾e nìjaký vrchol pøi¹el o~poslední odchozí nebo poslední
139 pøíchozí hranu. Takových vrcholù se opìt pomocí fronty zbavíme a sí» doèistíme.
140 Pokraèujeme zlep¹ováním po dal¹ích cestách, dokud nìjaké existují.%
141 \foot{V¹imnìte si, ¾e algoritmus skonèí tím, ¾e sma¾e v¹echny vrcholy i hrany.
142 Také si v¹imnìte, ¾e vrcholy s~nulovým vstupním stupnìm jsme ani nemuseli
143 mazat, proto¾e se do nich algoritmus pøi hledání cest nikdy nedostane.}
144
145 Celé hledání blokujícího toku tedy vypadá následovnì:
146
147 \nobreak
148
149 \proc{BlokujícíTok}
150 \algin Vrstevnatá sí»~$R$ s~rezervami~$r$.
151 \:$g \leftarrow$ nulový tok.
152 \:Dokud v~$R$ existuje orientovaná cesta~$P$ ze~$z$ do~$s$, opakujeme:
153 \::$\varepsilon \leftarrow \min_{e \in P} \left(r(e) - g(e)\right)$.
154 \::Pro v¹echny $e \in P: g(e) \leftarrow g(e) + \varepsilon$.
155 \::Pokud pro kteroukoliv~$e$ nastalo $g(e) = r(e)$, sma¾eme~$e$ z~$R$.
156 \::Doèistíme sí» pomocí fronty.
157 \algout Blokující tok~$g$.
158 \endalgo
159
160 \h{Analýza Dinicova algoritmu}
161
162 \s{Lemma K (o~korektnosti):} Pokud se~algoritmus zastaví, vydá maximální tok.
163
164 \proof
165 Z~lemmatu o~zlep¹ování tokù plyne, ¾e~$f$ je stále korektní tok. Algoritmus
166 se zastaví tehdy, kdy¾ u¾ neexistuje cesta ze~$z$ do~$s$ po hranách s~kladnou
167 rezervou. Tehdy by se zastavil i Fordùv-Fulkersonùv algoritmus,
168 a ten, jak u¾ víme, je korektní.
169 \qed
170
171 Nyní rozebereme èasovou slo¾itost. Rozdìlíme si k~tomu úèelu algoritmus
172 na {\I fáze} -- tak budeme øíkat jednotlivým prùchodùm vnìj¹ím cyklem.
173 Také budeme pøedpokládat, ¾e sí» na vstupu neobsahuje izolované vrcholy, tak¾e
174 $\O(n+m) = \O(m)$.
175
176 \s{Lemma S (o~slo¾itosti fází):} Ka¾dá fáze trvá $\O(nm)$.
177
178 \proof
179 Sestrojení sítì rezerv, mazání hran s~nulovou rezervou, hledání nejkrat¹í cesty
180 i koneèné zlep¹ování toku trvají $\O(m)$.
181
182 Èi¹tìní sítì (i se v¹emi doèi¹»ováními bìhem hledání blokujícího toku) pracuje
183 takté¾ v~$\O(m)$: Smazání hrany trvá konstantní èas, smazání vrcholu
184 po smazání v¹ech incidentních hran takté¾. Ka¾dý vrchol i hrana jsou smazány
185 nejvý¹e jednou za~fázi.
186
187 Hledání blokujícího toku projde nejvý¹e~$m$ cest, proto¾e poka¾dé ze~sítì
188 vypadne alespoò jedna hrana (ta, na ní¾ se v~kroku~3 nabývalo minimum)
189 a u¾ se tam nevrátí. Nalezení cesty metodou \uv{rovnou za nosem} pøitom trvá
190 $\O(n)$. Celkem tedy $\O(nm)$ plus èi¹tìní, které jsme ale u¾ zapoèítali.
191
192 Celá jedna fáze proto dobìhne v~èase $\O(m + m + nm) = \O(nm)$.
193 \qed
194
195 Zbývá nám jen urèit, kolik probìhne fází. K~tomu se bude hodit následující
196 lemma:
197
198 \s{Lemma C (o~délce cest):} Délka $\ell$ nejkrat¹í cesty ze~$z$ do~$s$ vypoètená v~kroku~4
199 Dinicova algoritmu po ka¾dé fázi vzroste alespoò o~1.
200
201 \proof
202 Oznaème~$R_i$ sí» rezerv v~$i$-té fázi poté, co jsme z~ní smazali hrany
203 s~nulovou rezervou, ale je¹tì pøed proèi¹tìním. Nech» nejkrat¹í cesta
204 ze~$z$ do~$s$ v~$R_i$ je dlouhá~$\ell$.
205
206 Jak se li¹í~$R_{i+1}$ od $R_i$? Pøedev¹ím jsme z~ka¾dé cesty délky~$\ell$
207 smazali alespoò jednu hranu: ka¾dá taková cesta toti¾ byla blokujícím
208 tokem zablokována, tak¾e alespoò jedné její hranì klesla rezerva na nulu, èím¾
209 hrana vypadla. ®ádná z~pùvodních cest délky~$\ell$ tedy ji¾ v~$R_{i+1}$ neexistuje.
210
211 To ov¹em nestaèí -- hrany mohou také pøibývat. Pokud nìjaká hrana mìla nulovou
212 rezervu a bìhem fáze jsme zvý¹ili tok v~protismìru, rezerva se zvìt¹ila a hrana
213 se v~$R_{i+1}$ najednou objevila. Uká¾eme ale, ¾e v¹echny cesty, které tím novì
214 vznikly, jsou pøíli¹ dlouhé.
215
216 Rozdìlme vrcholy grafu do~vrstev podle vzdáleností od zdroje v~$R_i$. Tok jsme
217 zvy¹ovali pouze na hranách vedoucích o~jednu vrstvu dopøedu, tak¾e jediné
218 hrany, které se mohou objevit, vedou o~jednu vrstvu zpìt. Ov¹em ka¾dá cesta
219 ze~zdroje do~spotøebièe, která se alespoò jednou vrátí o~vrstvu zpìt, musí
220 mít délku alespoò $\ell+2$ (proto¾e spotøebiè je v~$\ell$-té vrstvì a neexistují
221 hrany, které by vedly o~více ne¾~1 vrstvu dopøedu).
222
223 Tím je lemma dokázáno.
224 \qed
225
226 \figure{dinic-cestashranouzpet.eps}{Cesta u¾ívající novou zpìtnou hranu}{0.4\hsize}
227
228 \s{Vìta:} Dinicùv algoritmus najde maximální tok v~èase $\O(n^2m)$.
229
230 \proof
231 Jeliko¾ ka¾dá cesta obsahuje nejvý¹e~$n$ vrcholù, z~lemmatu~C plyne,
232 ¾e fází probìhne nejvý¹e~$n$. Ka¾dá fáze podle lemmatu~S trvá $\O(nm)$,
233 co¾ dává celkovou slo¾itost $\O(n^2m)$. Speciálnì se tedy algoritmus v¾dy zastaví, tak¾e podle
234 lemmatu~K vydá maximální tok.
235 \qed
236
237 \s{Poznámka:}
238 Na rozdíl od~Fordova-Fulkersonova algoritmu jsme tentokrát nikde nevy¾adovali
239 racionálnost kapacit -- odhad èasové slo¾itosti se o~kapacity vùbec neopírá.
240 Nezávisle jsme tedy dokázali, ¾e i v~sítích s~iracionálními kapacitami v¾dy
241 existuje alespoò jeden maximální tok.
242
243 V~sítích s~malými celoèíselnými kapacitami se navíc algoritmus chová daleko lépe,
244 ne¾ øíká ná¹ odhad. Snadno se dá dokázat, ¾e pro jednotkové kapacity dobìhne
245 v~èase $\O(mn)$ (stejnì jako Fordùv-Fulkersonùv). Uveïme bez dùkazu je¹tì
246 jeden silnìj¹í výsledek: v~síti vzniklé pøi hledání nejvìt¹ího párování
247 algoritmem z~minulé kapitoly Dinicùv algoritmus pracuje v~èase $\O(\sqrt n \cdot m)$.
248
249 \exercises
250
251 \ex{Doka¾te, ¾e pro jednotkové kapacity Dinicùv algoritmus dobìhne v~èase $\O(mn)$.}
252
253 \ex{Blokující tok lze také sestrojit pomocí prohledávání do~hloubky.
254 Poka¾dé, kdy¾ projdeme hranou, pøepoèítáme prùbì¾né minimum. Pokud najdeme
255 stok, vracíme se do~koøene a upravujeme tok na~hranách. Pokud narazíme na slepou ulièku,
256 vrátíme se o~krok zpìt a sma¾eme hranu, po~ní¾ jsme pøi¹li. Doplòte detaily.}
257
258 \endexercises
259
260 \bye