]> mj.ucw.cz Git - ga.git/blob - 14-floyd/14-floyd.tex
cfdb23bbca8630ac662f8dcee463d1f3441126d2
[ga.git] / 14-floyd / 14-floyd.tex
1 \input ../sgr.tex
2
3 \prednaska{14}{Transitivní uzávěry}{}
4
5 V~předchozí kapitole jsme se zabývali algoritmy pro hledání nejkratších
6 cest z~daného počátečního vrcholu. Nyní se zaměříme na případy, kdy nás
7 zajímají vzdálenosti, případně pouhá dosažitelnost, mezi všemi dvojicemi
8 vrcholů.
9
10 Výstupem takového algoritmu bude {\I matice vzdáleností} (případně
11 {\I matice dosažitelnosti}). Na ni se také mužeme dívat jako na {\I transitivní
12 uzávěr} zadaného grafu -- to je graf na~téže množině vrcholů, jehož hrany
13 odpovídají nejkratším cestám v~grafu původním.
14
15 Jeden způsob, jak transitivní uzávěr spočítat, se ihned nabízí: postupně
16 spustit Dijkstrův algoritmus pro všechny možné volby počátečního vrcholu,
17 případně se před tím ještě zbavit záporných hran pomocí potenciálů. Tak
18 dosáhneme časové složitosti $\O(mn + n^2\log n)$. To je pro řídké grafy
19 nejlepší známý výsledek -- jen $\O(\log n)$-krát pomalejší, než je velikost
20 výstupu.
21
22 Je-li graf hustý, pracují obvykle rychleji algoritmy založené na maticích, zejména
23 na jejich násobení. Několik algoritmů tohoto druhu si nyní předvedeme,
24 a to jak pro výpočet vzdáleností, tak pro dosažitelnost.
25
26 Graf na vstupu bude vždy zadán maticí délek hran -- to je matice $n\times n$,
27 jejíž řádky i sloupce jsou indexované vrcholy a na pozici $(i,j)$ se nachází
28 délka hrany $ij$; případné chybějící hrany doplníme s~délkou~$+\infty$.
29
30 \h{Floydův-Warshallův algoritmus}
31
32 Začněme algoritmem, který nezávisle na sobě objevili Floyd a Warshall.
33 Funguje pro libovolný orientovaný graf bez záporných cyklů.
34
35 Označme $D^k_{ij}$ délku nejkratší cesty z~vrcholu~$i$ do vrcholu~$j$ přes
36 vrcholy 1 až~$k$ (tím myslíme, že všechny vnitřní vrcholy cesty leží v~množině $\{1,\ldots,k\}$).
37 Jako obvykle položíme $D^k_{ij}=+\infty$, pokud žádná taková cesta neexistuje.
38 Pak platí:
39 $$\eqalign{
40 D^0_{ij} &= \hbox{délka hrany $ij$,} \cr
41 D^n_{ij} &= \hbox{hledaná vzdálenost z~$i$ do~$j$,} \cr
42 D^k_{ij} &= \min( D^{k-1}_{ij}, D^{k-1}_{ik} + D^{k-1}_{kj} ). \cr
43 }$$
44 První dvě rovnosti plynou přímo z~definice. Třetí rovnost dostaneme rozdělením
45 cest z~$i$ do~$j$ přes 1 až~$k$ na ty, které se vrcholu~$k$ vyhnou (a~jsou tedy
46 cestami přes 1 až~$k-1$), a ty, které ho použijí -- každou takovou můžeme složit
47 z~cesty z~$i$ do~$k$ a cesty z~$k$ do~$j$, obojí přes 1 až~$k-1$.
48
49 Zbývá vyřešit jednu maličkost: složením cesty z~$i$ do~$k$ s~cestou z~$k$ do~$j$
50 nemusí nutně vzniknout cesta, protože se nějaký vrchol může opakovat. V~grafech
51 bez záporných cyklů nicméně takový sled nemůže být kratší než nejkratší cesta,
52 takže tím falešné řešení nevyrobíme. (Přesněji: ze sledu $i\alpha v\beta k\gamma v\delta j$,
53 kde $v\not\in\beta,\gamma$, můžeme vypuštěním části $v\beta k\gamma v$ nezáporné
54 délky získat sled z~$i$ do~$j$ přes 1 až~$k-1$, jehož délka nemůže být menší
55 než~$D^{k-1}_{ij}$.)
56
57 Samotný algoritmus postupně počítá matice $D^0, D^1, \ldots, D^n$ podle uvedeného předpisu:
58
59 \algo
60 \:$D^0 \leftarrow \hbox{matice délek hran}$.
61 \:Pro $k=1,\ldots,n$:
62 \::Pro $i,j=1,\ldots,n$:
63 \:::$D^k_{ij} \leftarrow \min( D^{k-1}_{ij}, D^{k-1}_{ik} + D^{k-1}_{kj} )$.
64 \:$\hbox{Matice vzdáleností} \leftarrow D^n.$
65 \endalgo
66
67 Časová složitost tohoto algoritmu činí $\Theta(n^3)$. Kubickou prostorovou
68 složitost můžeme snadno snížit na~kvadratickou: Buď si uvědomíme, že v~každém
69 okamžiku potřebujeme jen aktuální matici~$D^k$ a předchozí~$D^{k-1}$. Anebo
70 nahlédneme, že můžeme $D^{k-1}$ na~$D^k$ přepisovat na místě. U~hodnot $D_{ik}$
71 a~$D_{kj}$ je totiž podle definice stará i nová hodnota stejná. Algoritmu tedy
72 stačí jediné pole velikosti $n\times n$, které na~počátku výpočtu obsahuje
73 vstup a na~konci výstup.
74
75 \h{Regulární výrazy}
76
77 Předchozí algoritmus lze zajímavě zobecnit, totiž tak, aby pro každou dvojici
78 vrcholů sestrojil vhodnou reprezentaci množiny všech sledů vedoucích mezi nimi.
79 Tato reprezentace bude velice podobná regulárním výrazům známým z~UNIXu
80 a z~teorie automatů. Budeme připouštět orientované multigrafy se smyčkami
81 a násobnými hranami.
82
83 \s{Definice:} {\I Svazek} je množina sledů, které mají společný počáteční
84 a koncový vrchol. {\I Typem} svazku nazveme uspořádanou dvojici těchto vrcholů.
85 Místo \uv{svazek typu $(u,v)$} budeme obvykle říkat prostě {\I $uv$-svazek.}
86
87 Triviálními případy svazků jsou prázdná množina~$\emptyset$, samotná hrana~$uv$ a pro
88 $u=v$ také sled~$\varepsilon_u$ nulové délky. Svazky můžeme kombinovat
89 těmito operacemi:
90
91 \itemize\ibull
92 \:$A\cup B$ -- {\I sjednocení} dvou svazků téhož typu,
93 \:$AB$ nebo $A\cdot B$ -- {\I zřetězení} $uv$-svazku~$A$ s~$vw$-svazkem~$B$: výsledkem je $uw$-svazek
94 obsahující všechna spojení sledu z~$A$ se sledem z~$B$,
95 \:$A^*$ -- {\I iterace} $uu$-svazku: výsledkem je $uu$-svazek
96 $\varepsilon \cup A \cup AA \cup AAA \cup \ldots$ (tedy všechna možná
97 spojení konečně mnoha sledů z~$A$).
98 \endlist
99
100 \>Ve~výrazu definujícím~$A^*$ jsme využili, že operace sjednocení a zřetězení
101 jsou asociativní, takže je nemusíme závorkovat. Navíc sjednocení má ve~výrazech
102 nižší prioritu než zřetězení.
103
104 \>Svazky budeme obvykle reprezentovat {\I sledovými výrazy,} což jsou
105 výrazy konečné délky sestávající z~triviálních svazků a výše uvedených
106 operací.
107
108 \s{Pozorování:} Sledy můžeme reprezentovat řetězci nad abecedou, jejíž
109 symboly jsou identifikátory hran. Sledové výrazy pak odpovídají regulárním
110 výrazům nad touto abecedou.
111
112 Ukážeme, jak pro všechny dvojice vrcholu $i,j$ sestrojit sledový výraz $R_{ij}$
113 popisující svazek všech sledů z~$i$ do~$j$. Podobně jako u~Floydova-Warshallova
114 algoritmu zavedeme $R^k_{ij}$ coby výraz popisující sledy z~$i$ do~$j$ přes 1 až~$k$
115 a nahlédneme, že platí:
116 $$\eqalign{
117 R^0_{ij} &= \cases{
118         \hbox{množina všech hran z~$i$ do~$j$}        & \hbox{pokud $i\ne j$} \cr
119         \varepsilon_i \cup \hbox{všechny smyčky v~$i$}        & \hbox{pokud $i=j$} \cr
120         }       \cr
121 R^n_{ij} &= \hbox{hledané $R_{ij}$}, \cr
122 R^k_{ij} &= R^{k-1}_{ij} \cup R^{k-1}_{ik}(R^{k-1}_{kk})^*R^{k-1}_{kj}. \cr
123 }$$
124 První dvě rovnosti opět plynou přímo z~definice (množinu všech hran zapíšeme
125 buď jako prázdnou nebo ji vytvoříme sjednocováním z~jednoprvkových množin). Třetí
126 rovnost vychází z~toho, že každý sled z~$i$ do~$j$ buď neobsahuje~$k$, nebo ho
127 můžeme rozdělit na~části mezi jednotlivými návštěvami vrcholu~$k$.
128
129 Algoritmus tedy bude postupně budovat matice $R^0, R^1, \ldots, R^n$ podle těchto
130 pravidel. Provedeme při tom $\Theta(n^3)$ operací, ovšem s~výrazy, jejichž délka
131 může být až řádově~$4^n$. Raději než jako řetězce je proto budeme ukládat v~podobě
132 acyklických orientovaných grafů: vrcholy budou operace, hrany je budou připojovat
133 k~operandům.
134
135 K~přímému použití se takový exponenciálně dlouhý výraz hodí málokdy, ale může
136 nám pomoci odpovídat na různé otázky týkající se sledů s~danými koncovými vrcholy.
137 Máme-li nějakou funkci~$f$ ohodnocující množiny sledů kódované sledovými
138 výrazy, stačí umět vyhodnotit:
139 \itemize\ibull
140 \:výsledek pro triviální výrazy $f(\emptyset)$, $f(\varepsilon)$ a $f(e)$ pro hranu~$e$,
141 \:hodnoty $f(\alpha\cup\beta)$, $f(\alpha\beta)$ a $f(\alpha^*)$, známe-li již $f(\alpha)$ a $f(\beta)$.
142 \endlist
143 \>Pro výpočet všech $f(R_{ij})$ nám pak stačí $\Theta(n^3)$ vyhodnocení funkce~$f$.
144
145 \s{Poznámka pro ctitele algebry:} Výše uvedená konstrukce není nic jiného, než popis
146 homomorfismu~$f$ z~algebry $({\cal S},\emptyset,\varepsilon_1,\ldots,\varepsilon_n,
147 e_1,\ldots,e_m,\cup,\cdot,{}^*)$ nad množinou~${\cal S}$ všech svazků do~nějaké
148 algebry $(X,{\bf 0},c_1,\ldots,c_n,h_1,\ldots,h_m,\oplus,\otimes,\circledast)$, kde~$X$ je množina
149 všech ohodnocení sledů, {\bf 0}, $c_1,\ldots,c_n$ a $h_1,\ldots,h_m$ jsou konstanty,
150 $\oplus$ a~$\otimes$ binární operace a $\circledast$ unární operace. Průběh výpočtu
151 upraveného algoritmu je pak homomorfním obrazem průběhu výpočtu původního algoritmu
152 pracujícího přímo se svazky.
153
154 \s{Příklady:}
155
156 \>{\I Nejkratší sled:}
157 $$\eqalign{
158 f(\emptyset)&=+\infty \cr
159 f(\varepsilon)&=0 \cr
160 f(e)&=\ell(e) \hbox{\quad (délka hrany~$e$)} \cr
161 f(\alpha\cup\beta) &= \min(f(\alpha),f(\beta)) \cr
162 f(\alpha\beta) &= f(\alpha) + f(\beta) \cr
163 f(\alpha^*) &= \cases{0 & \hbox{pro $f(\alpha)\ge 0$} \cr -\infty & \hbox{pro $f(\alpha)<0$} \cr} \cr
164 }$$
165 (Pokud předpokládáme, že v~grafu nejsou záporné cykly, je $f(\alpha^*)$ vždy nulové
166 a dostaneme přesně Floydův-Warshallův algoritmus.)
167
168 \>{\I Nejširší cesta} (hranám jsou přiřazeny šířky, šířka cesty je minimum z~šířek hran):
169 $$\eqalign{
170 f(\emptyset)&=0 \cr
171 f(\varepsilon)&=\infty \cr
172 f(e)&=w(e) \hbox{\quad (šířka hrany~$e$)} \cr
173 f(\alpha\cup\beta) &= \max(f(\alpha),f(\beta)) \cr
174 f(\alpha\beta) &= \min(f(\alpha),f(\beta)) \cr
175 f(\alpha^*) &= \infty \cr
176 }$$
177
178 \>{\I Převod konečného automatu na regulární výraz:} Vrcholy multigrafu budou odpovídat
179 stavům automatu, hrany možným přechodům mezi stavy. Každou hranu ohodnotíme symbolem
180 abecedy, po jehož přečtení automat přechod provede. Funkce~$f$ pak přiřadí $uv$-svazku~$\psi$
181 regulární výraz popisující množinu všech řetězců, po jejichž přečtení automat přejde
182 ze~stavu~$u$ do stavu~$v$ po přechodech z~množiny~$\psi$. Vyhodnocování funkce~$f$
183 odpovídá přímočarým operacím s~řetězci.
184
185 \h{Násobení matic}
186
187 Řešíme-li grafové problémy pomocí matic, nabízí se použít známé subkubické algoritmy
188 pro lineárně algebraické úlohy. Ty jsou obvykle založeny na efektivním násobení
189 matic -- dvě matice $n\times n$ můžeme vynásobit v~čase:
190
191 \itemize\ibull
192 \:$\O(n^3)$ podle definice,
193 \:$\O(n^{2.808})$ Strassenovým algoritmem~\cite{strassen:matmult},
194 \:$\O(n^{2.376})$ algoritmem Coppersmithe a Winograda~\cite{coppersmith:matmult},
195 \:$\O(n^{2.373})$ algoritmem Williamsové~\cite{williams:matmult}.
196 \endlist
197
198 Obecně přijímaná hypotéza říká, že pro každé $\omega>2$ existuje algoritmus
199 násobící matice se složitostí $\O(n^\omega)$. Jediný známý dolní odhad je přitom
200 $\Omega(n^2\log n)$ pro aritmetické obvody s~omezenou velikostí konstant~\cite{raz:mmlower}.
201 Blíže se o~tomto fascinujícím tématu můžete dočíst v~Szegedyho článku \cite{szegedy:matmult}.
202
203 Předpokládejme tedy, že umíme násobit matice v~čase $\O(n^\omega)$ pro nějaké $\omega < 3$.
204
205 Co se stane, když mocníme matici sousednosti~$A$ grafu? V~matici $A^k$ se na pozici
206 $i,j$ nachází počet sledů délky~$k$, které vedou z~vrcholu~$i$ do vrcholu~$j$.
207 (Snadný důkaz indukcí vynecháváme.) Pro libovolné $k\ge n-1$ jsou tedy v~$(A+E)^k$
208 (kde $E$ značí jednotkovou matici; doplnili jsme tedy do grafu smyčky) nenuly
209 přesně tam, kde z~$i$ do~$j$ vede cesta.
210
211 To nám dává jednoduchý algoritmus pro výpočet matice dosažitelnosti~$R$ ($R_{ij}$
212 je 1 nebo~0 podle toho, zda z~$i$ do~$j$ vede cesta). Do~matice~$A$ doplníme
213 na diagonálu jedničky a poté ji $\lceil \log_2 n\rceil$-krát umocníme na~druhou.
214 Abychom se vyhnuli velkým číslům, nahradíme po každém umocnění nenuly jedničkami.
215 Celkem tedy provedeme $\O(\log n)$ násobení matic, což trvá $\O(n^\omega\log n)$.
216
217 Na~tento postup se můžeme dívat i~obecněji:
218
219 \s{Definice:} {\I $(\oplus,\otimes)$-součin} matic~$A,B \in X^{n\times n}$,
220 kde $\oplus$ a~$\otimes$ jsou dvě asociativní binární operace na~množině~$X$,
221 je matice~$C$ taková, že
222 $$
223 C_{ij} = \bigoplus_{k=1}^n A_{ik}\otimes B_{kj}.
224 $$
225 Klasické násobení matic je tedy $(+,\cdot)$-součin.
226
227 \s{Pozorování:} Pokud $A$ a~$B$ jsou matice svazků ($A_{ij}$ a $B_{ij}$
228 jsou $ij$-svazky) a $C$ jejich $(\cup,\cdot)$-součin, pak $C_{ij}$ je
229 svazek všech sledů vzniklých spojením nějakého sledu z~$A$ začínajícího
230 v~$i$ a nějakého sledu z~$B$ končícího v~$j$.
231
232 Podobně jako v~předchozí sekci si tedy můžeme pořídit funkci~$f$ přiřazující
233 svazkům hodnoty z~nějaké množiny~$X$ a operace $\oplus$ a $\otimes$ na~$X$,
234 pro něž platí $f(\alpha\cup\beta) = f(\alpha) \oplus f(\beta)$ a $f(\alpha\beta)
235 = f(\alpha) \otimes f(\beta)$. Pak stačí vzít matici popisující ohodnocení
236 všech sledů délky 0 nebo~1 (to je obdoba matice sousednosti), a provést $\O(\log n)$
237 $(\oplus,\otimes)$-součinů k~tomu, abychom znali ohodnocení svazků sledů délky
238 právě~$k$ pro nějaké $k\ge n$.
239
240 S~$(\lor,\land)$-součiny a maticí sousednosti s~jedničkami na diagonále získáme
241 algoritmus pro výpočet dosažitelnosti. Každý součin přitom můžeme provést jako
242 obyčejné násobení matic následované přepsáním nenul na jedničky, takže celý
243 výpočet běží v~čase $\O(n^\omega\log n)$.
244
245 Podobně můžeme počítat i matici vzdáleností: začneme s~maticí délek hran doplněnou o~nuly na~diagonále
246 a použijeme $(\min,+)$-součiny. Tyto součiny ale bohužel neumíme převést na klasické násobení matic.
247 Přesto je známo několik algoritmů efektivnějších než $\Theta(n^3)$, byť pouze o~málo:
248 například Zwickův \cite{zwick:apsp} v~čase $\O(n^3\sqrt{\log\log n}/\log n)$
249 (založený na dekompozici a předpočítání malých bloků) nebo Chanův \cite{chan:apsp} v~$\O(n^3/\log n)$
250 (používající geometrické techniky). Abychom porazili Floydův-Warshallův algoritmus,
251 potřebovali bychom ovšem větší než logaritmické zrychlení, protože součinů potřebujeme
252 vypočítat logaritmicky mnoho.
253
254 Dodejme ještě, že pro grafy ohodnocené malými celými čísly je možné využít
255 celou řadu dalších triků. Zájemce o~tento druh algoritmů odkazujeme na Zwickův
256 článek~\cite{zwick:apspint}.
257
258 \h{Rozděl a panuj}
259
260 Předchozí převod je ovšem trochu marnotratný. Šikovným použitím metody Rozděl a panuj
261 můžeme časovou složitost ještě snížit. Postup předvedeme pro dosažitelnost: na vstupu
262 tedy dostaneme matici sousednosti~$A$, výstupem má být její transitivní uzávěr~$A^*$
263 (matice dosažitelnosti). Všechny součiny matic v~tomto oddílu budou typu $(\lor,\land)$.
264
265 Vrcholy grafu rozdělíme na dvě množiny $X$ a~$Y$ přibližně stejné velikosti,
266 bez újmy na obecnosti tak, aby matice~$A$ měla následující blokový tvar:
267 $$A = \pmatrix{ P & Q \cr R & S \cr },$$
268 kde podmatice~$P$ popisuje hrany z~$X$ do~$X$, podmatice~$Q$ hrany z~$X$ do~$Y$, atd.
269
270 \s{Věta:} Pokud matici~$A^*$ zapíšeme rovněž v~blokovém tvaru:
271 $$A^* = \pmatrix{ I & J \cr K & L \cr },$$
272 bude platit:
273 $$\eqalign{
274 I &= (P \lor QS^*R)^*, \cr
275 J &= IQS^*, \cr
276 K &= S^*RI, \cr
277 L &= S^* \lor S^*RIQS^*.
278 }$$
279
280 \proof
281 Jednotlivé rovnosti můžeme číst takto:
282 \def\nIJKL{\count0=`H\advance\count0 by\itemcount{\bf\char\count0:}}
283 \numlist\nIJKL
284 \:Sled z~$X$ do~$X$ vznikne opakováním částí, z~nichž každá je buďto
285 hrana uvnitř~$X$ nebo přechod po hraně z~$X$ do~$Y$ následovaný sledem
286 uvnitř~$Y$ a přechodem zpět do~$X$.
287 \:Sled z~$X$ do~$Y$ můžeme rozdělit v~místě, kdy naposledy přechází
288 po~hraně z~$X$ do~$Y$. První část přitom bude sled z~$X$ do~$X$,
289 druhá sled uvnitř~$Y$.
290 \:Se sledem z~$Y$ do~$X$ naložíme symetricky.
291 \:Sled z~$Y$ do~$Y$ vede buďto celý uvnitř~$Y$, nebo ho můžeme rozdělit
292 na~prvním přechodu z~$Y$ do~$X$ a posledním přechodu z~$X$ do~$Y$.
293 Část před prvním přechodem povede celá uvnitř~$Y$, část mezi přechody
294 bude tvořit sled z~$X$ do~$X$ a konečně část za~posledním přechodem zůstane
295 opět uvnitř~$Y$.
296 \qeditem
297 \endlist
298
299 \s{Algoritmus:}
300 Výpočet matice~$A^*$ provedeme podle předchozí věty. Spočítáme 2~tranzitivní uzávěry
301 matic poloviční velikosti rekurzivním voláním, dále pak $\O(1)$ $(\lor,\land)$-součinů
302 a $\O(1)$ součtů matic.
303
304 Časová složitost $t(n)$ tohoto algoritmu bude splňovat následující rekurenci:
305 $$t(1)=\Theta(1), \quad t(n) = 2t(n/2) + \Theta(1)\cdot\mu(n/2) + \Theta(n^2),$$
306 kde $\mu(k)$ značí čas potřebný na jeden $(\lor,\land)$-součin
307 matic $k\times k$. Jelikož jistě platí $\mu(n/2)=\Omega(n^2)$,
308 má tato rekurence podle kuchařkové věty řešení $t(n) = \mu(n)$.
309
310 Ukázali jsme tedy, že výpočet matice dosažitelnosti je nejvýše stejně
311 náročný jako $(\lor,\land)$-násobení matic -- můžeme ho proto provést
312 v~čase $\O(n^\omega)$. Dokonce existuje přímočarý převod v~opačném směru,
313 takže oba problémy jsou asymptoticky stejně těžké.
314
315 Podobně nalézt matici vzdáleností je stejně těžké jako $(\min,+)$-součin,
316 takže na to stačí čas $\O(n^3/\log n)$.
317
318 \h{Seidelův algoritmus}
319
320 Pro neorientované neohodnocené grafy můžeme dosáhnout ještě lepších
321 výsledků. Matici vzdáleností lze spočítat v~čase $\O(n^\omega\log n)$
322 Seidelovým algoritmem~\cite{seidel:unitlength}. Ten funguje následovně:
323
324 \s{Definice:} {\I Druhá mocnina grafu~$G$} je graf~$G^2$ na téže množině vrcholů,
325 v~němž jsou vrcholy~$i$ a~$j$ spojeny hranou právě tehdy, existuje-li v~$G$ sled
326 délky nejvýše~2 vedoucí z~$i$ do~$j$.
327
328 \s{Pozorování:} Matici sousednosti grafu~$G^2$ získáme z~matice sousednosti
329 grafu~$G$ jedním $(\lor,\land)$-součinem, tedy v~čase $\O(n^\omega)$.
330
331 Seidelův algoritmus bude postupovat rekurzivně: Sestrojí graf~$G^2$, rekurzí
332 spočítá jeho matici vzdáleností~$D'$ a z~ní pak rekonstruuje matici vzdáleností~$D$
333 zadaného grafu. Rekurze končí, pokud $G^2=G$ -- tehdy je každá komponenta
334 souvislosti zahuštěna na~úplný graf, takže matice vzdáleností je rovna matici sousednosti.
335
336 Zbývá ukázat, jak z~matice~$D'$ spočítat matici~$D$. Zvolme pevně~$i$ a zaměřme
337 se na funkce $d(v)=D_{iv}$ a $d'(v)=D'_{iv}$. Jistě platí $d'(v) = \lceil d(v)/2 \rceil$,
338 pročež $d(v)$ je buď rovno $2d'(v)$ nebo o~1 nižší. Naučíme se rozpoznat, jestli
339 $d(v)$ má být sudé nebo liché, a~z~toho vždy poznáme, jestli je potřeba jedničku odečíst.
340
341 Jak vypadá funkce~$d$ na sousedech vrcholu~$v\ne i$? Pro alespoň jednoho souseda~$u$ je
342 $d(u) = d(v)-1$ (to platí pro sousedy, kteří leží na některé z~nejkratších cest z~$v$ do~$i$).
343 Pro všechny ostatní sousedy je $d(u)=d(v)$ nebo $d(u)=d(v)+1$.
344
345 Pokud je $d(v)$ sudé, vyjde pro sousedy ležící na nejkratších cestách $d'(u)=d'(v)$
346 a pro ostatní sousedy $d'(u)\ge d'(v)$, takže průměr z~$d'(u)$ přes sousedy je
347 alespoň~$d'(v)$. Je-li naopak $d(v)$ liché, musí být pro sousedy na nejkratších cestách
348 $d'(u) < d(v)$ a pro všechny ostatní $d'(u) = d(v)$, takže průměr klesne pod~$d'(v)$.
349
350 Průměry přes sousedy přitom můžeme spočítat násobením matic: vynásobíme matici
351 vzdáleností~$D'$ maticí sousednosti grafu~$G$. Na pozici~$i,j$ se objeví součet
352 hodnot $D'_{ik}$ přes všechny sousedy~$k$ vrcholu~$j$. Ten stačí vydělit stupněm
353 vrcholu~$j$ a hledaný průměr je na světě.
354
355 Po~provedení jednoho násobení matic tedy dovedeme pro každou dvojici vrcholů
356 v~konstantním čase spočítat $D_{ij}$ z~$D'_{ij}$. Jedna úroveň rekurze proto
357 trvá $\O(n^\omega)$ a jelikož průměr grafu pokaždé klesne alespoň dvakrát,
358 je úrovní $\O(\log n)$ a celý algoritmus doběhne ve~slíbeném čase $\O(n^\omega\log n)$.
359
360 \references
361 \bye