3 \prednaska{14}{Transitivní uzávěry}{}
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
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.
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
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.
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$.
30 \h{Floydův-Warshallův algoritmus}
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ů.
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.
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
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$.
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ší
57 Samotný algoritmus postupně počítá matice $D^0, D^1, \ldots, D^n$ podle uvedeného předpisu:
60 \:$D^0 \leftarrow \hbox{matice délek hran}$.
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.$
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.
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
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.}
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
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$).
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í.
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
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.
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í:
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
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
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$.
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
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:
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)$.
143 \>Pro výpočet všech $f(R_{ij})$ nám pak stačí $\Theta(n^3)$ vyhodnocení funkce~$f$.
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.
156 \>{\I Nejkratší sled:}
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
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.)
168 \>{\I Nejširší cesta} (hranám jsou přiřazeny šířky, šířka cesty je minimum z~šířek hran):
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
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.
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:
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}.
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}.
203 Předpokládejme tedy, že umíme násobit matice v~čase $\O(n^\omega)$ pro nějaké $\omega < 3$.
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.
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)$.
217 Na~tento postup se můžeme dívat i~obecněji:
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
223 C_{ij} = \bigoplus_{k=1}^n A_{ik}\otimes B_{kj}.
225 Klasické násobení matic je tedy $(+,\cdot)$-součin.
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$.
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$.
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)$.
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.
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}.
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)$.
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.
270 \s{Věta:} Pokud matici~$A^*$ zapíšeme rovněž v~blokovém tvaru:
271 $$A^* = \pmatrix{ I & J \cr K & L \cr },$$
274 I &= (P \lor QS^*R)^*, \cr
277 L &= S^* \lor S^*RIQS^*.
281 Jednotlivé rovnosti můžeme číst takto:
282 \def\nIJKL{\count0=`H\advance\count0 by\itemcount{\bf\char\count0:}}
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
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.
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)$.
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é.
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)$.
318 \h{Seidelův algoritmus}
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ě:
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$.
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)$.
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.
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.
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$.
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)$.
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ě.
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)$.