]> mj.ucw.cz Git - ga.git/blob - 14-floyd/14-floyd.tex
Merge branch 'master' of git+ssh://git.ucw.cz/home/mj/GIT/ga
[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_u \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í (typovaným)
110 regulárním výrazům nad touto abecedou.
111
112 Ukážeme, jak pro všechny dvojice vrcholů $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í:} Je-li operace~$\oplus$ je asociativní a komutativní, operace~$\otimes$
228 asociativní a $\otimes$ distributivní přes~$\oplus$, pak $(\oplus,\otimes)$-součin
229 matic je asociativní a distributivní přes~$\oplus$ matic.
230
231 \s{Pozorování:} Pokud $A$ a~$B$ jsou matice svazků ($A_{ij}$ a $B_{ij}$
232 jsou $ij$-svazky) a $C$ jejich $(\cup,\cdot)$-součin, pak $C_{ij}$ je
233 svazek všech sledů vzniklých spojením nějakého sledu z~$A$ začínajícího
234 v~$i$ a nějakého sledu z~$B$ končícího v~$j$.
235
236 Podobně jako v~předchozí sekci si tedy můžeme pořídit funkci~$f$ přiřazující
237 svazkům hodnoty z~nějaké množiny~$X$ a operace $\oplus$ a $\otimes$ na~$X$,
238 pro něž platí $f(\alpha\cup\beta) = f(\alpha) \oplus f(\beta)$ a $f(\alpha\beta)
239 = f(\alpha) \otimes f(\beta)$. Pak stačí vzít matici popisující ohodnocení
240 všech sledů délky~1 (to je obdoba matice sousednosti), a provést $\O(\log n)$
241 $(\oplus,\otimes)$-součinů k~tomu, abychom znali ohodnocení svazků sledů délky
242 právě~$k$ pro nějaké $k\ge n$.
243
244 S~$(\lor,\land)$-součiny a maticí sousednosti s~jedničkami na diagonále získáme
245 algoritmus pro výpočet dosažitelnosti. Každý součin přitom můžeme provést jako
246 obyčejné násobení matic následované přepsáním nenul na jedničky, takže celý
247 výpočet běží v~čase $\O(n^\omega\log n)$.
248
249 Podobně můžeme počítat i matici vzdáleností: začneme s~maticí délek hran doplněnou o~nuly na~diagonále
250 a použijeme $(\min,+)$-součiny. Tyto součiny ale bohužel neumíme převést na klasické násobení matic.
251 Přesto je známo několik algoritmů efektivnějších než $\Theta(n^3)$, byť pouze o~málo:
252 například Zwickův \cite{zwick:apsp} v~čase $\O(n^3\sqrt{\log\log n}/\log n)$
253 (založený na dekompozici a předpočítání malých bloků) nebo Chanův \cite{chan:apsp} v~$\O(n^3/\log n)$
254 (používající geometrické techniky). Abychom porazili Floydův-Warshallův algoritmus,
255 potřebovali bychom ovšem větší než logaritmické zrychlení, protože součinů potřebujeme
256 vypočítat logaritmicky mnoho.
257
258 Dodejme ještě, že pro grafy ohodnocené malými celými čísly je možné využít
259 celou řadu dalších triků. Zájemce o~tento druh algoritmů odkazujeme na Zwickův
260 článek~\cite{zwick:apspint}.
261
262 \h{Rozděl a panuj}
263
264 Předchozí převod je ovšem trochu marnotratný. Šikovným použitím metody Rozděl a panuj
265 můžeme časovou složitost ještě snížit. Postup předvedeme pro dosažitelnost: na vstupu
266 tedy dostaneme matici sousednosti~$A$, výstupem má být její transitivní uzávěr~$A^*$
267 (matice dosažitelnosti). Všechny součiny matic v~tomto oddílu budou typu $(\lor,\land)$.
268
269 Vrcholy grafu rozdělíme na dvě množiny $X$ a~$Y$ přibližně stejné velikosti,
270 bez újmy na obecnosti tak, aby matice~$A$ měla následující blokový tvar:
271 $$A = \pmatrix{ P & Q \cr R & S \cr },$$
272 kde podmatice~$P$ popisuje hrany z~$X$ do~$X$, podmatice~$Q$ hrany z~$X$ do~$Y$, atd.
273
274 \s{Věta:} Pokud matici~$A^*$ zapíšeme rovněž v~blokovém tvaru:
275 $$A^* = \pmatrix{ I & J \cr K & L \cr },$$
276 bude platit:
277 $$\eqalign{
278 I &= (P \lor QS^*R)^*, \cr
279 J &= IQS^*, \cr
280 K &= S^*RI, \cr
281 L &= S^* \lor S^*RIQS^*.
282 }$$
283
284 \proof
285 Jednotlivé rovnosti můžeme číst takto:
286 \def\nIJKL{\count0=`H\advance\count0 by\itemcount{\bf\char\count0:}}
287 \numlist\nIJKL
288 \:Sled z~$X$ do~$X$ vznikne opakováním částí, z~nichž každá je buďto
289 hrana uvnitř~$X$ nebo přechod po hraně z~$X$ do~$Y$ následovaný sledem
290 uvnitř~$Y$ a přechodem zpět do~$X$.
291 \:Sled z~$X$ do~$Y$ můžeme rozdělit v~místě, kdy naposledy přechází
292 po~hraně z~$X$ do~$Y$. První část přitom bude sled z~$X$ do~$X$,
293 druhá sled uvnitř~$Y$.
294 \:Se sledem z~$Y$ do~$X$ naložíme symetricky.
295 \:Sled z~$Y$ do~$Y$ vede buďto celý uvnitř~$Y$, nebo ho můžeme rozdělit
296 na~prvním přechodu z~$Y$ do~$X$ a posledním přechodu z~$X$ do~$Y$.
297 Část před prvním přechodem povede celá uvnitř~$Y$, část mezi přechody
298 bude tvořit sled z~$X$ do~$X$ a konečně část za~posledním přechodem zůstane
299 opět uvnitř~$Y$.
300 \qeditem
301 \endlist
302
303 \s{Algoritmus:}
304 Výpočet matice~$A^*$ provedeme podle předchozí věty. Spočítáme 2~tranzitivní uzávěry
305 matic poloviční velikosti rekurzivním voláním, dále pak $\O(1)$ $(\lor,\land)$-součinů
306 a $\O(1)$ součtů matic.
307
308 Časová složitost $t(n)$ tohoto algoritmu bude splňovat následující rekurenci:
309 $$t(1)=\Theta(1), \quad t(n) = 2t(n/2) + \Theta(1)\cdot\mu(n/2) + \Theta(n^2),$$
310 kde $\mu(k)$ značí čas potřebný na jeden $(\lor,\land)$-součin
311 matic $k\times k$. Jelikož jistě platí $\mu(n/2)=\Omega(n^2)$,
312 má tato rekurence podle kuchařkové věty řešení $t(n) \in \O(\mu(n))$.
313
314 Ukázali jsme tedy, že výpočet matice dosažitelnosti je nejvýše stejně
315 náročný jako $(\lor,\land)$-násobení matic -- můžeme ho proto provést
316 v~čase $\O(n^\omega)$. Dokonce existuje přímočarý převod v~opačném směru,
317 takže oba problémy jsou asymptoticky stejně těžké.
318
319 Podobně nalézt matici vzdáleností je stejně těžké jako $(\min,+)$-součin,
320 takže na to stačí čas $\O(n^3/\log n)$.
321
322 \h{Seidelův algoritmus}
323
324 Pro neorientované neohodnocené grafy můžeme dosáhnout ještě lepších
325 výsledků. Matici vzdáleností lze spočítat v~čase $\O(n^\omega\log n)$
326 Seidelovým algoritmem~\cite{seidel:unitlength}. Ten funguje následovně:
327
328 \s{Definice:} {\I Druhá mocnina grafu~$G$} je graf~$G^2$ na téže množině vrcholů,
329 v~němž jsou vrcholy~$i$ a~$j$ spojeny hranou právě tehdy, existuje-li v~$G$ sled
330 délky nejvýše~2 vedoucí z~$i$ do~$j$.
331
332 \s{Pozorování:} Matici sousednosti grafu~$G^2$ získáme z~matice sousednosti
333 grafu~$G$ jedním $(\lor,\land)$-součinem, tedy v~čase $\O(n^\omega)$.
334
335 Seidelův algoritmus bude postupovat rekurzivně: Sestrojí graf~$G^2$, rekurzí
336 spočítá jeho matici vzdáleností~$D'$ a z~ní pak rekonstruuje matici vzdáleností~$D$
337 zadaného grafu. Rekurze končí, pokud $G^2=G$ -- tehdy je každá komponenta
338 souvislosti zahuštěna na~úplný graf, takže matice vzdáleností je rovna matici sousednosti.
339
340 Zbývá ukázat, jak z~matice~$D'$ spočítat matici~$D$. Zvolme pevně~$i$ a zaměřme
341 se na funkce $d(v)=D_{iv}$ a $d'(v)=D'_{iv}$. Jistě platí $d'(v) = \lceil d(v)/2 \rceil$,
342 pročež $d(v)$ je buď rovno $2d'(v)$ nebo o~1 nižší. Naučíme se rozpoznat, jestli
343 $d(v)$ má být sudé nebo liché, a~z~toho vždy poznáme, jestli je potřeba jedničku odečíst.
344
345 Jak vypadá funkce~$d$ na sousedech vrcholu~$v\ne i$? Pro alespoň jednoho souseda~$u$ je
346 $d(u) = d(v)-1$ (to platí pro sousedy, kteří leží na některé z~nejkratších cest z~$v$ do~$i$).
347 Pro všechny ostatní sousedy je $d(u)=d(v)$ nebo $d(u)=d(v)+1$.
348
349 Pokud je $d(v)$ sudé, vyjde pro sousedy ležící na nejkratších cestách $d'(u)=d'(v)$
350 a pro ostatní sousedy $d'(u)\ge d'(v)$, takže průměr z~$d'(u)$ přes sousedy je
351 alespoň~$d'(v)$. Je-li naopak $d(v)$ liché, musí být pro sousedy na nejkratších cestách
352 $d'(u) < d(v)$ a pro všechny ostatní $d'(u) = d(v)$, takže průměr klesne pod~$d'(v)$.
353
354 Průměry přes sousedy přitom můžeme spočítat násobením matic: vynásobíme matici
355 vzdáleností~$D'$ maticí sousednosti grafu~$G$. Na pozici~$i,j$ se objeví součet
356 hodnot $D'_{ik}$ přes všechny sousedy~$k$ vrcholu~$j$. Ten stačí vydělit stupněm
357 vrcholu~$j$ a hledaný průměr je na světě.
358
359 Po~provedení jednoho násobení matic tedy dovedeme pro každou dvojici vrcholů
360 v~konstantním čase spočítat $D_{ij}$ z~$D'_{ij}$. Jedna úroveň rekurze proto
361 trvá $\O(n^\omega)$ a jelikož průměr grafu pokaždé klesne alespoň dvakrát,
362 je úrovní $\O(\log n)$ a celý algoritmus doběhne ve~slíbeném čase $\O(n^\omega\log n)$.
363
364 \references
365 \bye