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