\input ../sgr.tex
-\def\alt{\mathop{\vert}}
-
\prednaska{13}{Nejkrat¹í cesty: Maticové metody}{}
V~pøedchozí kapitole jsme se zabývali algoritmy pro hledání nejkrat¹ích
obsahuje délku nejkrat¹í cesty mezi nimi.
Jeden zpùsob se ihned nabízí: postupnì spustit Dijkstrùv algoritmus pro v¹echny
-mo¾né volby poèáteèního vrcholu, pøípadnì se pøed tím je¹tì pomocí potenciálù
-zbavit záporných hran. Tak dosáhneme èasové slo¾itosti $\O(mn + n^2\log n)$,
-co¾ je pro øídké grafy nejlep¹í známý výsledek -- jen $\O(\log n)$-krát
+mo¾né volby poèáteèního vrcholu, pøípadnì se pøed tím je¹tì zbavit záporných
+hran pomocí potenciálù. Tak dosáhneme èasové slo¾itosti $\O(mn + n^2\log n)$.
+To je pro øídké grafy nejlep¹í známý výsledek -- jen $\O(\log n)$-krát
pomalej¹í, ne¾ je velikost výstupu.
-Pro husté grafy obvykle pracují rychleji algoritmy zalo¾ené na maticích a zejména
-na jejich násobení. Nìkolik takových si nyní pøedvedeme. Vrcholy grafu budou
-v¾dy oèíslované èísly 1 a¾~$n$ a graf doplníme na úplný, pøièem¾ hrany, které
-pùvodnì neexistovaly, obdr¾í délku $+\infty$.
+Je-li graf hustý pracují obvykle rychleji algoritmy zalo¾ené na maticích, zejména
+na jejich násobení. Nìkolik algoritmù tohoto druhu si nyní pøedvedeme,
+a to jak pro výpoèet vzdáleností, tak pro dosa¾itelnost (transitivní uzávìr).
+
+Graf na vstupu bude v¾dy zadán maticí délek hran -- to je matice $n\times n$,
+její¾ øádky i sloupce jsou indexované vrcholy a na pozici $(i,j)$ se nachází
+délka hrany $ij$; pøípadné chybìjící hrany doplníme s~délkou~$+\infty$.
\h{Floydùv-Warshallùv algoritmus}
Pak platí:
$$\eqalign{
D^0_{ij} &= \hbox{délka hrany $ij$,} \cr
-D^n_{ij} &= \hbox{vzdálenost z~$i$ do~$j$,} \cr
+D^n_{ij} &= \hbox{hledaná vzdálenost z~$i$ do~$j$,} \cr
D^k_{ij} &= \min( D^{k-1}_ij, D^{k-1}_{ik} + D^{k-1}_{kj} ). \cr
}$$
-První dvì rovnosti dostaneme pøímo z~definice. Tøetí rovnost dostaneme rozdìlením
+První dvì rovnosti plynou pøímo z~definice. Tøetí rovnost dostaneme rozdìlením
cest z~$i$ do~$j$ pøes 1 a¾~$k$ na ty, které se vrcholu~$k$ vyhnou (a~jsou tedy
cestami pøes 1 a¾~$k-1$), a ty, které ho pou¾ijí -- ka¾dou takovou mù¾eme slo¾it
z~cesty z~$i$ do~$k$ a cesty z~$k$ do~$j$, obojí pøes 1 a¾~$k-1$.
tak¾e tím fale¹né øe¹ení nevyrobíme. (Pøesnìji: ze sledu $i\alpha v\beta k\gamma v\delta j$,
kde $v\not\in\beta,\gamma$, mù¾eme vypu¹tìním èásti $v\beta k\gamma v$ nezáporné
délky získat sled z~$i$ do~$j$ pøes 1 a¾~$k-1$, jeho¾ délka nemù¾e být men¹í
-ne¾~$D^{k-1}{ij}$.)
+ne¾~$D^{k-1}_{ij}$.)
-Samotný algoritmus pak postupnì poèítá matice $D^0, D^1, \ldots, D^n$:
+Samotný algoritmus postupnì poèítá matice $D^0, D^1, \ldots, D^n$ podle uvedeného pøedpisu:
\algo
-\:$D^0 \leftarrow \hbox{matice délek hran}$
+\:$D^0 \leftarrow \hbox{matice délek hran}$.
\:Pro $k=1,\ldots,n$:
\::Pro $i,j=1,\ldots,n$:
-\:::$D^k_{ij} = \min( D^{k-1}_ij, D^{k-1}_{ik} + D^{k-1}_{kj} )$.
+\:::$D^k_{ij} \leftarrow \min( D^{k-1}_ij, D^{k-1}_{ik} + D^{k-1}_{kj} )$.
\:$\hbox{Matice vzdáleností} \leftarrow D^n.$
\endalgo
okam¾iku potøebujeme jen aktuální matici~$D^k$ a pøedchozí~$D^{k-1}$. Anebo
nahlédneme, ¾e mù¾eme $D^{k-1}$ na~$D^k$ pøepisovat na místì. U~hodnot $D_{ik}$
a~$D_{kj}$ je toti¾ podle definice stará i nová hodnota stejná. Algoritmu tedy
-staèí $\Theta(n^2)$ pamìti.
+staèí jediné pole velikosti $n\times n$, které na~poèátku výpoètu obsahuje
+vstup a na~konci výstup.
\h{Regulární výrazy}
Pøedchozí algoritmus lze zajímavì zobecnit, toti¾ tak, aby pro ka¾dou dvojici
-vrcholù sestrojil vhodnou reprezentaci mno¾iny v¹ech sledù vedoucích mezi touto
-dvojicí. Tato reprezentace bude velice podobná regulárním výrazùm známým
-z~teorie automatù. Zadaný orientovaný graf pøitom mù¾e obsahovat i smyèky
-a násobné hrany.
+vrcholù sestrojil vhodnou reprezentaci mno¾iny v¹ech sledù vedoucích mezi nimi.
+Tato reprezentace bude velice podobná regulárním výrazùm známým z~UNIXu
+a z~teorie automatù. Budeme pøipou¹tìt orientované multigrafy se smyèkami
+a násobnými hranami.
-\s{Definice:} {\I Sledový regulární výraz} pro vrcholy $u$ a~$v$ (zkrácenì
-{\I $uv$-výraz}) kóduje mno¾inu sledù z~vrcholu~$u$ do vrcholu~$v$. Mno¾inu
-kódovanou výrazem~$\psi$ budeme znaèit $S(\psi)$. Ka¾dý $uv$-výraz má jeden
-z~tìchto tvarù:
+\s{Definice:} {\I Svazek} je mno¾ina sledù, které mají spoleèný poèáteèní
+a koncový vrchol. {\I Typem} svazku nazveme uspoøádanou dvojici tìchto vrcholù.
+Místo \uv{svazek typu $(u,v)$} budeme obvykle øíkat prostì {\I $uv$-svazek.}
-\itemize\ibull
-\:$\emptyset$ -- prázdná mno¾ina sledù,
-\:$e$ -- identifikátor nìkteré hrany z~$u$ do~$v$,
-\:$\alpha\alt\beta$ (kde $\alpha$ i $\beta$ jsou $uv$-výrazy) --
-{\I sjednocení:} $S(\alpha\alt\beta) = S(\alpha) \cup S(\beta)$,
-\:$\alpha\beta$ (kde $\alpha$ je $uw$-výraz a $\beta$ je $wv$-výraz pro nìjaké~$w$) --
-{\I zøetìzení:} $S(\alpha\beta)$ je mno¾ina v¹ech sledù, které vzniknou
-napojením nìjakého sledu z~$S(\beta)$ za nìjaký sled z~$S(\alpha)$,
-\endlist
+Triviálními pøípady svazkù jsou prázdná mno¾ina~$\emptyset$, samotná hrana~$uv$ a pro
+$u=v$ také sled~$\varepsilon$ nulové délky. Svazky mù¾eme kombinovat
+následujícími operacemi:
-\>Pokud $u=v$, pak navíc:
\itemize\ibull
-\:$\varepsilon$ -- mno¾ina obsahující pouze sled nulové délky,
-\:$\alpha^*$ (kde $\alpha$ je $uu$-výraz) -- {\I iterace:}
-$\alpha^* = \varepsilon \alt \alpha \alt \alpha\alpha \alt \alpha\alpha\alpha \alt \ldots$
+\:$A\cup B$ -- {\I sjednocení} dvou svazkù tého¾ typu,
+\:$AB$ nebo $A\cdot B$ -- {\I zøetìzení} $uv$-svazku~$A$ s~$vw$-svazkem~$B$: výsledkem je $uw$-svazek
+obsahující v¹echna spojení sledu z~$A$ se sledem z~$B$,
+\:$A^*$ -- {\I iterace} $uu$-svazku: výsledkem je $uu$-svazek
+$\varepsilon \cup A \cup AA \cup AAA \cup \ldots$ (tedy v¹echna mo¾ná
+spojení koneènì mnoha sledù z~$A$).
\endlist
-\>Operace sjednocení a zøetìzení jsou asociativní, tak¾e je obvykle nebudeme
-závorkovat; operace sjednocení má ve~výrazech ni¾¹í prioritu ne¾ zøetìzení.
-Pro ka¾dou dvojici vrcholù $i$,~$j$ nyní budeme hledat výraz $R_{ij}$ popisující
-v¹echny sledy z~$i$ do~$j$. Podobnì jako u~Floydova-Warshallova algoritmu zavedeme
-$R^k_{ij}$ coby výraz popisující sledy z~$i$ do~$j$ pøes 1 a¾~$k$ a nahlédneme,
-¾e platí:
+\>Ve~výrazu definujícím~$A^*$ jsme vyu¾ili, ¾e operace sjednocení a zøetìzení
+jsou asociativní, tak¾e je nemusíme závorkovat. Navíc sjednocení má ve~výrazech
+ni¾¹í prioritu ne¾ zøetìzení.
+
+\>Svazky budeme obvykle reprezentovat {\I sledovými výrazy,} co¾ jsou
+výrazy koneèné délky sestávající z~triviálních svazkù a vý¹e uvedených
+operací.
+
+\s{Pozorování:} Sledy mù¾eme reprezentovat øetìzci nad abecedou, její¾
+symboly jsou identifikátory hran. Sledové výrazy pak odpovídají regulárním
+výrazùm nad touto abecedou.
+
+Uká¾eme, jak pro v¹echny dvojice vrcholu $i,j$ sestrojit sledový výraz $R_{ij}$
+popisující svazek v¹ech sledù z~$i$ do~$j$. Podobnì jako u~Floydova-Warshallova
+algoritmu zavedeme $R^k_{ij}$ coby výraz popisující sledy z~$i$ do~$j$ pøes 1 a¾~$k$
+a nahlédneme, ¾e platí:
$$\eqalign{
R^0_{ij} &= \hbox{mno¾ina v¹ech hran z~$i$ do~$j$}, \cr
R^n_{ij} &= \hbox{hledané $R_{ij}$}, \cr
-R^k_{ij} &= R^{k-1}_{ij} \alt R^{k-1}_{ik}(R^{k-1}_{kk})^*R^{k-1}_{kj}. \cr
+R^k_{ij} &= R^{k-1}_{ij} \cup R^{k-1}_{ik}(R^{k-1}_{kk})^*R^{k-1}_{kj}. \cr
}$$
-První dvì rovnosti opìt dostaneme pøímo z~definice (mno¾inu v¹ech hran zapí¹eme
+První dvì rovnosti opìt plynou pøímo z~definice (mno¾inu v¹ech hran zapí¹eme
buï jako prázdnou nebo ji vytvoøíme sjednocováním z~jednoprvkových mno¾in). Tøetí
rovnost vychází z~toho, ¾e ka¾dý sled z~$i$ do~$j$ buï neobsahuje~$k$, nebo ho
mù¾eme rozdìlit na~èásti mezi jednotlivými náv¹tìvami vrcholu~$k$.
Algoritmus tedy bude postupnì budovat matice $R^0, R^1, \ldots, R^n$ podle tìchto
pravidel. Provedeme pøi tom $\Theta(n^3)$ operací, ov¹em s~výrazy, jejich¾ délka
-mù¾e být a¾ øádovì~$4^n$. Radìji ne¾ jako øetìzce je budeme ukládat v~podobì
+mù¾e být a¾ øádovì~$4^n$. Radìji ne¾ jako øetìzce je proto budeme ukládat v~podobì
acyklických orientovaných grafù: vrcholy budou operace, hrany je budou pøipojovat
k~operandùm.
K~pøímému pou¾ití se takový exponenciálnì dlouhý výraz hodí málokdy, ale mù¾e
nám pomoci odpovídat na rùzné otázky týkající se sledù s~danými koncovými vrcholy.
-Máme-li nìjakou funkci~$f$ pøiøazující hodnoty mno¾inám sledù kódovaným sledovými
+Máme-li nìjakou funkci~$f$ ohodnocující mno¾iny sledù kódované sledovými
výrazy, staèí umìt vyhodnotit:
\itemize\ibull
\:výsledek pro triviální výrazy $f(\emptyset)$, $f(\varepsilon)$ a $f(e)$ pro hranu~$e$,
-\:hodnoty $f(\alpha\alt\beta)$, $f(\alpha\beta)$ a $f(\alpha^*)$, známe-li ji¾ $f(\alpha)$ a $f(\beta)$.
+\:hodnoty $f(\alpha\cup\beta)$, $f(\alpha\beta)$ a $f(\alpha^*)$, známe-li ji¾ $f(\alpha)$ a $f(\beta)$.
\endlist
\>Pro výpoèet v¹ech $f(R_{ij})$ nám pak staèí $\Theta(n^3)$ vyhodnocení funkce~$f$.
+\s{Poznámka pro ctitele algebry:} Vý¹e uvedená konstrukce není nic jiného, ne¾ popis
+homomorfismu~$f$ z~algebry $({\cal S},\emptyset,\varepsilon_1,\ldots,\varepsilon_n,
+e_1,\ldots,e_m,\cup,\cdot,{}^*)$ nad mno¾inou~${\cal S}$ v¹ech svazkù do~nìjaké
+algebry $(X,{\bf 0},c_1,\ldots,c_n,h_1,\ldots,h_m,\oplus,\otimes,\circledast)$, kde~$X$ je mno¾ina
+v¹ech ohodnocení sledù, {\bf 0}, $c_1,\ldots,c_n$ a $h_1,\ldots,h_m$ jsou konstanty,
+$\oplus$ a~$\otimes$ binární operace a $\circledast$ unární operace. Prùbìh výpoètu
+upraveného algoritmu je pak homomorfním obrazem prùbìhu výpoètu pùvodního algoritmu
+pracujícího pøímo se svazky.
+
\s{Pøíklady:}
\>{\I Nejkrat¹í sled:}
$$\eqalign{
f(\emptyset)&=+\infty \cr
f(\varepsilon)&=0 \cr
-f(e)&=\ell(e) \hbox{\quad (délka hrany)} \cr
-f(\alpha\alt\beta) &= \min(f(\alpha),f(\beta)) \cr
+f(e)&=\ell(e) \hbox{\quad (délka hrany~$e$)} \cr
+f(\alpha\cup\beta) &= \min(f(\alpha),f(\beta)) \cr
f(\alpha\beta) &= f(\alpha) + f(\beta) \cr
f(\alpha^*) &= \cases{0 & \hbox{pro $f(\alpha)\ge 0$} \cr -\infty & \hbox{pro $f(\alpha)<0$} \cr} \cr
}$$
$$\eqalign{
f(\emptyset)&=0 \cr
f(\varepsilon)&=\infty \cr
-f(e)&=w(e) \hbox{\quad (¹íøka hrany)} \cr
-f(\alpha\alt\beta) &= \max(f(\alpha),f(\beta)) \cr
+f(e)&=w(e) \hbox{\quad (¹íøka hrany~$e$)} \cr
+f(\alpha\cup\beta) &= \max(f(\alpha),f(\beta)) \cr
f(\alpha\beta) &= \min(f(\alpha),f(\beta)) \cr
f(\alpha^*) &= \infty \cr
}$$
\>{\I Pøevod koneèného automatu na regulární výraz:} Vrcholy multigrafu budou odpovídat
stavùm automatu, hrany mo¾ným pøechodùm mezi stavy. Ka¾dou hranu ohodnotíme symbolem
-abecedy, po jeho¾ pøeètení automat pøechod provede. Funkce~$f$ pak pøiøadí $uv$-výrazu~$\psi$
+abecedy, po jeho¾ pøeètení automat pøechod provede. Funkce~$f$ pak pøiøadí $uv$-svazku~$\psi$
regulární výraz popisující mno¾inu v¹ech øetìzcù, po jejich¾ pøeètení automat pøejde
-ze~stavu~$u$ do stavu~$v$ po pøechodech z~mno¾iny $S(\psi)$. Vyhodnocování funkce~$f$
+ze~stavu~$u$ do stavu~$v$ po pøechodech z~mno¾iny~$\psi$. Vyhodnocování funkce~$f$
odpovídá pøímoèarým operacím s~øetìzci.
-\h{Dosa¾itelnost pomocí násobení matic}
+\h{Násobení matic}
-\h{Seidelùv algoritmus}
+Øe¹íme-li grafové problémy pomocí matic, nabízí se pou¾ít známé subkubické algoritmy
+pro lineárnì algebraické úlohy. Ty jsou obvykle zalo¾eny na efektivním násobení
+matic -- dvì matice $n\times n$ mù¾eme vynásobit v~èase $\O(n^{2.808})$ Strassenovým
+algoritmem~\cite{strassen:matmult}, pøípadnì asymptoticky nejrychlej¹ím známým algoritmem od Coppersmithe
+a Winograda~\cite{coppersmith:matmult} v~èase $\O(n^{2.376})$. Slavná hypotéza øíká,
+¾e pro ka¾dé $\omega>2$ existuje algoritmus násobící matice se slo¾itostí $\O(n^\omega)$
+(blí¾e o~tomto fascinujícím tématu viz \cite{szegedy:matmult}). Oznaème tedy~$\omega$
+nejni¾¹í exponent, kterého jsme schopni dosáhnout.
+
+Co se stane, kdy¾ mocníme matici sousednosti~$A$ grafu? V~matici $A^k$ se na pozici
+$i,j$ nachází poèet sledù délky~$k$, které vedou z~vrcholu~$i$ do vrcholu~$j$.
+(Snadný dùkaz indukcí vynecháváme.) Pro libovolné $k\ge n-1$ jsou tedy v~$(A+E)^k$
+(kde $E$ znaèí jednotkovou matici; doplnili jsme tedy do grafu smyèky) nenuly
+pøesnì tam, kde z~$i$ do~$j$ vede cesta.
+
+To nám dává jednoduchý algoritmus pro výpoèet matice dosa¾itelnosti~$R$ ($R_{ij}$
+je 1 nebo~0 podle toho, zda z~$i$ do~$j$ vede cesta). Do~matice~$A$ doplníme
+na diagonálu jednièky a poté ji $\lceil \log_2 n\rceil$-krát umocníme na~druhou.
+Abychom se vyhnuli velkým èíslùm, nahradíme po ka¾dém umocnìní nenuly jednièkami.
+Celkem tedy provedeme $\O(\log n)$ násobení matic, co¾ trvá $\O(n^\omega\log n)$.
+
+Na~tento postup se mù¾eme dívat i~obecnìji:
+
+\s{Definice:} {\I $(\oplus,\otimes)$-souèin} matic~$A,B \in X^{n\times n}$
+kde $\oplus$ a~$\otimes$ jsou dvì asociativní binární operace na~mno¾inì~$X$,
+je matice~$C$ taková, ¾e
+$$
+C_{ij} = \bigoplus_{k=1}^n A_{ik}\otimes B_{kj}.
+$$
+Klasické násobení matic je tedy $(+,\cdot)$-souèin.
+
+\s{Pozorování:} Pokud $A$ a~$B$ jsou matice svazkù ($A_{ij}$ a $B_{ij}$
+jsou $ij$-svazky) a $C$ jejich $(\cup,\cdot)$-souèin, pak $C_{ij}$ je
+svazek v¹ech sledù vzniklých spojením nìjakého sledu z~$A$ zaèínajícího
+v~$i$ a nìjakého sledu z~$B$ konèícího v~$j$.
+
+Podobnì jako v~pøedchozí sekci si tedy mù¾eme poøídit funkci~$f$ pøiøazující
+svazkùm hodnoty z~nìjaké mno¾iny~$X$ a operace $\oplus$ a $\otimes$ na~$X$,
+pro nì¾ platí $f(\alpha\cup\beta) = f(\alpha) \oplus f(\beta)$ a $f(\alpha\beta)
+= f(\alpha) \otimes f(\beta)$. Pak staèí vzít matici popisující ohodnocení
+v¹ech sledù délky 0 nebo~1 (to je obdoba matice sousednosti), a provést $\O(\log n)$
+$(\oplus,\otimes)$-souèinù k~tomu, abychom znali ohodnocení svazkù sledù délky
+právì~$k$ pro nìjaké $k\ge n$.
+
+S~$(\lor,\land)$-souèiny a maticí sousednosti s~jednièkami na diagonále získáme
+algoritmus pro výpoèet dosa¾itelnosti. Ka¾dý souèin pøitom mù¾eme provést jako
+obyèejné násobení matic následované pøepsáním nenul na jednièky, tak¾e celý
+výpoèet bì¾í v~èase $\O(n^\omega\log n)$.
+
+Podobnì mù¾eme poèítat i matici vzdáleností: zaèneme s~maticí délek hran doplnìnou o~nuly na~diagonále
+a pou¾ijeme $(\min,+)$-souèiny. Tyto souèiny ale bohu¾el neumíme pøevést na klasické násobení matic.
+Pøesto je známo nìkolik algoritmù efektivnìj¹ích ne¾ $\Theta(n^3)$, by» pouze o~málo:
+napøíklad Zwickùv \cite{zwick:apsp} v~èase $\O(n^3\sqrt{\log\log n}/\log n)$
+(zalo¾ený na dekompozici a pøedpoèítání malých blokù) nebo Chanùv \cite{chan:apsp} v~$\O(n^3/\log n)$
+(pou¾ívající geometrické techniky). Abychom porazili Floydùv-Warshallùv algoritmus,
+potøebovali bychom ov¹em vìt¹í ne¾ logaritmické zrychlení, proto¾e souèinù potøebujeme
+vypoèítat logaritmicky mnoho.
+
+Dodejme je¹tì, ¾e pro grafy ohodnocené malými celými èísly je mo¾né vyu¾ít
+celou øadu dal¹ích trikù. Zájemce o~tento druh algoritmù odkazujeme na Zwickùv
+èlánek~\cite{zwick:apspint}.
\h{Rozdìl a panuj}
+Pøedchozí pøevod je ov¹em trochu marnotratný. ©ikovným pou¾itím metody Rozdìl a panuj
+mù¾eme èasovou slo¾itost je¹tì sní¾it. Postup pøedvedeme pro dosa¾itelnost: na vstupu
+tedy dostaneme matici sousednosti~$A$, výstupem má být její transitivní uzávìr~$A^*$
+(matice dosa¾itelnosti). V¹echny souèiny matic v~tomto oddílu budou typu $(\lor,\land)$.
+
+Vrcholy grafu rozdìlíme na dvì mno¾iny $X$ a~$Y$ pøibli¾nì stejné velikosti,
+bez újmy na obecnosti tak, aby matice~$A$ mìla následující blokový tvar:
+$$A = \pmatrix{ P & Q \cr R & S \cr },$$
+kde podmatice~$P$ popisuje hrany z~$X$ do~$X$, podmatice~$Q$ hrany z~$X$ do~$Y$, atd.
+
+\s{Vìta:} Pokud matici~$A^*$ zapí¹eme rovnì¾ v~blokovém tvaru:
+$$A^* = \pmatrix{ I & J \cr K & L \cr },$$
+bude platit:
+$$\eqalign{
+I &= (P \lor QR^*S)^*, \cr
+J &= IQS^*, \cr
+K &= S^*RI, \cr
+L &= S^* \lor S^*RIQS^*.
+}$$
+
+\proof
+Jednotlivé rovnosti mù¾eme èíst takto:
+\def\nIJKL{\count0=`H\advance\count0 by\itemcount{\bf\char\count0:}}
+\numlist\nIJKL
+\:Sled z~$X$ do~$X$ vznikne opakováním èástí, z~nich¾ ka¾dá je buïto
+hrana uvnitø~$X$ nebo pøechod po hranì z~$X$ do~$Y$ následovaný sledem
+uvnitø~$Y$ a pøechodem zpìt do~$X$.
+\:Sled z~$X$ do~$Y$ mù¾eme rozdìlit v~místì, kdy naposledy pøechází
+po~hranì z~$X$ do~$Y$. První èást pøitom bude sled z~$X$ do~$X$,
+druhá sled uvnitø~$Y$.
+\:Se sledem z~$Y$ do~$X$ nalo¾íme symetricky.
+\:Sled z~$Y$ do~$Y$ vede buïto celý uvnitø~$Y$, nebo ho mù¾eme rozdìlit
+na~prvním pøechodu z~$Y$ do~$X$ a posledním pøechodu z~$X$ do~$Y$.
+Èást pøed prvním pøechodem povede celá uvnitø~$Y$, èást mezi pøechody
+bude tvoøit sled z~$X$ do~$X$ a koneènì èást za~posledním pøechodem zùstane
+opìt uvnitø~$Y$.
+\qeditem
+\endlist
+
+\s{Algoritmus:}
+Výpoèet matice~$A^*$ provedeme podle pøedchozí vìty. Spoèítáme 3~tranzitivní uzávìry
+matic polovièní velikosti rekurzivním voláním, dále pak $\O(1)$ $(\lor,\land)$-souèinù
+a $\O(1)$ souètù matic.
+
+Èasová slo¾itost $t(n)$ tohoto algoritmu bude splòovat následující rekurenci:
+$$t(1)=\Theta(1), \quad t(n) = 3t(n/2) + \Theta(1)\cdot\mu(n/2) + \Theta(n^2),$$
+kde $\mu(k)$ znaèí èas potøebný na jeden $(\lor,\land)$-souèin
+matic $k\times k$. Jeliko¾ jistì platí $\mu(n/2)=\Omega(n^2)$,
+má tato rekurence podle kuchaøkové vìty øe¹ení $t(n) = \mu(n)$.
+
+Ukázali jsme tedy, ¾e výpoèet transitivního uzávìru je nejvý¹e stejnì
+nároèný jako $(\lor,\land)$-násobení matic -- mù¾eme ho proto provést
+v~èase $\O(n^\omega)$. Dokonce existuje pøímoèarý pøevod v~opaèném smìru,
+tak¾e oba problémy jsou asymptoticky stejnì tì¾ké.
+
+Podobnì nalézt matici vzdáleností je stejnì tì¾ké jako $(\min,+)$-souèin,
+tak¾e na to staèí èas $\O(n^3/\log n)$.
+
+\h{Seidelùv algoritmus}
+
+Pro neorientované neohodnocené grafy mù¾eme dosáhnout je¹tì lep¹ích
+výsledkù. Matici vzdáleností lze spoèítat v~èase $\O(n^\omega\log n)$
+Seidelovým algoritmem~\cite{seidel:unitlength}. Ten funguje následovnì:
+
+\s{Definice:} {\I Druhá mocnina grafu~$G$} je graf~$G^2$ na té¾e mno¾inì vrcholù,
+v~nìm¾ jsou vrcholy~$i$ a~$j$ spojeny hranou právì tehdy, existuje-li v~$G$ sled
+délky nejvý¹e~2 vedoucí z~$i$ do~$j$.
+
+\s{Pozorování:} Matici sousednosti grafu~$G^2$ získáme z~matice sousednosti
+grafu~$G$ jedním $(\lor,\land)$-souèinem, tedy v~èase $\O(n^\omega)$.
+
+Seidelùv algoritmus bude postupovat rekurzivnì: Sestrojí graf~$G^2$, rekurzí
+spoèítá jeho matici vzdáleností~$D'$ a z~ní pak rekonstruuje matici vzdáleností~$D$
+zadaného grafu. Rekurze konèí, pokud $G^2=G$ -- tehdy je ka¾dá komponenta
+souvislosti zahu¹tìna na~úplný graf, tak¾e matice vzdáleností je rovna matici sousednosti.
+
+Zbývá ukázat, jak z~matice~$D'$ spoèítat matici~$D$. Zvolme pevnì~$i$ a zamìøme
+se na funkce $d(v)=D_{iv}$ a $d'(v)=D'_{iv}$. Jistì platí $d'(v) = \lfloor d(v)/2 \rfloor$,
+proèe¾ $d(v)$ je buï rovno $2d'(v)$ nebo o~1 vy¹¹í. Nauèíme se rozpoznat, jestli
+$d(v)$ má být sudé nebo liché, a~z~toho v¾dy poznáme, jestli je potøeba jednièku pøièíst.
+
+Jak vypadá funkce~$d$ na sousedech vrcholu~$v\ne i$? Pro alespoò jednoho souseda~$u$ je
+$d(u) = d(v)-1$ (to platí pro sousedy, kteøí le¾í na nìkteré z~nejkrat¹ích cest z~$v$ do~$i$).
+Pro v¹echny ostatní sousedy je $d(u)=d(v)$ nebo $d(u)=d(v)+1$.
+
+Pokud je $d(v)$ liché, vyjde pro sousedy le¾ící na nejkrat¹ích cestách $d'(u)=d'(v)$
+a pro ostatní sousedy $d'(u)\ge d'(v)$, tak¾e prùmìr z~$d'(u)$ pøes sousedy je
+alespoò~$d'(v)$. Je-li naopak $d(v)$ sudé, musí být pro sousedy na nejkrat¹ích cestách
+$d'(u) < d(v)$ a pro v¹echny ostatní $d'(u) = d(v)$, tak¾e prùmìr klesne pod~$d'(v)$.
+
+Prùmìry pøes sousedy pøitom mù¾eme spoèítat násobením matic: vynásobíme matici
+vzdáleností~$D'$ maticí sousednosti grafu~$G$. Na pozici~$i,j$ se objeví souèet
+hodnot $D_{ik}$ pøes v¹echny sousedy~$k$ vrcholu~$j$. Ten staèí vydìlit stupòem
+vrcholu~$j$ a hledaný prùmìr je na svìtì.
+
+Po~provedení jednoho násobení matic tedy dovedeme pro ka¾dou dvojici vrcholù
+v~konstantním èase spoèítat $D_{ij}$ z~$D'_{ij}$. Jedna úroveò rekurze proto
+trvá $\O(n^\omega)$ a jeliko¾ prùmìr grafu poka¾dé klesne alespoò dvakrát,
+je úrovní $\O(\log n)$ a celý algoritmus dobìhne ve~slíbeném èase $\O(n^\omega\log n)$.
+
\references
\bye