]> mj.ucw.cz Git - ga.git/commitdiff
Dijkstra: Oprava scestného překódování
authorMartin Mares <mj@ucw.cz>
Mon, 27 Nov 2017 14:16:32 +0000 (15:16 +0100)
committerMartin Mares <mj@ucw.cz>
Mon, 27 Nov 2017 14:16:32 +0000 (15:16 +0100)
13-dijkstra/13-dijkstra.tex

index 48b28a49a289fa398c010fdd63f24b50e7a06952..942839d4f0cf205b82b0589349a7387a6689aa6c 100644 (file)
 \input ../sgr.tex
 
-\prednaska{13}{NejkratĹÄ\84Ä\82­ cesty}{}
+\prednaska{13}{Nejkratší cesty}{}
 
 \def\ppsp{1-1}
 \def\sssp{1-$n$}
 \def\apsp{$n$-$n$}
 \def\astar{A\kern-0.15em *}
 
-ProblĂŠm hledĂĄnĂ­ nejkratĹĄĂ­ cesty v~(obvykle ohodnocenĂŠm orientovanĂŠm) grafu
-provÄ\82Ä\84\82­ teorii grafovÄ\82Ë\9dch algoritmĹŻ od~samÄ\82Ë\9dch poÃ\84Â\8dÄ\82Ä\84tkĹŻ. ZÄ\82Ä\84kladnÄ\82­ algoritmy
-pro hledÄ\82Ä\84\82­ cest jsou nedÄ\82­lnou souÃ\84Â\8dÄ\82Ä\84stÄ\82­ zÄ\82Ä\84kladnÄ\82­ch kursĹŻ programovÄ\82Ä\84\82­
-a algoritmĹŻ, my se budeme vÃ\84Â\9bnovat zejmÄ\82Å na rĹŻznÄ\82Ë\9dm jejich vylepĹÄ\84enÄ\82­m.
+Problém hledání nejkratší cesty v~(obvykle ohodnoceném orientovaném) grafu
+provází teorii grafových algoritmů od~samých poÄ\8dátků. Základní algoritmy
+pro hledání cest jsou nedílnou souÄ\8dástí základních kursů programování
+a algoritmů, my se budeme vÄ\9bnovat zejména různým jejich vylepÅ¡ením.
 
-UvaĹžujme tedy nÃ\84Â\9bjakÄ\82Ë\9d orientovanÄ\82Ë\9d graf, jehoĹž kaĹždÄ\82Ä\84 hrana~$e$ je opatĹÂ\99ena
-{\I dÄ\82Å lkou} $\ell(e)\in{\bb R}$. MnoĹžinÃ\84Â\9b hran (tĹÂ\99eba sledu nebo cestÃ\84Â\9b)
-pak pĹ\99\99adĂ­me dĂŠlku rovnou souÄ\8dtu dĂŠlek jednotlivĂ˝ch hran.
+Uvažujme tedy nÄ\9bjaký orientovaný graf, jehož každá hrana~$e$ je opatÅ\99ena
+{\I délkou} $\ell(e)\in{\bb R}$. MnožinÄ\9b hran (tÅ\99eba sledu nebo cestÄ\9b)
+pak přiřadíme délku rovnou součtu délek jednotlivých hran.
 
-Pro vrcholy $u,v$ definujeme jejich {\I vzdÄ\82Ä\84lenost} $d(u,v)$ jako nejmenĹÄ\84Ä\82­
-moĹžnou dÄ\82Å lku cesty z~$u$ do~$v$ (jelikoĹž cest je v~grafu koneÃ\84Â\8d\84Â\9b mnoho,
-minimum vĹždy existuje). Pokud z~$u$ do~$v$ Ä¹Å¾Ä\82Ä\84dnÄ\82Ä\84 cesta nevede, poloĹžÄ\82­me
+Pro vrcholy $u,v$ definujeme jejich {\I vzdálenost} $d(u,v)$ jako nejmenší
+možnou délku cesty z~$u$ do~$v$ (jelikož cest je v~grafu koneÄ\8d\9b mnoho,
+minimum vždy existuje). Pokud z~$u$ do~$v$ Å¾Ã¡dná cesta nevede, položíme
 $d(u,v) := \infty$.
 
-Obvykle se studujĂ­ nĂĄsledujĂ­cĂ­ tĹ\99i problĂŠmy:
+Obvykle se studují následující tři problémy:
 
 \itemize\ibull
-\:{\bo 1-1} neboli {\bo P2PSP} (Point to Point Shortest Path) -- chceme nalÄ\82Å zt nejkratĹÄ\84Ä\82­
-  cestu z~danÄ\82Å ho vrcholu~$u$ do~danÄ\82Å ho vrcholu~$v$. (Pokud je nejkratĹÄ\84Ä\82­ch cest
-  vÄ\82­ce, tak libovolnou z~nich.)
-\:{\bo 1-n} neboli {\bo SSSP} (Single Source Shortest Paths) -- pro danĂ˝ vrchol~$u$ chceme
-  nalĂŠzt nejkratĹĄĂ­ cesty do~vĹĄech ostatnĂ­ch vrcholĹŻ.
-\:{\bo n-n} neboli {\bo APSP} (All Pairs Shortest Paths) -- zajÄ\82­majÄ\82­ nÄ\82Ä\84s nejkratĹÄ\84Ä\82­ cesty
-  mezi vĹĄemi dvojicemi vrcholĹŻ.
+\:{\bo 1-1} neboli {\bo P2PSP} (Point to Point Shortest Path) -- chceme nalézt nejkratší
+  cestu z~daného vrcholu~$u$ do~daného vrcholu~$v$. (Pokud je nejkratších cest
+  více, tak libovolnou z~nich.)
+\:{\bo 1-n} neboli {\bo SSSP} (Single Source Shortest Paths) -- pro daný vrchol~$u$ chceme
+  nalézt nejkratší cesty do~všech ostatních vrcholů.
+\:{\bo n-n} neboli {\bo APSP} (All Pairs Shortest Paths) -- zajímají nás nejkratší cesty
+  mezi všemi dvojicemi vrcholů.
 \endlist
 
-PĹÂ\99ekvapivÃ\84Â\9b, tak obecnÃ\84Â\9b, jak jsme si uvedenÄ\82Å  problÄ\82Å my definovali, je neumÄ\82­me
-Ĺ\99eĹĄit v~polynomiĂĄlnĂ­m Ä\8dase: pro grafy, kterĂŠ mohou obsahovat hrany zĂĄpornĂ˝ch
-dĂŠlek bez jakĂ˝chkoliv omezenĂ­, je totiĹž hledĂĄnĂ­ nejkratĹĄĂ­ cesty NP-tÄ\9bĹžkĂŠ
-(lze na~nÄ\9bj snadno pĹ\99evĂŠst existenci hamiltonovskĂŠ cesty). VĹĄechny znĂĄmĂŠ
-polynomiÄ\82Ä\84lnÄ\82­ algoritmy totiĹž mÄ\82­sto nejkratĹÄ\84Ä\82­ cesty hledajÄ\82­ nejkratĹÄ\84Ä\82­ sled
--- nijak nekontrolujĂ­, zda cesta neprojde jednĂ­m vrcholem vĂ­cekrĂĄt.
-
-NaĹĄtÄ\9bstĂ­ pro nĂĄs je to v~grafech bez cyklĹŻ zĂĄpornĂŠ dĂŠlky totĂŠĹž: pokud se
-v~nalezenÄ\82Å m sledu vyskytne cyklus, mĹŻĹžeme jej \uv{vystĹÂ\99ihnout} a tÄ\82­m zÄ\82­skat
-sled, kterÄ\82Ë\9d nenÄ\82­ delĹÄ\84Ä\82­ a~kterÄ\82Ë\9d mÄ\82Ä\84 mÄ\82Å nÃ\84Â\9b hran. KaĹždÄ\82Ë\9d nejkratĹÄ\84Ä\82­ sled tak
-mĹŻĹžeme upravit na~stejnÃ\84Â\9b dlouhou cestu.
-V~grafech bez zĂĄpornĂ˝ch cyklĹŻ je tedy jedno, zda hledĂĄme sled nebo cestu;
-naopak vyskytne-li se zÄ\82Ä\84pornÄ\82Ë\9d cyklus dosaĹžitelnÄ\82Ë\9d z~poÃ\84Â\8dÄ\82Ä\84teÃ\84Â\8d\82­ho vrcholu,
-nejkratĹÄ\84Ä\82­ sled ani neexistuje.
-
-NavÄ\82­c se nÄ\82Ä\84m bude hodit, Ä¹Å¾e kaĹždÄ\82Ë\9d prefix nejkratĹÄ\84Ä\82­ cesty je opÃ\84Â\9bt nejkratĹÄ\84Ä\82­
-cesta. JinÄ\82Ë\9dmi slovy pokud nÃ\84Â\9bkterÄ\82Ä\84 z~nejkratĹÄ\84Ä\82­ch cest z~$u$ do~$v$ vede
-pĹÂ\99es nÃ\84Â\9bjakÄ\82Ë\9d vrchol~$w$, pak jejÄ\82­ Ã\84Â\8dÄ\82Ä\84st z~$u$ do~$w$ je jednou z~nejkratĹÄ\84Ä\82­ch
-cest z~$u$ do~$w$. (V~opaÃ\84Â\8d\82Å m pĹÂ\99Ä\82­padÃ\84Â\9b bychom mohli Ä\82Å\9fsek $u\ldots w$ vymÃ\84Â\9bnit za~kratĹÄ\84Ä\82­.)
-
-DĂ­ky tĂŠto {\I prefixovĂŠ vlastnosti} mĹŻĹžeme pro kaĹždĂ˝ vrchol~$u$ sestrojit jeho {\I strom
-nejkratĹĄĂ­ch cest}~${\cal T}(u)$. To je nÄ\9bjakĂ˝ podgraf grafu~$G$, kterĂ˝ mĂĄ tvar
-stromu zakoĹ\99enÄ\9bnĂŠho v~$u$ a orientovanĂŠho smÄ\9brem od~koĹ\99ene, a~platĂ­ pro nÄ\9bj, Ĺže
-pro kaĹždĂ˝ vrchol~$v$ je (jedinĂĄ) cesta z~$u$ do~$v$ v~tomto stromu jednou
-z~nejkratĹÄ\84Ä\82­ch cest z~$u$ do~$v$ v~pĹŻvodnÄ\82­m grafu.
-
-\s{PozorovĂĄnĂ­:} Strom nejkratĹĄĂ­ch cest vĹždy existuje.
+PÅ\99ekvapivÄ\9b, tak obecnÄ\9b, jak jsme si uvedené problémy definovali, je neumíme
+řešit v~polynomiálním čase: pro grafy, které mohou obsahovat hrany záporných
+délek bez jakýchkoliv omezení, je totiž hledání nejkratší cesty NP-těžké
+(lze na~něj snadno převést existenci hamiltonovské cesty). Všechny známé
+polynomiální algoritmy totiž místo nejkratší cesty hledají nejkratší sled
+-- nijak nekontrolují, zda cesta neprojde jedním vrcholem vícekrát.
+
+Naštěstí pro nás je to v~grafech bez cyklů záporné délky totéž: pokud se
+v~nalezeném sledu vyskytne cyklus, můžeme jej \uv{vystÅ\99ihnout} a tím získat
+sled, který není delší a~který má ménÄ\9b hran. Každý nejkratší sled tak
+můžeme upravit na~stejnÄ\9b dlouhou cestu.
+V~grafech bez záporných cyklů je tedy jedno, zda hledáme sled nebo cestu;
+naopak vyskytne-li se záporný cyklus dosažitelný z~poÄ\8dáteÄ\8d­ho vrcholu,
+nejkratší sled ani neexistuje.
+
+Navíc se nám bude hodit, Å¾e každý prefix nejkratší cesty je opÄ\9bt nejkratší
+cesta. Jinými slovy pokud nÄ\9bkterá z~nejkratších cest z~$u$ do~$v$ vede
+pÅ\99es nÄ\9bjaký vrchol~$w$, pak její Ä\8dást z~$u$ do~$w$ je jednou z~nejkratších
+cest z~$u$ do~$w$. (V~opaÄ\8dném pÅ\99ípadÄ\9b bychom mohli Ãºsek $u\ldots w$ vymÄ\9bnit za~kratší.)
+
+Díky této {\I prefixové vlastnosti} můžeme pro každý vrchol~$u$ sestrojit jeho {\I strom
+nejkratších cest}~${\cal T}(u)$. To je nějaký podgraf grafu~$G$, který má tvar
+stromu zakořeněného v~$u$ a orientovaného směrem od~kořene, a~platí pro něj, že
+pro každý vrchol~$v$ je (jediná) cesta z~$u$ do~$v$ v~tomto stromu jednou
+z~nejkratších cest z~$u$ do~$v$ v~původním grafu.
+
+\s{Pozorování:} Strom nejkratších cest vždy existuje.
 
 \proof
-NechĹĽ $u=v_1,\ldots,v_n$ jsou vĹÄ\84echny vrcholy grafu~$G$. IndukcÄ\82­ budeme
-dokazovat, Ä¹Å¾e pro kaĹždÄ\82Å ~$i$ existuje strom~${\cal T}_i$, v~nÃ\84Â\9bmĹž se nachÄ\82Ä\84zejÄ\82­ nejkratĹÄ\84Ä\82­
-cesty z~vrcholu~$u$ do vrcholĹŻ $v_1,\ldots,v_i$. Pro $i=1$ staÄ\8dĂ­ uvĂĄĹžit
-strom obsahujÄ\82­cÄ\82­ jedinÄ\82Ë\9d vrchol~$u$. Ze~stromu ${\cal T}_{i-1}$ pak vyrobÄ\82­me
-strom ${\cal T}_i$ takto: Nalezneme v~$G$ nejkratĹÄ\84Ä\82­ cestu z~$u$ do~$v_i$
-a oznaÃ\84Â\8dÄ\82­me~$z$ poslednÄ\82­ vrchol na~tÄ\82Å to cestÃ\84Â\9b, kterÄ\82Ë\9d se jeĹÄ\84\84Â\9b vyskytuje v~${\cal T}_{i-1}$.
-Ă\9asek nejkratĹĄĂ­ cesty od~$z$ do~$v_i$ pak pĹ\99idĂĄme do~${\cal T}_{i-1}$
-a dĂ­ky prefixovĂŠ vlastnosti bude i cesta z~$u$ do~$v_i$ v~novĂŠm stromu
-nejkratĹÄ\84Ä\82­.
+NechÅ¥ $u=v_1,\ldots,v_n$ jsou vÅ¡echny vrcholy grafu~$G$. Indukcí budeme
+dokazovat, Å¾e pro každé~$i$ existuje strom~${\cal T}_i$, v~nÄ\9bmž se nacházejí nejkratší
+cesty z~vrcholu~$u$ do vrcholů $v_1,\ldots,v_i$. Pro $i=1$ stačí uvážit
+strom obsahující jediný vrchol~$u$. Ze~stromu ${\cal T}_{i-1}$ pak vyrobíme
+strom ${\cal T}_i$ takto: Nalezneme v~$G$ nejkratší cestu z~$u$ do~$v_i$
+a oznaÄ\8díme~$z$ poslední vrchol na~této cestÄ\9b, který se jeÅ¡tÄ\9b vyskytuje v~${\cal T}_{i-1}$.
+Úsek nejkratší cesty od~$z$ do~$v_i$ pak přidáme do~${\cal T}_{i-1}$
+a díky prefixové vlastnosti bude i cesta z~$u$ do~$v_i$ v~novém stromu
+nejkratší.
 \qed
 
-ZbĂ˝vĂĄ se dohodnout, v~jakĂŠm tvaru majĂ­ naĹĄe algoritmy vydĂĄvat vĂ˝sledek.
-U~problĂŠmĹŻ typu \ppsp{} je nejjednoduĹĄĹĄĂ­ vypsat celou cestu, u~\sssp{} mĹŻĹžeme jako vĂ˝stup
-vydat strom nejkratĹÄ\84Ä\82­ch cest z~danÄ\82Å ho poÃ\84Â\8dÄ\82Ä\84tku (vĹÄ\84imnÃ\84Â\9bte si, Ä¹Å¾e staÃ\84Â\8dÄ\82­
-uvÄ\82Å st pĹÂ\99edchĹŻdce kaĹždÄ\82Å ho vrcholu), u~\apsp{} vydÄ\82Ä\84me strom nejkratĹÄ\84Ä\82­ch cest
-pro kaĹždĂ˝ ze~zdrojovĂ˝ch vrcholĹŻ.
+Zbývá se dohodnout, v~jakém tvaru mají naše algoritmy vydávat výsledek.
+U~problémů typu \ppsp{} je nejjednodušší vypsat celou cestu, u~\sssp{} můžeme jako výstup
+vydat strom nejkratších cest z~daného poÄ\8dátku (vÅ¡imnÄ\9bte si, Å¾e staÄ\8dí
+uvést pÅ\99edchůdce každého vrcholu), u~\apsp{} vydáme strom nejkratších cest
+pro každý ze~zdrojových vrcholů.
 
-Ä\8casto se ovĹĄem ukĂĄĹže, Ĺže podstatnĂĄ Ä\8dĂĄst problĂŠmu se skrĂ˝vĂĄ v~samotnĂŠm
-vÄ\82Ë\9dpoÃ\84Â\8dtu vzdÄ\82Ä\84lenostÄ\82­ a sestrojenÄ\82­ pĹÂ\99edchĹŻdcĹŻ je triviÄ\82Ä\84lnÄ\82­m rozĹÄ\84Ä\82­ĹÂ\99enÄ\82­m algoritmu.
-Budeme tedy obvykle jen poÄ\8dĂ­tat vzdĂĄlenosti a samotnou rekonstrukci cest
-ponechÄ\82Ä\84me Ã\84Â\8dtenÄ\82Ä\84ĹÂ\99i jako snadnÄ\82Å  cviÃ\84Â\8denÄ\82­.
+Často se ovšem ukáže, že podstatná část problému se skrývá v~samotném
+výpoÄ\8dtu vzdáleností a sestrojení pÅ\99edchůdců je triviálním rozšíÅ\99ením algoritmu.
+Budeme tedy obvykle jen počítat vzdálenosti a samotnou rekonstrukci cest
+ponecháme Ä\8dtenáÅ\99i jako snadné cviÄ\8dení.
 
-\h{RelaxaÃ\84Â\8d\82­ algoritmus}
+\h{RelaxaÄ\8d­ algoritmus}
 
-ZaÄ\8d\9bme problĂŠmem \sssp{} a oznaÄ\8dme~$u$ vĂ˝chozĂ­ vrchol. VÄ\9btĹĄina znĂĄmĂ˝ch
-algoritmĹŻ funguje tak, Ä¹Å¾e pro kaĹždÄ\82Ë\9d vrchol~$v$ udrĹžujÄ\82­ ohodnocenÄ\82­ $h(v)$,
-kterÄ\82Å  v~kaĹždÄ\82Å m okamĹžiku odpovÄ\82­dÄ\82Ä\84 dÄ\82Å lce nÃ\84Â\9bjakÄ\82Å ho sledu z~$u$ do~$v$. PostupnÃ\84Â\9b
-toto ohodnocenĂ­ upravujĂ­, aĹž se z~nÄ\9bj stane vzdĂĄlenost $d(u,v)$ a algoritmus
-se mĹŻĹže zastavit.
+Začněme problémem \sssp{} a označme~$u$ výchozí vrchol. Většina známých
+algoritmů funguje tak, Å¾e pro každý vrchol~$v$ udržují ohodnocení $h(v)$,
+které v~každém okamžiku odpovídá délce nÄ\9bjakého sledu z~$u$ do~$v$. PostupnÄ\9b
+toto ohodnocení upravují, až se z~něj stane vzdálenost $d(u,v)$ a algoritmus
+se může zastavit.
 
-Vhodnou operacĂ­ pro vylepĹĄovĂĄnĂ­ ohodnocenĂ­ je takzvanĂĄ {\I relaxace.}
-Vybereme si nÄ\9bjakĂ˝ vrchol~$v$ a pro vĹĄechny jeho sousedy~$w$ spoÄ\8dĂ­tĂĄme
-$h(v) + \ell(v,w)$, tedy dÄ\82Å lku sledu, kterÄ\82Ë\9d vznikne rozĹÄ\84Ä\82­ĹÂ\99enÄ\82­m aktuÄ\82Ä\84lnÄ\82­ho
-sledu do~$v$ o~hranu $(v,w)$. Pokud je tato hodnota menĹĄĂ­ neĹž~$h(w)$,
-tak jĂ­ $h(w)$ pĹ\99epĂ­ĹĄeme.
+Vhodnou operací pro vylepšování ohodnocení je takzvaná {\I relaxace.}
+Vybereme si nějaký vrchol~$v$ a pro všechny jeho sousedy~$w$ spočítáme
+$h(v) + \ell(v,w)$, tedy délku sledu, který vznikne rozšíÅ\99ením aktuálního
+sledu do~$v$ o~hranu $(v,w)$. Pokud je tato hodnota menší než~$h(w)$,
+tak jí $h(w)$ přepíšeme.
 
-Abychom zabrÄ\82Ä\84nili opakovanÄ\82Ë\9dm relaxacÄ\82­m tÄ\82Å hoĹž vrcholu, kterÄ\82Å  nic nezmÃ\84Â\9b\82­,
-budeme rozliĹÄ\84ovat tĹÂ\99i stavy vrcholĹŻ: {\I nevidÃ\84Â\9bn} (jeĹÄ\84\84Â\9b jsme ho nenavĹÄ\84\82­vili),
-{\I otevĹÂ\99en} (zmÃ\84Â\9bnilo se ohodnocenÄ\82­, Ã\84Â\8dasem chceme relaxovat) a {\I uzavĹÂ\99en}
-(uĹž jsme relaxovali a nenÄ\82­ potĹÂ\99eba znovu).
+Abychom zabránili opakovaným relaxacím téhož vrcholu, které nic nezmÄ\9b­,
+budeme rozliÅ¡ovat tÅ\99i stavy vrcholů: {\I nevidÄ\9bn} (jeÅ¡tÄ\9b jsme ho nenavÅ¡tívili),
+{\I otevÅ\99en} (zmÄ\9bnilo se ohodnocení, Ä\8dasem chceme relaxovat) a {\I uzavÅ\99en}
+(už jsme relaxovali a není potÅ\99eba znovu).
 
-NÄ\82Ä\84ĹÄ\84 algoritmus bude fungovat nÄ\82Ä\84sledovnÃ\84Â\9b:
+Náš algoritmus bude fungovat následovnÄ\9b:
 
 \algo
 \:$h(*)\leftarrow \infty$, $h(u)\leftarrow 0$.
-\:$\<stav>(*)\leftarrow\<nevidÃ\84Â\9bn>$, $\<stav>(u)\leftarrow\<otevĹÂ\99en>$.
-\:Dokud existujĂ­ otevĹ\99enĂŠ vrcholy, opakujeme:
-\::$v\leftarrow\hbox{libovolnĂ˝ otevĹ\99enĂ˝ vrchol}$.
-\::$\<stav>(v)\leftarrow\<uzavĹÂ\99en>$.
+\:$\<stav>(*)\leftarrow\<nevidÄ\9bn>$, $\<stav>(u)\leftarrow\<otevÅ\99en>$.
+\:Dokud existují otevřené vrcholy, opakujeme:
+\::$v\leftarrow\hbox{libovolný otevřený vrchol}$.
+\::$\<stav>(v)\leftarrow\<uzavÅ\99en>$.
 \::Relaxujeme~$v$:
-\:::Pro vĹĄechny hrany $vw$ opakujeme:
+\:::Pro všechny hrany $vw$ opakujeme:
 \::::Je-li $h(w) > h(v) + \ell(v,w)$:
 \:::::$h(w)\leftarrow h(v) + \ell(v,w)$.
-\:::::$\<stav>(w)\leftarrow\<otevĹÂ\99en>$.
-\:VrĂĄtĂ­me vĂ˝sledek $d(u,v)=h(v)$ pro vĹĄechna~$v$.
+\:::::$\<stav>(w)\leftarrow\<otevÅ\99en>$.
+\:Vrátíme výsledek $d(u,v)=h(v)$ pro všechna~$v$.
 \endalgo
 
-PodobnÄ\9b jako u~minimĂĄlnĂ­ch koster, i zde se jednĂĄ o~meta-algoritmus, protoĹže
-v~kroku~4 nespecifikuje, kterÄ\82Ë\9d z~otevĹÂ\99enÄ\82Ë\9dch vrcholĹŻ vybÄ\82­rÄ\82Ä\84. PĹÂ\99esto
-ale mĹŻĹžeme dokĂĄzat nÄ\9bkolik zajĂ­mavĂ˝ch tvrzenĂ­, kterĂĄ na~konkrĂŠtnĂ­m zpĹŻsobu
-vÄ\82Ë\9d\84Â\9bru nezÄ\82Ä\84visejÄ\82­.
+Podobně jako u~minimálních koster, i zde se jedná o~meta-algoritmus, protože
+v~kroku~4 nespecifikuje, který z~otevÅ\99ených vrcholů vybírá. PÅ\99esto
+ale můžeme dokázat několik zajímavých tvrzení, která na~konkrétním způsobu
+výbÄ\9bru nezávisejí.
 
-\s{VÄ\9bta:} SpustĂ­me-li meta-algoritmus na graf bez zĂĄpornĂ˝ch cyklĹŻ, pak:
+\s{Věta:} Spustíme-li meta-algoritmus na graf bez záporných cyklů, pak:
 
 \numlist\nparen
-\:OhodnocenĂ­ $h(v)$ vĹždy odpovĂ­dĂĄ dĂŠlce nÄ\9bjakĂŠho sledu z~$u$ do~$v$.
-\:$h(v)$ dokonce odpovĂ­dĂĄ dĂŠlce nÄ\9bjakĂŠ cesty z~$u$ do~$v$.
-\:Algoritmus se vĹždy zastavÄ\82­.
-\:Po zastavenĂ­ jsou oznaÄ\8deny jako uzavĹ\99enĂŠ prĂĄvÄ\9b ty vrcholy, kterĂŠ jsou dosaĹžitelnĂŠ z~$u$.
-\:Po zastavenĂ­ majĂ­ koneÄ\8dnĂŠ~$h(v)$ prĂĄvÄ\9b vĹĄechny uzavĹ\99enĂŠ vrcholy.
-\:Pro kaĹždĂ˝ dosaĹžitelnĂ˝ vrchol je na~konci $h(v)$ rovno $d(u,v)$.
+\:Ohodnocení $h(v)$ vždy odpovídá délce nějakého sledu z~$u$ do~$v$.
+\:$h(v)$ dokonce odpovídá délce nějaké cesty z~$u$ do~$v$.
+\:Algoritmus se vždy zastaví.
+\:Po zastavení jsou označeny jako uzavřené právě ty vrcholy, které jsou dosažitelné z~$u$.
+\:Po zastavení mají konečné~$h(v)$ právě všechny uzavřené vrcholy.
+\:Pro každý dosažitelný vrchol je na~konci $h(v)$ rovno $d(u,v)$.
 \endlist
 
 \proof
 
 \numlist\nparen
-\:DokĂĄĹžeme indukcĂ­ podle poÄ\8dtu krokĹŻ algoritmu.
-\:StaÄ\8dĂ­ rozmyslet, v~jakĂŠ situaci by vytvoĹ\99enĂ˝ sled mohl obsahovat cyklus.
-\:Cest, a~tÄ\82­m pÄ\82Ä\84dem i moĹžnÄ\82Ë\9dch hodnot~$h(v)$ pro kaĹždÄ\82Ë\9d~$v$, je koneÃ\84Â\8d\84Â\9b mnoho.
-\:Implikace $\Rightarrow$ je triviĂĄlnĂ­, pro $\Leftarrow$ staÄ\8dĂ­ uvĂĄĹžit neuzavĹ\99enĂ˝ vrchol,
-  kterÄ\82Ë\9d je dosaĹžitelnÄ\82Ë\9d z~$u$ cestou o~co nejmenĹÄ\84Ä\82­m poÃ\84Â\8dtu hran.
-\:$h(v)$ nastavujeme na~koneÄ\8dnou hodnotu prĂĄvÄ\9b v~okamĹžicĂ­ch, kdy se vrchol stĂĄvĂĄ otevĹ\99enĂ˝m.
-  KaĹždÄ\82Ë\9d otevĹÂ\99enÄ\82Ë\9d vrchol je Ã\84Â\8dasem uzavĹÂ\99en.
+\:Dokážeme indukcí podle počtu kroků algoritmu.
+\:Stačí rozmyslet, v~jaké situaci by vytvořený sled mohl obsahovat cyklus.
+\:Cest, a~tím pádem i možných hodnot~$h(v)$ pro každý~$v$, je koneÄ\8d\9b mnoho.
+\:Implikace $\Rightarrow$ je triviální, pro $\Leftarrow$ stačí uvážit neuzavřený vrchol,
+  který je dosažitelný z~$u$ cestou o~co nejmenším poÄ\8dtu hran.
+\:$h(v)$ nastavujeme na~konečnou hodnotu právě v~okamžicích, kdy se vrchol stává otevřeným.
+  Každý otevÅ\99ený vrchol je Ä\8dasem uzavÅ\99en.
 \:Kdyby tomu tak nebylo,
-  vyberme si ze~\uv{ĹÄ\84patnÄ\82Ë\9dch} vrcholĹŻ~$v$ takovÄ\82Ë\9d, pro nÃ\84Â\9bjĹž obsahuje nejkratĹÄ\84Ä\82­ cesta z~$u$ do~$v$
-  nejmenĹĄĂ­ moĹžnĂ˝ poÄ\8det hran. Vrchol~$v$ je zajistĂŠ rĹŻznĂ˝ od~$u$, takĹže mĂĄ na~tĂŠto cestÄ\9b nÄ\9bjakĂŠho
-  pĹÂ\99edchĹŻdce~$w$. PĹÂ\99itom~$w$ uĹž musÄ\82­ bÄ\82Ë\9dt ohodnocen sprÄ\82Ä\84vnÃ\84Â\9b a relaxace, kterÄ\82Ä\84 mu toto ohodnocenÄ\82­
-  nastavila, ho musela prohlÄ\82Ä\84sit za~otevĹÂ\99enÄ\82Ë\9d. JenĹže kaĹždÄ\82Ë\9d otevĹÂ\99enÄ\82Ë\9d vrchol je pozdÃ\84Â\9bji uzavĹÂ\99en,
-  takĹže~$w$ potĂŠ musel bĂ˝t jeĹĄtÄ\9b alespoĹ\88 jednou relaxovĂĄn, coĹž muselo snĂ­Ĺžit~$h(v)$ na sprĂĄvnou
-  vzdĂĄlenost.
+  vyberme si ze~\uv{Å¡patných} vrcholů~$v$ takový, pro nÄ\9bjž obsahuje nejkratší cesta z~$u$ do~$v$
+  nejmenší možný počet hran. Vrchol~$v$ je zajisté různý od~$u$, takže má na~této cestě nějakého
+  pÅ\99edchůdce~$w$. PÅ\99itom~$w$ už musí být ohodnocen správnÄ\9b a relaxace, která mu toto ohodnocení
+  nastavila, ho musela prohlásit za~otevÅ\99ený. Jenže každý otevÅ\99ený vrchol je pozdÄ\9bji uzavÅ\99en,
+  takže~$w$ poté musel být ještě alespoň jednou relaxován, což muselo snížit~$h(v)$ na správnou
+  vzdálenost.
 \qeditem
 \endlist
 
-\>DokĂĄzali jsme tedy, Ĺže meta-algoritmus pro libovolnou implementaci kroku~4
-spoÄ\8dĂ­tĂĄ sprĂĄvnĂŠ vzdĂĄlenosti.
+\>Dokázali jsme tedy, že meta-algoritmus pro libovolnou implementaci kroku~4
+spočítá správné vzdálenosti.
 
 \medskip
 
-\s{CviÃ\84Â\8denÄ\82­:}
+\s{CviÄ\8dení:}
 \itemize\ibull
-\:NechĹĽ do algoritmu doplnĂ­me udrĹžovĂĄnĂ­ pĹ\99edchĹŻdcĹŻ tak, Ĺže v~kroku~9
-  pĹ\99enastavĂ­me pĹ\99edchĹŻdce vrcholu~$w$ na vrchol~$v$. DokaĹžte, Ĺže pĹ\99edchĹŻdci
-  dosaĹžitelnĂ˝ch vrcholĹŻ budou tvoĹ\99it strom a Ĺže tento strom bude stromem
-  nejkratĹÄ\84Ä\82­ch cest z~vrcholu~$u$.
-\:DokaĹžte, Ĺže pro graf, v~nÄ\9bmĹž je alespoĹ\88 jeden zĂĄpornĂ˝ cyklus dosaĹžitelnĂ˝
-  z~poÄ\8dĂĄteÄ\8dnĂ­ho vrcholu, se algoritmus nezastavĂ­ a ohodnocenĂ­ vĹĄech vrcholĹŻ
-  na cyklu postupnÄ\9b klesnou libovolnÄ\9b hluboko. NedosaĹžitelnĂŠ zĂĄpornĂŠ cykly
-  chod algoritmu samozĹÂ\99ejmÃ\84Â\9b nijak neovlivnÄ\82­.
+\:Nechť do algoritmu doplníme udržování předchůdců tak, že v~kroku~9
+  přenastavíme předchůdce vrcholu~$w$ na vrchol~$v$. Dokažte, že předchůdci
+  dosažitelných vrcholů budou tvořit strom a že tento strom bude stromem
+  nejkratších cest z~vrcholu~$u$.
+\:Dokažte, že pro graf, v~němž je alespoň jeden záporný cyklus dosažitelný
+  z~počátečního vrcholu, se algoritmus nezastaví a ohodnocení všech vrcholů
+  na cyklu postupně klesnou libovolně hluboko. Nedosažitelné záporné cykly
+  chod algoritmu samozÅ\99ejmÄ\9b nijak neovlivní.
 \endlist
 
-\h{BellmanĹŻv-FordĹŻv-MooreĹŻv algoritmus}
+\h{Bellmanův-Fordův-Mooreův algoritmus}
 
-Bellman \cite{bellman:bfm}, Ford \cite{ford:bfm} a Moore objevili nezÄ\82Ä\84visle na sobÃ\84Â\9b algoritmus (ĹÂ\99Ä\82­kejme mu BFM),
-kterĂ˝ lze v~Ĺ\99\8di naĹĄeho meta-algoritmu formulovat takto: OtevĹ\99enĂŠ vrcholy
-udrĹžujeme ve~frontÄ\9b (vĹždy relaxujeme vrchol na poÄ\8dĂĄtku fronty, novÄ\9b otevĂ­ranĂŠ
-zaĹÂ\99azujeme na~konec). Co toto pravidlo zpĹŻsobÄ\82­?
+Bellman \cite{bellman:bfm}, Ford \cite{ford:bfm} a Moore objevili nezávisle na sobÄ\9b algoritmus (Å\99íkejme mu BFM),
+který lze v~řeči našeho meta-algoritmu formulovat takto: Otevřené vrcholy
+udržujeme ve~frontě (vždy relaxujeme vrchol na počátku fronty, nově otevírané
+zaÅ\99azujeme na~konec). Co toto pravidlo způsobí?
 
-\s{VÃ\84Â\9bta:} Ã\84Â\8casovÄ\82Ä\84 sloĹžitost algoritmu~BFM Ã\84Â\8dinÄ\82­ $\O(nm)$.
+\s{VÄ\9bta:} Ä\8casová složitost algoritmu~BFM Ä\8diní $\O(nm)$.
 
 \proof
-BÃ\84Â\9bh algoritmu rozdÃ\84Â\9b\82­me na~fÄ\82Ä\84ze. NultÄ\82Ä\84 fÄ\82Ä\84ze sestÄ\82Ä\84\82Ä\84 z~vloĹženÄ\82­ vrcholu~$u$
-do~fronty. V~$(i+1)$-nĂ­ fĂĄzi relaxujeme ty vrcholy, kterĂŠ byly do~fronty
-uloĹženy bÄ\9bhem $i$-tĂŠ fĂĄze.
-
-JelikoĹž relaxace vrcholu trvĂĄ lineĂĄrnÄ\9b se stupnÄ\9bm vrcholu a kaĹždĂ˝ vrchol
-se danĂŠ fĂĄze ĂşÄ\8dastnĂ­ nejvýťe jednou, trvĂĄ jedna fĂĄze $\O(m)$. ZbĂ˝vĂĄ ukĂĄzat,
-Ĺže fĂĄzĂ­ provedeme nejvýťe~$n$.
-
-IndukcÄ\82­ dokÄ\82Ä\84Ĺžeme, Ä¹Å¾e na konci $i$-tÄ\82Å  fÄ\82Ä\84ze je kaĹždÄ\82Å  ohodnocenÄ\82­ $h(v)$ shora omezeno
-dÄ\82Å lkou nejkratĹÄ\84Ä\82­ho z~$uv$-sledĹŻ o~nejvÄ\82Ë\9dĹÄ\84e~$i$ hranÄ\82Ä\84ch. Pro $i=0$ to triviÄ\82Ä\84lnÃ\84Â\9b
-platÄ\82­. UvaĹžujme nynÄ\82­ vrchol~$v$ na konci $(i+1)$-nÄ\82­ fÄ\82Ä\84ze a nÃ\84Â\9bjakÄ\82Ë\9d nejkratĹÄ\84Ä\82­ $uv$-sled~$P$
-o~$i+1$ hranĂĄch. OznaÄ\8dme $wv$ poslednĂ­ hranu tohoto sledu a $P'$ sled bez tĂŠto hrany,
-kterĂ˝ tedy mĂĄ dĂŠlku~$i$. Podle indukÄ\8dnĂ­ho pĹ\99edpokladu je na konci $i$-tĂŠ fĂĄze
-$h(w)\le \ell(P')$. Tuto hodnotu zÄ\82­skalo $h(w)$ nejpozdÃ\84Â\9bji v~$i$-tÄ\82Å  fÄ\82Ä\84zi, pĹÂ\99i tom jsme
-vrchol~$w$ otevĹÂ\99eli, takĹže jsme ho nejpozdÃ\84Â\9bji v~$(i+1)$-nÄ\82­ fÄ\82Ä\84zi zavĹÂ\99eli a relaxovali.
-Po tĂŠto relaxaci je ovĹĄem $h(v)\le h(w)+\ell(w,v)\le \ell(P') + \ell(w,v) = \ell(P)$.
+BÄ\9bh algoritmu rozdÄ\9blíme na~fáze. Nultá fáze sestává z~vložení vrcholu~$u$
+do~fronty. V~$(i+1)$-ní fázi relaxujeme ty vrcholy, které byly do~fronty
+uloženy během $i$-té fáze.
+
+Jelikož relaxace vrcholu trvá lineárně se stupněm vrcholu a každý vrchol
+se dané fáze účastní nejvýše jednou, trvá jedna fáze $\O(m)$. Zbývá ukázat,
+že fází provedeme nejvýše~$n$.
+
+Indukcí dokážeme, Å¾e na konci $i$-té fáze je každé ohodnocení $h(v)$ shora omezeno
+délkou nejkratšího z~$uv$-sledů o~nejvýše~$i$ hranách. Pro $i=0$ to triviálnÄ\9b
+platí. Uvažujme nyní vrchol~$v$ na konci $(i+1)$-ní fáze a nÄ\9bjaký nejkratší $uv$-sled~$P$
+o~$i+1$ hranách. Označme $wv$ poslední hranu tohoto sledu a $P'$ sled bez této hrany,
+který tedy má délku~$i$. Podle indukčního předpokladu je na konci $i$-té fáze
+$h(w)\le \ell(P')$. Tuto hodnotu získalo $h(w)$ nejpozdÄ\9bji v~$i$-té fázi, pÅ\99i tom jsme
+vrchol~$w$ otevÅ\99eli, takže jsme ho nejpozdÄ\9bji v~$(i+1)$-ní fázi zavÅ\99eli a relaxovali.
+Po této relaxaci je ovšem $h(v)\le h(w)+\ell(w,v)\le \ell(P') + \ell(w,v) = \ell(P)$.
 \qed
 
-\s{CviÃ\84Â\8denÄ\82­:}
+\s{CviÄ\8dení:}
 \itemize\ibull
-\:UkaĹžte, Ĺže asymptoticky stejnĂŠ Ä\8dasovĂŠ sloĹžitosti by dosĂĄhl algoritmus,
-  kterÄ\82Ë\9d by vrcholy oÃ\84Â\8dÄ\82­sloval $v_1,\ldots,v_n$ a opakovanÃ\84Â\9b by je v~tomto
-  poĹÂ\99adÄ\82­ relaxoval tak dlouho, dokud by se ohodnocenÄ\82­ mÃ\84Â\9bnila.
-\:Jak algoritmus upravit, aby v~$i$-tĂŠ fĂĄzi spoÄ\8dĂ­tal minimĂĄlnĂ­ dĂŠlky sledĹŻ
-  o~prĂĄvÄ\9b~$i$ hranĂĄch?
-\:Jak lze algoritmus BFM vyuŞít k~nalezenĂ­ zĂĄpornĂŠho cyklu?
+\:Ukažte, že asymptoticky stejné časové složitosti by dosáhl algoritmus,
+  který by vrcholy oÄ\8dísloval $v_1,\ldots,v_n$ a opakovanÄ\9b by je v~tomto
+  poÅ\99adí relaxoval tak dlouho, dokud by se ohodnocení mÄ\9bnila.
+\:Jak algoritmus upravit, aby v~$i$-té fázi spočítal minimální délky sledů
+  o~právě~$i$ hranách?
+\:Jak lze algoritmus BFM využít k~nalezení záporného cyklu?
 \endlist
 
-\h{DijkstrĹŻv algoritmus}
+\h{Dijkstrův algoritmus}
 
-Pokud jsou vĹÄ\84echny dÄ\82Å lky hran nezÄ\82Ä\84pornÄ\82Å , mĹŻĹžeme pouĹžÄ\82­t efektivnÃ\84Â\9bjĹÄ\84Ä\82­ pravidlo
-pro vĂ˝bÄ\9br vrcholu navrĹženĂŠ Dijkstrou \cite{dijkstra:mstandpath}. To Ĺ\99Ă­kĂĄ, Ĺže vĹždy relaxujeme ten z~otevĹ\99enĂ˝ch
-vrcholĹŻ, jehoĹž ohodnocenÄ\82­ je nejmenĹÄ\84Ä\82­.
+Pokud jsou vÅ¡echny délky hran nezáporné, můžeme použít efektivnÄ\9bjší pravidlo
+pro výběr vrcholu navržené Dijkstrou \cite{dijkstra:mstandpath}. To říká, že vždy relaxujeme ten z~otevřených
+vrcholů, jehož ohodnocení je nejmenší.
 
-\s{VÃ\84Â\9bta:} DijkstrĹŻv algoritmus uzavÄ\82­rÄ\82Ä\84 vrcholy v~poĹÂ\99adÄ\82­ podle neklesajÄ\82­cÄ\82­
-vzdÄ\82Ä\84lenosti od~$u$ a kaĹždÄ\82Ë\9d dosaĹžitelnÄ\82Ë\9d vrchol uzavĹÂ\99e prÄ\82Ä\84\84Â\9b jednou.
+\s{VÄ\9bta:} Dijkstrův algoritmus uzavírá vrcholy v~poÅ\99adí podle neklesající
+vzdálenosti od~$u$ a každý dosažitelný vrchol uzavÅ\99e právÄ\9b jednou.
 
 \proof
-IndukcÄ\82­ dokÄ\82Ä\84Ĺžeme, Ä¹Å¾e v~kaĹždÄ\82Å m okamĹžiku majÄ\82­ vĹÄ\84echny uzavĹÂ\99enÄ\82Å  vrcholy ohodnocenÄ\82­
-menĹÄ\84Ä\82­ nebo rovnÄ\82Å  ohodnocenÄ\82­m vĹÄ\84ech otevĹÂ\99enÄ\82Ë\9dch vrcholĹŻ. Na~poÃ\84Â\8dÄ\82Ä\84tku to jistÃ\84Â\9b platÄ\82­.
-NechĹĽ nynÄ\82­ uzavÄ\82­rÄ\82Ä\84me vrchol~$v$ s~minimÄ\82Ä\84lnÄ\82­m $h(v)$ mezi otevĹÂ\99enÄ\82Ë\9dmi. BÃ\84Â\9bhem jeho
-relaxace nemĹŻĹžeme ĹžĂĄdnou hodnotu snĂ­Ĺžit pod~$h(v)$, jelikoĹž v~grafu s~nezĂĄpornĂ˝mi
-hranami je $h(v) + \ell(v,w) \ge h(v)$. Hodnota zbĂ˝vajĂ­cĂ­ch otevĹ\99enĂ˝ch vrcholĹŻ
-tedy neklesne pod hodnotu tohoto novÄ\9b uzavĹ\99enĂŠho. Hodnoty dĹ\99Ă­ve uzavĹ\99enĂ˝ch vrcholĹŻ
-se nemohou nijak zmÃ\84Â\9bnit.
+Indukcí dokážeme, Å¾e v~každém okamžiku mají vÅ¡echny uzavÅ\99ené vrcholy ohodnocení
+menší nebo rovné ohodnocením vÅ¡ech otevÅ\99ených vrcholů. Na~poÄ\8dátku to jistÄ\9b platí.
+NechÅ¥ nyní uzavíráme vrchol~$v$ s~minimálním $h(v)$ mezi otevÅ\99enými. BÄ\9bhem jeho
+relaxace nemůžeme žádnou hodnotu snížit pod~$h(v)$, jelikož v~grafu s~nezápornými
+hranami je $h(v) + \ell(v,w) \ge h(v)$. Hodnota zbývajících otevřených vrcholů
+tedy neklesne pod hodnotu tohoto nově uzavřeného. Hodnoty dříve uzavřených vrcholů
+se nemohou nijak zmÄ\9bnit.
 \qed
 
-PĹÂ\99Ä\82­moÃ\84Â\8darÄ\82Ä\84 implementace Dijkstrova algoritmu by tedy pokaĹždÄ\82Å  v~Ã\84Â\8dase $\O(n)$
-vybrala otevĹÂ\99enÄ\82Ë\9d vrchol s~nejmenĹÄ\84Ä\82­m ohodnocenÄ\82­m, v~Ã\84Â\8dase $\O(n)$ ho relaxovala
-a toto by se opakovalo nejvÄ\82Ë\9dĹÄ\84e $n$-krÄ\82Ä\84t. Algoritmus by tudÄ\82­Ĺž dobÃ\84Â\9bhl v~Ã\84Â\8dase $\O(n^2)$,
-coĹž je pro hustÄ\82Å  grafy zajistÄ\82Å  optimÄ\82Ä\84lnÄ\82­. ZkusÄ\82­me nynÄ\82­ zrychlit vÄ\82Ë\9dpoÃ\84Â\8det
-na~Ĺ\99Ă­dkĂ˝ch grafech.
-
-VĹĄechny relaxace trvajĂ­ dohromady $\O(\sum_v \deg(v)) = \O(m)$, takĹže ĂşzkĂ˝m hrdlem je
-vybĂ­rĂĄnĂ­ minima. PouĹžijeme pro nÄ\9bj vhodnou datovou strukturu, v~nĂ­Ĺž budeme udrĹžovat
-mnoĹžinu vĹĄech otevĹ\99enĂ˝ch vrcholĹŻ spolu s~jejich ohodnocenĂ­mi. Od~datovĂŠ struktury
-potĹÂ\99ebujeme, aby umÃ\84Â\9bla operace \<Insert> (vloĹženÄ\82­ vrcholu), \<ExtractMin> (nalezenÄ\82­
-a smazÄ\82Ä\84\82­ minima) a \<Decrease> (snÄ\82­ĹženÄ\82­ hodnoty vrcholu). PrvnÄ\82­ dvÃ\84Â\9b operace pĹÂ\99itom
-volĂĄme nejvýťe $n$-krĂĄt a operaci \<Decrease> nejvýťe $m$-krĂĄt. CelĂ˝ algoritmus
-tedy dobÃ\84Â\9bhne v~Ã\84Â\8dase
+PÅ\99ímoÄ\8dará implementace Dijkstrova algoritmu by tedy pokaždé v~Ä\8dase $\O(n)$
+vybrala otevÅ\99ený vrchol s~nejmenším ohodnocením, v~Ä\8dase $\O(n)$ ho relaxovala
+a toto by se opakovalo nejvýše $n$-krát. Algoritmus by tudíž dobÄ\9bhl v~Ä\8dase $\O(n^2)$,
+což je pro husté grafy zajisté optimální. Zkusíme nyní zrychlit výpoÄ\8det
+na~řídkých grafech.
+
+Všechny relaxace trvají dohromady $\O(\sum_v \deg(v)) = \O(m)$, takže úzkým hrdlem je
+vybírání minima. Použijeme pro něj vhodnou datovou strukturu, v~níž budeme udržovat
+množinu všech otevřených vrcholů spolu s~jejich ohodnoceními. Od~datové struktury
+potÅ\99ebujeme, aby umÄ\9bla operace \<Insert> (vložení vrcholu), \<ExtractMin> (nalezení
+a smazání minima) a \<Decrease> (snížení hodnoty vrcholu). První dvÄ\9b operace pÅ\99itom
+voláme nejvýše $n$-krát a operaci \<Decrease> nejvýše $m$-krát. Celý algoritmus
+tedy dobÄ\9bhne v~Ä\8dase
 $$\O(nT_I(n) + nT_E(n) + mT_D(n)),$$
-kde $T_I(n)$, $T_E(n)$ a $T_D(n)$ jsou Ã\84Â\8dasovÄ\82Å  sloĹžitosti jednotlivÄ\82Ë\9dch operacÄ\82­
-na~struktuĹÂ\99e o~nejvÄ\82Ë\9dĹÄ\84e~$n$ prvcÄ\82­ch (staÃ\84Â\8dÄ\82­ amortizovanÃ\84Â\9b).
+kde $T_I(n)$, $T_E(n)$ a $T_D(n)$ jsou Ä\8dasové složitosti jednotlivých operací
+na~struktuÅ\99e o~nejvýše~$n$ prvcích (staÄ\8dí amortizovanÄ\9b).
 
-\>JakĂŠ moĹžnosti mĂĄme pro volbu struktury?
+\>Jaké možnosti máme pro volbu struktury?
 
 \itemize\ibull
-\:{\I pole} -- \<Insert> a \<Decrease> stojĂ­ konstantu, \<ExtractMin> trvĂĄ $\O(n)$,
+\:{\I pole} -- \<Insert> a \<Decrease> stojí konstantu, \<ExtractMin> trvá $\O(n)$,
   celkem tedy $\O(n^2)$.
-\:{\I (binĂĄrnĂ­) halda} -- vĹĄechny tĹ\99i operace umĂ­me provĂŠst v~Ä\8dase $\O(\log n)$, takĹže celkem
-  $\O(m\log n)$. To je pro hustÄ\82Å  grafy horĹÄ\84Ä\82­, pro Ä¹Â\99Ä\82­dkÄ\82Å  lepĹÄ\84Ä\82­.
-\:{\I $k$-regulĂĄrnĂ­ halda} -- pokud haldu upravĂ­me tak, Ĺže kaĹždĂ˝ prvek bude mĂ­t aĹž $k$ synĹŻ,
-  hloubka haldy klesne na~$\O(\log_k n)$. Operace \uv{vybublÄ\82Ä\84vajÄ\82­cÄ\82­} prvky smÃ\84Â\9brem nahoru,
-  coĹž je \<Insert> a \<Decrease>, se zrychlÄ\82­ na~$\O(\log_k n)$. OvĹÄ\84em \<ExtractMin> potĹÂ\99ebuje
-  zkoumat vĹÄ\84echny syny kaĹždÄ\82Å ho navĹÄ\84\82­venÄ\82Å ho prvku, takĹže se zpomalÄ\82­ na $\O(k\log_k n)$.
-
-  CelkovÄ\82Ä\84 sloĹžitost tedy vyjde $\O(nk\log_k n + m\log_k n)$. Oba Ã\84Â\8dleny se vyrovnajÄ\82­
-  pro $k=m/n$, Ã\84Â\8dÄ\82­mĹž zÄ\82­skÄ\82Ä\84me $\O(m\log_{m/n} n)$. Ã\84Â\8clen $\log_{m/n} n$ je pĹÂ\99itom $\O(1)$,
-  kdykoliv je $m\ge n^{1+\varepsilon}$ pro nÃ\84Â\9bjakÄ\82Å ~$\varepsilon>0$, takĹže pro dostateÃ\84Â\8d\84Â\9b
-  hustÄ\82Å  grafy jsme zÄ\82­skali lineÄ\82Ä\84rnÄ\82­ algoritmus.
-
-  (VĹĄimnÄ\9bte si, Ĺže pro $m\approx n^2$ algoritmus zvolĂ­ $k\approx n$, takĹže halda degeneruje
-  na jedinĂŠ patro, tedy na pole, kterĂŠ se opravdu ukĂĄzalo bĂ˝t optimĂĄlnĂ­ volbou pro hustĂŠ grafy.)
-\:{\I Fibonacciho halda} \cite{ft:fibonacci} -- \<Insert> a \<Decrease> stojĂ­ $\O(1)$, \<ExtractMin> mĂĄ sloĹžitost
-  $\O(\log n)$ [vĹÄ\84e amortizovanÃ\84Â\9b]. DijkstrĹŻv algoritmus proto dobÃ\84Â\9bhne v~Ã\84Â\8dase $\O(m + n\log n)$.
-  To je lineÄ\82Ä\84rnÄ\82­ pro grafy s~hustotou $\Omega(\log n)$. TÄ\82ŠĹže sloĹžitosti operacÄ\82­ dosahujÄ\82­
-  i jinĂŠ, mĂŠnÄ\9b znĂĄmĂŠ haldy \cite{haeupler:rankph,elmasry:violheap}, kterĂŠ mohou bĂ˝t v~praxi
-  vÄ\82Ë\9draznÃ\84Â\9b rychlejĹÄ\84Ä\82­.
-\:{\I MonotĂłnnĂ­ haldy} -- mĹŻĹžeme pouŞít nÄ\9bjakou jinou haldu, kterĂĄ vyuŞívĂĄ toho,
-  Ĺže posloupnost odebĂ­ranĂ˝ch prvkĹŻ je neklesajĂ­cĂ­. Pro celĂĄ Ä\8dĂ­sla na~\hbox{RAMu} to mĹŻĹže
-  bÄ\82Ë\9dt napĹÂ\99Ä\82­klad Thorupova halda \cite{thorup:queue} se sloĹžitostÄ\82­ $\O(\log\log n)$ u~operace \<ExtractMin>
-  a $\O(1)$ u~ostatnÄ\82­ch operacÄ\82­. Dijkstra tedy bÃ\84Â\9bĹžÄ\82­ v~$\O(m + n\log\log n)$.
-\:{\I DatovÄ\82Å  struktury pro omezenÄ\82Å  universum} -- prozkoumÄ\82Ä\84me vzÄ\82Ä\84\84Â\9b\82­.
+\:{\I (binární) halda} -- všechny tři operace umíme provést v~čase $\O(\log n)$, takže celkem
+  $\O(m\log n)$. To je pro husté grafy horší, pro Å\99ídké lepší.
+\:{\I $k$-regulární halda} -- pokud haldu upravíme tak, že každý prvek bude mít až $k$ synů,
+  hloubka haldy klesne na~$\O(\log_k n)$. Operace \uv{vybublávající} prvky smÄ\9brem nahoru,
+  což je \<Insert> a \<Decrease>, se zrychlí na~$\O(\log_k n)$. OvÅ¡em \<ExtractMin> potÅ\99ebuje
+  zkoumat vÅ¡echny syny každého navÅ¡tíveného prvku, takže se zpomalí na $\O(k\log_k n)$.
+
+  Celková složitost tedy vyjde $\O(nk\log_k n + m\log_k n)$. Oba Ä\8dleny se vyrovnají
+  pro $k=m/n$, Ä\8dímž získáme $\O(m\log_{m/n} n)$. Ä\8clen $\log_{m/n} n$ je pÅ\99itom $\O(1)$,
+  kdykoliv je $m\ge n^{1+\varepsilon}$ pro nÄ\9bjaké~$\varepsilon>0$, takže pro dostateÄ\8d\9b
+  husté grafy jsme získali lineární algoritmus.
+
+  (Všimněte si, že pro $m\approx n^2$ algoritmus zvolí $k\approx n$, takže halda degeneruje
+  na jediné patro, tedy na pole, které se opravdu ukázalo být optimální volbou pro husté grafy.)
+\:{\I Fibonacciho halda} \cite{ft:fibonacci} -- \<Insert> a \<Decrease> stojí $\O(1)$, \<ExtractMin> má složitost
+  $\O(\log n)$ [vÅ¡e amortizovanÄ\9b]. Dijkstrův algoritmus proto dobÄ\9bhne v~Ä\8dase $\O(m + n\log n)$.
+  To je lineární pro grafy s~hustotou $\Omega(\log n)$. Téže složitosti operací dosahují
+  i jiné, méně známé haldy \cite{haeupler:rankph,elmasry:violheap}, které mohou být v~praxi
+  výraznÄ\9b rychlejší.
+\:{\I Monotónní haldy} -- můžeme použít nějakou jinou haldu, která využívá toho,
+  že posloupnost odebíraných prvků je neklesající. Pro celá čísla na~\hbox{RAMu} to může
+  být napÅ\99íklad Thorupova halda \cite{thorup:queue} se složitostí $\O(\log\log n)$ u~operace \<ExtractMin>
+  a $\O(1)$ u~ostatních operací. Dijkstra tedy bÄ\9bží v~$\O(m + n\log\log n)$.
+\:{\I Datové struktury pro omezené universum} -- prozkoumáme vzápÄ\9b­.
 \endlist
 
-\s{CviÃ\84Â\8denÄ\82­:}
+\s{CviÄ\8dení:}
 
 \itemize\ibull
-\:NajdÄ\9bte pĹ\99Ă­klad grafu se zĂĄpornĂ˝mi hranami (ale bez zĂĄpornĂ˝ch cyklĹŻ),
-  na~kterĂŠm DijkstrĹŻv algoritmus selĹže.
-\:Rozmyslete si, Ä¹Å¾e pokud nevyuĹžijeme nÃ\84Â\9bjakÄ\82Å  speciÄ\82Ä\84lnÄ\82­ vlastnosti Ã\84Â\8dÄ\82­sel (celoÃ\84Â\8dÄ\82­selnost,
-  omezenĂ˝ rozsah), je mez $\O(m+n\log n)$ nejlepĹĄĂ­ moĹžnĂĄ, protoĹže DijkstrovĂ˝m algoritmem
-  mĹŻĹžeme tĹÂ\99Ä\82­dit $n$-tici Ã\84Â\8dÄ\82­sel. Thorup dokonce dokÄ\82Ä\84zal \cite{thorup:equiv}, Ä¹Å¾e z~kaĹždÄ\82Å ho tĹÂ\99Ä\82­dÄ\82­cÄ\82­ho algoritmu
-  se sloĹžitostÄ\82­ $\O(nT(n))$ mĹŻĹžeme odvodit haldu se sloĹžitostÄ\82­ mazÄ\82Ä\84\82­ $\O(T(n))$.
-\:Jsou-li dÄ\82Å lky hran celoÃ\84Â\8dÄ\82­selnÄ\82Å , mĹŻĹžeme se na DijkstrĹŻv algoritmus dÄ\82­vat i takto:
-  PĹ\99edstavme si, Ĺže kaĹždou hranu nahradĂ­me cestou tvoĹ\99enou pĹ\99Ă­sluĹĄnĂ˝m poÄ\8dtem hran jednotkovĂŠ dĂŠlky
-  a na vzniklĂ˝ neohodnocenĂ˝ graf spustĂ­me prohledĂĄvĂĄnĂ­ do~ĹĄĂ­Ĺ\99ky. To samozĹ\99ejmÄ\9b vydĂĄ
-  sprÄ\82Ä\84vnÄ\82Ë\9d vÄ\82Ë\9dsledek, ale pomÃ\84Â\9brnÃ\84Â\9b pomalu, protoĹže bude vÃ\84Â\9btĹÄ\84inu Ã\84Â\8dasu trÄ\82Ä\84vit posouvÄ\82Ä\84\82­m
-  vlny \uv{uvnitĹÂ\99} pĹŻvodnÄ\82­ch hran. MĹŻĹžeme si tedy pro kaĹždou pĹŻvodnÄ\82­ hranu naĹÂ\99Ä\82­dit
-  \uv{budÄ\82­k}, kterÄ\82Ë\9d nÄ\82Ä\84m Ä¹Â\99ekne, za~kolik posunutÄ\82­ vlny dospÃ\84Â\9bjeme na~jejÄ\82­ konec.
-  DokaĹžte, Ĺže tento algoritmus je ekvivalentnĂ­ s~DijkstrovĂ˝m.
+\:Najděte příklad grafu se zápornými hranami (ale bez záporných cyklů),
+  na~kterém Dijkstrův algoritmus selže.
+\:Rozmyslete si, Å¾e pokud nevyužijeme nÄ\9bjaké speciální vlastnosti Ä\8dísel (celoÄ\8díselnost,
+  omezený rozsah), je mez $\O(m+n\log n)$ nejlepší možná, protože Dijkstrovým algoritmem
+  můžeme tÅ\99ídit $n$-tici Ä\8dísel. Thorup dokonce dokázal \cite{thorup:equiv}, Å¾e z~každého tÅ\99ídícího algoritmu
+  se složitostí $\O(nT(n))$ můžeme odvodit haldu se složitostí mazání $\O(T(n))$.
+\:Jsou-li délky hran celoÄ\8díselné, můžeme se na Dijkstrův algoritmus dívat i takto:
+  Představme si, že každou hranu nahradíme cestou tvořenou příslušným počtem hran jednotkové délky
+  a na vzniklý neohodnocený graf spustíme prohledávání do~šířky. To samozřejmě vydá
+  správný výsledek, ale pomÄ\9brnÄ\9b pomalu, protože bude vÄ\9btÅ¡inu Ä\8dasu trávit posouváním
+  vlny \uv{uvnitÅ\99} původních hran. Můžeme si tedy pro každou původní hranu naÅ\99ídit
+  \uv{budík}, který nám Å\99ekne, za~kolik posunutí vlny dospÄ\9bjeme na~její konec.
+  Dokažte, že tento algoritmus je ekvivalentní s~Dijkstrovým.
 \endlist
 
-\h{CeloÄ\8dĂ­selnĂŠ dĂŠlky}
-
-UvaĹžujme nynĂ­ grafy, v~nichĹž jsou vĹĄechny dĂŠlky hran nezĂĄpornĂĄ celĂĄ Ä\8dĂ­sla omezenĂĄ
-nÄ\9bjakou konstantou~$L$. VĹĄechny vzdĂĄlenosti jsou tedy omezeny Ä\8dĂ­slem~$nL$, takĹže
-nÄ\82Ä\84m staÃ\84Â\8dÄ\82­ datovÄ\82Ä\84 struktura schopnÄ\82Ä\84 uchovÄ\82Ä\84vat takto omezenÄ\82Ä\84 celÄ\82Ä\84 Ã\84Â\8dÄ\82­sla.
-
-PouĹžijeme jednoduchou pĹ\99ihrĂĄdkovou strukturu: pole indexovanĂŠ hodnotami od~0 do~$nL$,
-jeho $i$-tÄ\82Ë\9d prvek bude obsahovat seznam vrcholĹŻ, jejichĹž ohodnocenÄ\82­ je rovno~$i$.
-Operace \<Insert> a \<Decrease> zvlĂĄdneme v~konstantnĂ­m Ä\8dase, budeme-li si u~kaĹždĂŠho
-prvku pamatovat jeho polohu v~seznamu. Operace \<ExtractMin> potĹÂ\99ebuje najÄ\82­t prvnÄ\82­
-neprÄ\82Ä\84zdnou pĹÂ\99ihrÄ\82Ä\84dku, ale jelikoĹž vÄ\82­me, Ä¹Å¾e posloupnost odebÄ\82­ranÄ\82Ë\9dch minim je monotÄ\82Å\82nnÄ\82­,
-staÄ\8dĂ­ hledat od mĂ­sta, kde se hledĂĄnĂ­ zastavilo minule. VĹĄechna hledĂĄnĂ­ pĹ\99ihrĂĄdek
-tedy zaberou dohromady $\O(nL)$ a celĂ˝ DijkstrĹŻv algoritmus bude trvat $\O(nL + m)$.
-
-ProstorovĂĄ sloĹžitost $\O(nL+m)$ je nevalnĂĄ, ale mĹŻĹžeme ji jednoduchĂ˝m trikem
-snÄ\82­Ĺžit: VĹÄ\84imneme si, Ä¹Å¾e vĹÄ\84echna koneÃ\84Â\8d\82Ä\84 ohodnocenÄ\82­ vrcholĹŻ nemohou bÄ\82Ë\9dt vÃ\84Â\9btĹÄ\84Ä\82­
-neĹž aktuĂĄlnĂ­ minimum zvÄ\9btĹĄenĂŠ o~$L$. JinĂ˝mi slovy vĹĄechny neprĂĄzdnĂŠ pĹ\99ihrĂĄdky
-se nachÄ\82Ä\84zejÄ\82­ v~Ä\82Å\9fseku pole dlouhÄ\82Å m~$L+1$, takĹže staÃ\84Â\8dÄ\82­ indexovat modulo~$L+1$.
-Pouze si musÄ\82­me dÄ\82Ä\84vat pozor, abychom sprÄ\82Ä\84vnÃ\84Â\9b poznali, kdy se struktura
-vyprÄ\82Ä\84zdnila, coĹž zjistÄ\82­me napĹÂ\99Ä\82­klad pomocÄ\82­ poÃ\84Â\8dÄ\82­tadla otevĹÂ\99enÄ\82Ë\9dch vrcholĹŻ. Ã\84Â\8cas si
-asymptoticky nezhorĹÄ\84Ä\82­me, prostor klesne na~$\O(L+m)$.
-
-PodobnÄ\82Ë\9d trik mĹŻĹžeme pouĹžÄ\82­t i pro libovolnou jinou datovou strukturu: rozsah Ã\84Â\8dÄ\82­sel
-rozdÃ\84Â\9b\82­me na~\uv{okna} velikosti~$L$ (v~$i$-tÄ\82Å m oknÃ\84Â\9b jsou Ã\84Â\8dÄ\82­sla $iL,iL+1,\ldots,(i+1)L-1$).
-V~libovolnĂŠ chvĂ­li mohou tedy bĂ˝t neprĂĄzdnĂĄ nejvýťe dvÄ\9b okna. StaÄ\8dĂ­ nĂĄm proto
-poĹÂ\99Ä\82­dit si dvÃ\84Â\9b struktury pro uklÄ\82Ä\84\82Ä\84\82­ Ã\84Â\8dÄ\82­sel v~rozsahu $0,\ldots,L-1$ -- jedna
-z~nich bude reprezentovat aktuĂĄlnĂ­ okno (to, v~nÄ\9bmĹž leĹželo minulĂŠ minimum),
-druhÄ\82Ä\84 okno bezprostĹÂ\99ednÃ\84Â\9b nÄ\82Ä\84sledujÄ\82­cÄ\82­. Minimum maĹžeme z~prvnÄ\82­ struktury; pokud
-uĹž je prÄ\82Ä\84zdnÄ\82Ä\84, obÃ\84Â\9b struktury prohodÄ\82­me. Operace \<Insert> podle hodnoty urÃ\84Â\8dÄ\82­,
-do~kterÄ\82Å  struktury se mÄ\82Ä\84 vklÄ\82Ä\84dat. S~operacÄ\82­ \<Decrease> je to sloĹžitÃ\84Â\9bjĹÄ\84Ä\82­ --
-hodnota z~vyĹÄ\84ĹÄ\84Ä\82­ struktury mĹŻĹže pĹÂ\99eskoÃ\84Â\8dit do tÄ\82Å  niĹžĹÄ\84Ä\82­, ale v~takovÄ\82Å m pĹÂ\99Ä\82­padÃ\84Â\9b
-ji ve~vyĹĄĹĄĂ­ struktuĹ\99e vymaĹžeme (to je \<Decrease> na $-\infty$ nĂĄsledovanĂ˝
-\<ExtractMin>em) a do~tĂŠ niŞťí vloŞíme. To se kaĹždĂŠmu prvku mĹŻĹže pĹ\99ihodit nejvýťe
-jednou, takĹže stÄ\82Ä\84le platÄ\82­, Ä¹Å¾e se kaĹždÄ\82Ë\9d prvek Ä\82Å\9fÃ\84Â\8dastnÄ\82­ $\O(1)$ vloĹženÄ\82­ a $\O(1)$
-extrakcÄ\82­ minima.
-
-UkÄ\82Ä\84zali jsme tedy, Ä¹Å¾e pro naĹÄ\84e potĹÂ\99eby postaÃ\84Â\8duje struktura schopnÄ\82Ä\84 uchovÄ\82Ä\84\82Ä\84\82­
-Ä\8dĂ­sel menĹĄĂ­ch nebo rovnĂ˝ch~$L$.
-
-NabÄ\82­zÄ\82­ se pouĹžÄ\82­t van Emde-BoasĹŻv strom z~kapitoly o~vÄ\82Ë\9dpoÃ\84Â\8detnÄ\82­ch modelech.
-Ten dosahuje sloĹžitosti $\O(\log\log L)$ pro operace \<Insert> a \<ExtractMin>,
-operaci \<Decrease> musĂ­me pĹ\99eklĂĄdat na \<Delete> a \<Insert>. CelkovĂĄ
-sloĹžitost Dijkstrova algoritmu vyjde $\O(L+m\log\log L)$, pĹÂ\99\84Â\8demĹž Ã\84Â\8das~$L$
-spotĹÂ\99ebujeme na inicializaci struktury (tÄ\82Å  se lze za jistÄ\82Ë\9dch podmÄ\82­nek vyhnout,
-viz zmĂ­nÄ\9bnĂĄ kapitola).
-
-VraĹĽme se ale jeĹĄtÄ\9b k~vyuĹžitĂ­ pĹ\99ihrĂĄdek\dots
-
-\h{VĂ­ceĂşrovĹ\88ovĂŠ pĹ\99ihrĂĄdky}
-
-PodobnÄ\9b jako u~tĹ\99Ă­dÄ\9bnĂ­ Ä\8dĂ­sel, i~zde se vyplĂĄcĂ­ stavÄ\9bt pĹ\99ihrĂĄdkovĂŠ struktury
-vĂ­ceĂşrovĹ\88ovÄ\9b (pĹŻvodnÄ\9b popsĂĄno Goldbergem a Silversteinem \cite{goldberg:mlb}).
-JednotlivĂŠ hodnoty budeme zapisovat v~soustavÄ\9b o~zĂĄkladu~$B$,
-kterÄ\82Ë\9d zvolÄ\82­me jako nÃ\84Â\9bjakou mocninu dvojky, abychom mohli s~Ã\84Â\8dÄ\82­slicemi tohoto
-zĂĄpisu snadno zachĂĄzet pomocĂ­ bitovĂ˝ch operacĂ­. KaĹždĂŠ Ä\8dĂ­slo tedy zabere nejvýťe
-$d=1+\lfloor\log_B L\rfloor$ Ã\84Â\8dÄ\82­slic; pokud bude kratĹÄ\84Ä\82­, doplnÄ\82­me ho zleva nulami.
-
-NejvyĹĄĹĄĂ­ patro struktury bude tvoĹ\99eno polem $B$~pĹ\99ihrĂĄdek, v~$i$-tĂŠ z~nich
-budou uloĹžena ta Ã\84Â\8dÄ\82­sla, jejichĹž Ã\84Â\8dÄ\82­slice nejvyĹÄ\84ĹÄ\84Ä\82­ho Ä¹Â\99Ä\82Ä\84du je rovna~$i$. Za~{\I aktivnÄ\82­}
-prohlÄ\82Ä\84\82­me tu pĹÂ\99ihrÄ\82Ä\84dku, kterÄ\82Ä\84 obsahuje aktuÄ\82Ä\84lnÄ\82­ minimum. PĹÂ\99ihrÄ\82Ä\84dky s~menĹÄ\84Ä\82­mi
-indexy jsou prĂĄzdnĂŠ a zĹŻstanou takovĂŠ aĹž do~konce vĂ˝poÄ\8dtu, protoĹže halda
-je monotĂłnnĂ­. Pokud v~pĹ\99ihrĂĄdce obsahujĂ­cĂ­ minimum bude vĂ­ce prvkĹŻ, budeme
-ji rozklĂĄdat podle druhĂŠho nejvyĹĄĹĄĂ­ho Ĺ\99ĂĄdu na dalĹĄĂ­ch~$B$ pĹ\99ihrĂĄdek atd.
-Celkem tak vznikne aĹž~$d$ Ä\82Å\9frovnÄ\82­.
-
-\>Struktura bude obsahovat nÄ\82Ä\84sledujÄ\82­cÄ\82­ data:
+\h{Celočíselné délky}
+
+Uvažujme nyní grafy, v~nichž jsou všechny délky hran nezáporná celá čísla omezená
+nějakou konstantou~$L$. Všechny vzdálenosti jsou tedy omezeny číslem~$nL$, takže
+nám staÄ\8dí datová struktura schopná uchovávat takto omezená celá Ä\8dísla.
+
+Použijeme jednoduchou přihrádkovou strukturu: pole indexované hodnotami od~0 do~$nL$,
+jeho $i$-tý prvek bude obsahovat seznam vrcholů, jejichž ohodnocení je rovno~$i$.
+Operace \<Insert> a \<Decrease> zvládneme v~konstantním čase, budeme-li si u~každého
+prvku pamatovat jeho polohu v~seznamu. Operace \<ExtractMin> potÅ\99ebuje najít první
+neprázdnou pÅ\99ihrádku, ale jelikož víme, Å¾e posloupnost odebíraných minim je monotónní,
+stačí hledat od místa, kde se hledání zastavilo minule. Všechna hledání přihrádek
+tedy zaberou dohromady $\O(nL)$ a celý Dijkstrův algoritmus bude trvat $\O(nL + m)$.
+
+Prostorová složitost $\O(nL+m)$ je nevalná, ale můžeme ji jednoduchým trikem
+snížit: VÅ¡imneme si, Å¾e vÅ¡echna koneÄ\8dná ohodnocení vrcholů nemohou být vÄ\9btší
+než aktuální minimum zvětšené o~$L$. Jinými slovy všechny neprázdné přihrádky
+se nacházejí v~úseku pole dlouhém~$L+1$, takže staÄ\8dí indexovat modulo~$L+1$.
+Pouze si musíme dávat pozor, abychom správnÄ\9b poznali, kdy se struktura
+vyprázdnila, což zjistíme napÅ\99íklad pomocí poÄ\8dítadla otevÅ\99ených vrcholů. Ä\8cas si
+asymptoticky nezhoršíme, prostor klesne na~$\O(L+m)$.
+
+Podobný trik můžeme použít i pro libovolnou jinou datovou strukturu: rozsah Ä\8dísel
+rozdÄ\9blíme na~\uv{okna} velikosti~$L$ (v~$i$-tém oknÄ\9b jsou Ä\8dísla $iL,iL+1,\ldots,(i+1)L-1$).
+V~libovolné chvíli mohou tedy být neprázdná nejvýše dvě okna. Stačí nám proto
+poÅ\99ídit si dvÄ\9b struktury pro ukládání Ä\8dísel v~rozsahu $0,\ldots,L-1$ -- jedna
+z~nich bude reprezentovat aktuální okno (to, v~němž leželo minulé minimum),
+druhá okno bezprostÅ\99ednÄ\9b následující. Minimum mažeme z~první struktury; pokud
+už je prázdná, obÄ\9b struktury prohodíme. Operace \<Insert> podle hodnoty urÄ\8dí,
+do~které struktury se má vkládat. S~operací \<Decrease> je to složitÄ\9bjší --
+hodnota z~vyšší struktury může pÅ\99eskoÄ\8dit do té nižší, ale v~takovém pÅ\99ípadÄ\9b
+ji ve~vyšší struktuře vymažeme (to je \<Decrease> na $-\infty$ následovaný
+\<ExtractMin>em) a do~té nižší vložíme. To se každému prvku může přihodit nejvýše
+jednou, takže stále platí, Å¾e se každý prvek ÃºÄ\8dastní $\O(1)$ vložení a $\O(1)$
+extrakcí minima.
+
+Ukázali jsme tedy, Å¾e pro naÅ¡e potÅ\99eby postaÄ\8duje struktura schopná uchovávání
+čísel menších nebo rovných~$L$.
+
+Nabízí se použít van Emde-Boasův strom z~kapitoly o~výpoÄ\8detních modelech.
+Ten dosahuje složitosti $\O(\log\log L)$ pro operace \<Insert> a \<ExtractMin>,
+operaci \<Decrease> musíme překládat na \<Delete> a \<Insert>. Celková
+složitost Dijkstrova algoritmu vyjde $\O(L+m\log\log L)$, pÅ\99\8demž Ä\8das~$L$
+spotÅ\99ebujeme na inicializaci struktury (té se lze za jistých podmínek vyhnout,
+viz zmíněná kapitola).
+
+Vraťme se ale ještě k~využití přihrádek\dots
+
+\h{Víceúrovňové přihrádky}
+
+Podobně jako u~třídění čísel, i~zde se vyplácí stavět přihrádkové struktury
+víceúrovňově (původně popsáno Goldbergem a Silversteinem \cite{goldberg:mlb}).
+Jednotlivé hodnoty budeme zapisovat v~soustavě o~základu~$B$,
+který zvolíme jako nÄ\9bjakou mocninu dvojky, abychom mohli s~Ä\8díslicemi tohoto
+zápisu snadno zacházet pomocí bitových operací. Každé číslo tedy zabere nejvýše
+$d=1+\lfloor\log_B L\rfloor$ Ä\8díslic; pokud bude kratší, doplníme ho zleva nulami.
+
+Nejvyšší patro struktury bude tvořeno polem $B$~přihrádek, v~$i$-té z~nich
+budou uložena ta Ä\8dísla, jejichž Ä\8díslice nejvyššího Å\99ádu je rovna~$i$. Za~{\I aktivní}
+prohlásíme tu pÅ\99ihrádku, která obsahuje aktuální minimum. PÅ\99ihrádky s~menšími
+indexy jsou prázdné a zůstanou takové až do~konce výpočtu, protože halda
+je monotónní. Pokud v~přihrádce obsahující minimum bude více prvků, budeme
+ji rozkládat podle druhého nejvyššího řádu na dalších~$B$ přihrádek atd.
+Celkem tak vznikne až~$d$ Ãºrovní.
+
+\>Struktura bude obsahovat následující data:
 
 \itemize\ibull
 \:Parametry $L$, $B$ a~$d$.
-\:Pole ĂşrovnĂ­ (nejvyĹĄĹĄĂ­ mĂĄ Ä\8dĂ­slo~$d-1$, nejniŞťí~0), kaĹždĂĄ ĂşroveĹ\88 je buÄ\8fto prĂĄzdnĂĄ
-  (a pak jsou prĂĄzdnĂŠ i~vĹĄechny niŞťí), nebo obsahuje pole~$U_i$ o~$B$ pĹ\99ihrĂĄdkĂĄch
-  a v~kaĹždĂŠ z~nich seznam prvkĹŻ. Pole ĂşrovnĂ­ pouŞívĂĄme jako zĂĄsobnĂ­k, udrĹžujeme
-  si Ã\84Â\8dÄ\82­slo nejniĹžĹÄ\84Ä\82­ neprÄ\82Ä\84zdnÄ\82Å  Ä\82Å\9frovnÃ\84Â\9b.
-\:Hodnotu~$\mu$ pĹ\99edchozĂ­ho odebranĂŠho minima.
+\:Pole úrovní (nejvyšší má číslo~$d-1$, nejnižší~0), každá úroveň je buďto prázdná
+  (a pak jsou prázdné i~všechny nižší), nebo obsahuje pole~$U_i$ o~$B$ přihrádkách
+  a v~každé z~nich seznam prvků. Pole úrovní používáme jako zásobník, udržujeme
+  si Ä\8díslo nejnižší neprázdné ÃºrovnÄ\9b.
+\:Hodnotu~$\mu$ předchozího odebraného minima.
 \endlist
 
-Operace \<Insert> vloŞí hodnotu do~nejhlubĹĄĂ­ moĹžnĂŠ pĹ\99ihrĂĄdky. PodĂ­vĂĄ se tedy
-na~nejvyĹÄ\84ĹÄ\84Ä\82­ Ä\82Å\9froveĹÂ\88: pokud hodnota patĹÂ\99Ä\82­ do pĹÂ\99ihrÄ\82Ä\84dky, kterÄ\82Ä\84 nenÄ\82­ aktivnÄ\82­, vloĹžÄ\82­
-ji pĹ\99Ă­mo. Jinak pĹ\99ejde o~ĂşroveĹ\88 nĂ­Ĺže a zopakuje stejnĂ˝ postup. To vĹĄe lze provĂŠst
-v~konstantnĂ­m Ä\8dase: staÄ\8dĂ­ se podĂ­vat, jakĂ˝ je nejvyĹĄĹĄĂ­ jedniÄ\8dkovĂ˝ bit ve~{\sc xor}u
-novÄ\82Å  hodnoty s~Ã\84Â\8dÄ\82­slem~$\mu$ (opÃ\84Â\9bt viz kapitola o~vÄ\82Ë\9dpoÃ\84Â\8detnÄ\82­ch modelech), a tÄ\82­m zjistit
-Ã\84Â\8dÄ\82­slo Ä\82Å\9frovnÃ\84Â\9b, kam hodnota patĹÂ\99Ä\82­.
+Operace \<Insert> vloží hodnotu do~nejhlubší možné přihrádky. Podívá se tedy
+na~nejvyšší ÃºroveÅ\88: pokud hodnota patÅ\99í do pÅ\99ihrádky, která není aktivní, vloží
+ji přímo. Jinak přejde o~úroveň níže a zopakuje stejný postup. To vše lze provést
+v~konstantním čase: stačí se podívat, jaký je nejvyšší jedničkový bit ve~{\sc xor}u
+nové hodnoty s~Ä\8díslem~$\mu$ (opÄ\9bt viz kapitola o~výpoÄ\8detních modelech), a tím zjistit
+Ä\8díslo ÃºrovnÄ\9b, kam hodnota patÅ\99í.
 
-Pokud chceme provĂŠst \<Decrease>, odstranĂ­me hodnotu z~pĹ\99ihrĂĄdky, ve~kterĂŠ se
-prĂĄvÄ\9b nachĂĄzĂ­ (polohu si mĹŻĹžeme u~kaĹždĂŠ hodnoty pamatovat zvlĂĄĹĄĹĽ), a znovu ji
-vloĹžÄ\82­me.
+Pokud chceme provést \<Decrease>, odstraníme hodnotu z~přihrádky, ve~které se
+právě nachází (polohu si můžeme u~každé hodnoty pamatovat zvlášť), a znovu ji
+vložíme.
 
-VÄ\9btĹĄinu prĂĄce samozĹ\99ejmÄ\9b pĹ\99enechĂĄme funkci \<ExtractMin>. Ta zaÄ\8dne prohledĂĄvat
-nejniŞťí obsazenou ĂşroveĹ\88 od~aktivnĂ­ pĹ\99ihrĂĄdky dĂĄl (to, kterĂĄ pĹ\99ihrĂĄdka je na
-kterĂŠ Ăşrovni aktivnĂ­, poznĂĄme z~Ä\8dĂ­slic hodnoty~$\mu$). Pokud pĹ\99ihrĂĄdky na~tĂŠto
-Ăşrovni dojdou, prĂĄzdnou ĂşroveĹ\88 zruĹĄĂ­me a pokraÄ\8dujeme o~patro výťe.
+Většinu práce samozřejmě přenecháme funkci \<ExtractMin>. Ta začne prohledávat
+nejnižší obsazenou úroveň od~aktivní přihrádky dál (to, která přihrádka je na
+které úrovni aktivní, poznáme z~číslic hodnoty~$\mu$). Pokud přihrádky na~této
+úrovni dojdou, prázdnou úroveň zrušíme a pokračujeme o~patro výše.
 
-Jakmile najdeme neprĂĄzdnou pĹ\99ihrĂĄdku, nalezneme v~nĂ­ minimum a to se stane novĂ˝m~$\mu$.
-Pokud v~pĹÂ\99ihrÄ\82Ä\84dce nebyly Ä¹Å¾Ä\82Ä\84dnÄ\82Å  dalĹÄ\84Ä\82­ prvky, skonÃ\84Â\8dÄ\82­me. V~opaÃ\84Â\8d\82Å m pĹÂ\99Ä\82­padÃ\84Â\9b zbÄ\82Ë\9dvajÄ\82­cÄ\82­
-prvky rozprostĹÂ\99eme do~pĹÂ\99ihrÄ\82Ä\84dek na~bezprostĹÂ\99ednÃ\84Â\9b niĹžĹÄ\84Ä\82­ Ä\82Å\9frovni, kterou tÄ\82­m zaloĹžÄ\82­me.
+Jakmile najdeme neprázdnou přihrádku, nalezneme v~ní minimum a to se stane novým~$\mu$.
+Pokud v~pÅ\99ihrádce nebyly Å¾Ã¡dné další prvky, skonÄ\8díme. V~opaÄ\8dném pÅ\99ípadÄ\9b zbývající
+prvky rozprostÅ\99eme do~pÅ\99ihrádek na~bezprostÅ\99ednÄ\9b nižší Ãºrovni, kterou tím založíme.
 
-Ã\84Â\8cas strÄ\82Ä\84venÄ\82Ë\9d hledÄ\82Ä\84\82­m minima mĹŻĹžeme rozdÃ\84Â\9blit na~nÃ\84Â\9bkolik Ã\84Â\8dÄ\82Ä\84stÄ\82­:
+Ä\8cas strávený hledáním minima můžeme rozdÄ\9blit na~nÄ\9bkolik Ä\8dástí:
 
 \itemize\ibull
-\:$\O(B)$ na inicializaci novĂŠ ĂşrovnÄ\9b -- to naĂşÄ\8dtujeme prvku, kterĂ˝ jsme
-  prÄ\82Ä\84\84Â\9b mazali;
-\:hledĂĄnĂ­ neprĂĄzdnĂ˝ch pĹ\99ihrĂĄdek -- prozkoumĂĄnĂ­ kaĹždĂŠ prĂĄzdnĂŠ pĹ\99ihrĂĄdky
-  naÄ\82Å\9fÃ\84Â\8dtujeme jejÄ\82­mu vytvoĹÂ\99enÄ\82­, coĹž se rozpustÄ\82­ v~$\O(B)$ na inicializaci
-  Ä\82Å\9frovnÃ\84Â\9b;
-\:zruĹÄ\84enÄ\82­ Ä\82Å\9frovnÃ\84Â\9b -- opÃ\84Â\9bt naÄ\82Å\9fÃ\84Â\8dtujeme jejÄ\82­mu vzniku;
-\:rozhazovĂĄnĂ­ prvkĹŻ do pĹ\99ihrĂĄdek -- jelikoĹž prvky v~hierarchii pĹ\99ihrĂĄdek
-  putujÄ\82­ bÃ\84Â\9bhem operacÄ\82­ pouze doleva a dolĹŻ (jejich hodnoty se nikdy nezvÃ\84Â\9btĹÄ\84ujÄ\82­),
-  klesne kaĹždÄ\82Ë\9d prvek nejvÄ\82Ë\9dĹÄ\84e~$d$-krÄ\82Ä\84t, takĹže staÃ\84Â\8dÄ\82­, kdyĹž na vĹÄ\84echna rozhazovÄ\82Ä\84\82­
-  pĹÂ\99ispÃ\84Â\9bje Ã\84Â\8dasem $\O(d)$.
+\:$\O(B)$ na inicializaci nové úrovně -- to naúčtujeme prvku, který jsme
+  právÄ\9b mazali;
+\:hledání neprázdných přihrádek -- prozkoumání každé prázdné přihrádky
+  naúÄ\8dtujeme jejímu vytvoÅ\99ení, což se rozpustí v~$\O(B)$ na inicializaci
+  ÃºrovnÄ\9b;
+\:zruÅ¡ení ÃºrovnÄ\9b -- opÄ\9bt naúÄ\8dtujeme jejímu vzniku;
+\:rozhazování prvků do přihrádek -- jelikož prvky v~hierarchii přihrádek
+  putují bÄ\9bhem operací pouze doleva a dolů (jejich hodnoty se nikdy nezvÄ\9btÅ¡ují),
+  klesne každý prvek nejvýše~$d$-krát, takže staÄ\8dí, když na vÅ¡echna rozhazování
+  pÅ\99ispÄ\9bje Ä\8dasem $\O(d)$.
 \endlist
 
-\>StaÃ\84Â\8dÄ\82­ tedy, aby kaĹždÄ\82Ë\9d prvek pĹÂ\99i \<Insert>u zaplatil Ã\84Â\8das $\O(B+d)$ a jak \<Decrease>,
-tak \<ExtractMin> budou mĂ­t konstantnĂ­ amortizovanou sloĹžitost. DijkstrĹŻv
-algoritmus pak pobÃ\84Â\9bĹžÄ\82­ v~$\O(m + n(B+d))$.
+\>StaÄ\8dí tedy, aby každý prvek pÅ\99i \<Insert>u zaplatil Ä\8das $\O(B+d)$ a jak \<Decrease>,
+tak \<ExtractMin> budou mít konstantní amortizovanou složitost. Dijkstrův
+algoritmus pak pobÄ\9bží v~$\O(m + n(B+d))$.
 
-ZbĂ˝vĂĄ nastavit parametry tak, abychom minimalizovali vĂ˝raz $B+d = B + \log L/\log B$.
-VhodnÄ\82Ä\84 volba je $B=\log L/\log\log L$. PĹÂ\99i nÄ\82­ platÄ\82­
+Zbývá nastavit parametry tak, abychom minimalizovali výraz $B+d = B + \log L/\log B$.
+Vhodná volba je $B=\log L/\log\log L$. PÅ\99i ní platí
 $$
 {\log L\over\log B} = {\log L \over \log\left(\log L/\log\log L\right) }
 = {\log L\over \log\log L - \log\log\log L} = \Theta(B).
 $$
-Tehdy Dijkstra vydÄ\82Ä\84 vÄ\82Ë\9dsledek v~Ã\84Â\8dase $\O(m + n\cdot{\log L\over\log\log L})$.
-
-\h{HOT Queue -- kombinace pĹ\99ihrĂĄdek s~haldou}
-
-Cherkassky, Goldberg a Silverstein \cite{cherkassky:hotq} si vĹĄimli, Ĺže ve~vĂ­ceĂşrovĹ\88ovĂ˝ch pĹ\99ihrĂĄdkovĂ˝ch strukturĂĄch
-platĂ­me pĹ\99Ă­liĹĄ mnoho za~ĂşrovnÄ\9b, ve~kterĂ˝ch se za~dobu jejich existence objevĂ­ jen malĂŠ
-mnoĹžstvĂ­ prvkĹŻ. Navrhli tedy uklĂĄdat prvky z~\uv{malĂ˝ch} ĂşrovnĂ­ do~spoleÄ\8dnĂŠ haldy.
-VÄ\82Ë\9dslednÄ\82Å  struktuĹÂ\99e se Ä¹Â\99Ä\82­kÄ\82Ä\84 HOT (Heap-on-Top) Queue. My si pĹÂ\99edvedeme jejÄ\82­ upravenou
-variantu (v~tÄ\82Å  pĹŻvodnÄ\82­ se skrÄ\82Ë\9d\82Ä\84 nÃ\84Â\9bkolik chyb).
-
-PoĹÂ\99Ä\82­dÄ\82­me si haldu, Ä¹Â\99eknÃ\84Â\9bme Fibonacciho, a~navÄ\82­c ke~kaĹždÄ\82Å  Ä\82Å\9frovni poÃ\84Â\8dÄ\82­tadlo udÄ\82Ä\84vajÄ\82­cÄ\82­,
-kolik prvkĹŻ z~tĂŠto ĂşrovnÄ\9b jsme uloĹžili do~haldy. Dokud toto poÄ\8dĂ­tadlo nepĹ\99eroste nÄ\9bjakĂ˝
-parametr~$H$, pĹÂ\99ihrÄ\82Ä\84dky nebudeme zaklÄ\82Ä\84dat a prvky poputujÄ\82­ do~haldy. Ã\84Â\8cas $\O(B)$ na
-zaloĹženĂ­ ĂşrovnÄ\9b a jejĂ­ prochĂĄzenĂ­ proto mĹŻĹžeme rozpoÄ\8dĂ­tat mezi~$H$ prvkĹŻ, kterĂŠ se musely
-na~danÄ\82Å  Ä\82Å\9frovni objevit, neĹž byla rozpĹÂ\99ihrÄ\82Ä\84dkovÄ\82Ä\84na. (PovĹÄ\84imnÃ\84Â\9bte si, Ä¹Å¾e poÃ\84Â\8dÄ\82­tadlo nikdy
-nesniĹžujeme, pouze ho vynulujeme, kdyĹž je Ä\82Å\9froveĹÂ\88 zruĹÄ\84ena. Proto vĹŻbec nemusÄ\82­ odpovÄ\82­dat
-skuteÄ\8dnĂŠmu poÄ\8dtu prvkĹŻ z~pĹ\99Ă­sluĹĄnĂŠ ĂşrovnÄ\9b, kterĂŠ jsou prĂĄvÄ\9b uloĹženy v~haldÄ\9b. To ovĹĄem
-vĹŻbec nevadĂ­ -- poÄ\8dĂ­tadlo pouze hlĂ­dĂĄ, aby se ĂşroveĹ\88 nevytvoĹ\99ila pĹ\99Ă­liĹĄ brzy, tedy abychom
-mÃ\84Â\9bli dost prvkĹŻ k~rozÄ\82Å\9fÃ\84Â\8dtovÄ\82Ä\84\82­ Ã\84Â\8dasu.)
-
-PromÄ\9bnnou~$\mu$ nechĂĄme ukazovat na~mĂ­sto, kde jsme se pĹ\99i hledĂĄnĂ­ minima v~pĹ\99ihrĂĄdkĂĄch
-zastavili. SouÃ\84Â\8dasnÄ\82Å  globÄ\82Ä\84lnÄ\82­ minimum struktury mĹŻĹže bÄ\82Ë\9dt niĹžĹÄ\84Ä\82­, nachÄ\82Ä\84\82­-li se minimum
-zrovna v~haldÄ\9b. StĂĄle je vĹĄak zaruÄ\8deno, Ĺže pĹ\99ed~$\mu$ se nenachĂĄzĂ­ ĹžĂĄdnĂĄ
-neprĂĄzdnĂĄ pĹ\99ihrĂĄdka.
+Tehdy Dijkstra vydá výsledek v~Ä\8dase $\O(m + n\cdot{\log L\over\log\log L})$.
+
+\h{HOT Queue -- kombinace přihrádek s~haldou}
+
+Cherkassky, Goldberg a Silverstein \cite{cherkassky:hotq} si všimli, že ve~víceúrovňových přihrádkových strukturách
+platíme příliš mnoho za~úrovně, ve~kterých se za~dobu jejich existence objeví jen malé
+množství prvků. Navrhli tedy ukládat prvky z~\uv{malých} úrovní do~společné haldy.
+Výsledné struktuÅ\99e se Å\99íká HOT (Heap-on-Top) Queue. My si pÅ\99edvedeme její upravenou
+variantu (v~té původní se skrývá nÄ\9bkolik chyb).
+
+PoÅ\99ídíme si haldu, Å\99eknÄ\9bme Fibonacciho, a~navíc ke~každé Ãºrovni poÄ\8dítadlo udávající,
+kolik prvků z~této úrovně jsme uložili do~haldy. Dokud toto počítadlo nepřeroste nějaký
+parametr~$H$, pÅ\99ihrádky nebudeme zakládat a prvky poputují do~haldy. Ä\8cas $\O(B)$ na
+založení úrovně a její procházení proto můžeme rozpočítat mezi~$H$ prvků, které se musely
+na~dané Ãºrovni objevit, než byla rozpÅ\99ihrádkována. (PovÅ¡imnÄ\9bte si, Å¾e poÄ\8dítadlo nikdy
+nesnižujeme, pouze ho vynulujeme, když je ÃºroveÅ\88 zruÅ¡ena. Proto vůbec nemusí odpovídat
+skutečnému počtu prvků z~příslušné úrovně, které jsou právě uloženy v~haldě. To ovšem
+vůbec nevadí -- počítadlo pouze hlídá, aby se úroveň nevytvořila příliš brzy, tedy abychom
+mÄ\9bli dost prvků k~rozúÄ\8dtování Ä\8dasu.)
+
+Proměnnou~$\mu$ necháme ukazovat na~místo, kde jsme se při hledání minima v~přihrádkách
+zastavili. SouÄ\8dasné globální minimum struktury může být nižší, nachází-li se minimum
+zrovna v~haldě. Stále je však zaručeno, že před~$\mu$ se nenachází žádná
+neprázdná přihrádka.
 
 Operace budou fungovat takto:
 
 \>\<Insert>:
 \algo
-\:SpoÄ\8dĂ­tĂĄme, do~kterĂŠ ĂşrovnÄ\9b~$i$ mĂĄ prvek padnout (bitovĂ˝mi operacemi).
-\:Pokud je poÃ\84Â\8dÄ\82­tadlo tÄ\82Å to Ä\82Å\9frovnÃ\84Â\9b menĹÄ\84Ä\82­ neĹž~$H$, zvÄ\82Ë\9dĹÄ\84Ä\82­me ho, vloĹžÄ\82­me prvek do~haldy a skoÃ\84Â\8dÄ\82­me.
-\:Nebyly-li jeĹĄtÄ\9b pro tuto ĂşroveĹ\88 zaloĹženy pĹ\99ihrĂĄdky, vyrobĂ­me prĂĄzdnĂŠ.
-\:VloŞíme prvek do~pĹ\99Ă­sluĹĄnĂŠ pĹ\99ihrĂĄdky.
+\:Spočítáme, do~které úrovně~$i$ má prvek padnout (bitovými operacemi).
+\:Pokud je poÄ\8dítadlo této ÃºrovnÄ\9b menší než~$H$, zvýšíme ho, vložíme prvek do~haldy a skoÄ\8díme.
+\:Nebyly-li ještě pro tuto úroveň založeny přihrádky, vyrobíme prázdné.
+\:Vložíme prvek do~příslušné přihrádky.
 \endalgo
 
 \>\<Decrease>:
 \algo
-\:Pokud se prvek nachĂĄzĂ­ v~haldÄ\9b (to si u~kaĹždĂŠho prvku pamatujeme), provedeme
-  \<Decrease> v~haldÃ\84Â\9b a skonÃ\84Â\8dÄ\82­me.
-\:SmaĹžeme prvek z~jeho pĹ\99ihrĂĄdky a provedeme \<Insert> s~novou hodnotou.
+\:Pokud se prvek nachází v~haldě (to si u~každého prvku pamatujeme), provedeme
+  \<Decrease> v~haldÄ\9b a skonÄ\8díme.
+\:Smažeme prvek z~jeho přihrádky a provedeme \<Insert> s~novou hodnotou.
 \endalgo
 
 \>\<ExtractMin>:
 \algo
-\:Dokud je~$\mu$ menĹÄ\84Ä\82­ neĹž aktuÄ\82Ä\84lnÄ\82­ minimum haldy, opakujeme:
-\::Najdeme pĹÂ\99ihrÄ\82Ä\84dku odpovÄ\82­dajÄ\82­cÄ\82­ hodnotÃ\84Â\9b~$\mu$.
-\::Je-li tato pĹÂ\99ihrÄ\82Ä\84dka prÄ\82Ä\84zdnÄ\82Ä\84, pĹÂ\99ejdeme na~dalĹÄ\84Ä\82­ (upravÄ\82­me~$\mu$). Jsme-li na konci Ä\82Å\9frovnÃ\84Â\9b,
-   zruĹĄĂ­me ji, vynulujeme jejĂ­ poÄ\8dĂ­tadlo a pokraÄ\8dujeme o~ĂşroveĹ\88 výť.
-\::NenÄ\82­-li prÄ\82Ä\84zdnÄ\82Ä\84, rozprostĹÂ\99eme ji o~Ä\82Å\9froveĹÂ\88 nÄ\82­Ĺž (stejnÄ\82Ë\9dm zpĹŻsobem jako pĹÂ\99i \<Insert>u,
-   takĹže prvnÄ\82­ch~$H$ prvkĹŻ vloĹžÄ\82­me do~haldy).
-\:SmaĹžeme minimum z~haldy a vrĂĄtĂ­me ho jako vĂ˝sledek.
+\:Dokud je~$\mu$ menší než aktuální minimum haldy, opakujeme:
+\::Najdeme pÅ\99ihrádku odpovídající hodnotÄ\9b~$\mu$.
+\::Je-li tato pÅ\99ihrádka prázdná, pÅ\99ejdeme na~další (upravíme~$\mu$). Jsme-li na konci ÃºrovnÄ\9b,
+   zrušíme ji, vynulujeme její počítadlo a pokračujeme o~úroveň výš.
+\::Není-li prázdná, rozprostÅ\99eme ji o~úroveÅ\88 níž (stejným způsobem jako pÅ\99i \<Insert>u,
+   takže prvních~$H$ prvků vložíme do~haldy).
+\:Smažeme minimum z~haldy a vrátíme ho jako výsledek.
 \endalgo
 
-\>PustĂ­me se do~analĂ˝zy sloĹžitosti. Jako parametry si zvolĂ­me poÄ\8det hladin~$d$ (takĹže
-poÄ\8det pĹ\99ihrĂĄdek~$B$ na jednĂŠ Ăşrovni je roven $L^{1/d}$) a \uv{haldovou konstantu}~$H$.
+\>Pustíme se do~analýzy složitosti. Jako parametry si zvolíme počet hladin~$d$ (takže
+počet přihrádek~$B$ na jedné úrovni je roven $L^{1/d}$) a \uv{haldovou konstantu}~$H$.
 
-Nejprve si vĹÄ\84imneme, Ä¹Å¾e neĹž poÃ\84Â\8dÄ\82­tadlo nÃ\84Â\9bjakÄ\82Å  Ä\82Å\9frovnÃ\84Â\9b vynulujeme, jsou bezpeÃ\84Â\8d\84Â\9b
-z~haldy pryÃ\84Â\8d vĹÄ\84echny prvky patĹÂ\99Ä\82­cÄ\82­ do~tÄ\82Å to Ä\82Å\9frovnÃ\84Â\9b. Celkem se tedy v~haldÃ\84Â\9b
-vyskytuje nejvýťe $\O(dH)$ prvkĹŻ. \<ExtractMin> v~haldÄ\9b proto trvĂĄ $\O(\log(dH))$,
-ostatnĂ­ haldovĂŠ operace $\O(1)$.
+Nejprve si vÅ¡imneme, Å¾e než poÄ\8dítadlo nÄ\9bjaké ÃºrovnÄ\9b vynulujeme, jsou bezpeÄ\8d\9b
+z~haldy pryÄ\8d vÅ¡echny prvky patÅ\99ící do~této ÃºrovnÄ\9b. Celkem se tedy v~haldÄ\9b
+vyskytuje nejvýše $\O(dH)$ prvků. \<ExtractMin> v~haldě proto trvá $\O(\log(dH))$,
+ostatní haldové operace $\O(1)$.
 
-NynÄ\82­ rozÄ\82Å\9fÃ\84Â\8dtujeme Ã\84Â\8das operacÄ\82­ mezi jednotlivÄ\82Å  prvky (opÃ\84Â\9bt si vĹÄ\84e pĹÂ\99edplatÄ\82­me
-v~\<Insert>u a ostatnÄ\82­ operace pobÃ\84Â\9bĹžÄ\82­ v~amortizovanÃ\84Â\9b konstantnÄ\82­m Ã\84Â\8dase):
+Nyní rozúÄ\8dtujeme Ä\8das operací mezi jednotlivé prvky (opÄ\9bt si vÅ¡e pÅ\99edplatíme
+v~\<Insert>u a ostatní operace pobÄ\9bží v~amortizovanÄ\9b konstantním Ä\8dase):
 
 \itemize\ibull
-\:KaĹždĂ˝ prvek mĹŻĹže bĂ˝t nejvýťe jednou za~dobu svĂŠho Ĺživota vloĹžen do~haldy
-  a nejvÄ\82Ë\9dĹÄ\84e jednou z~nÄ\82­ vyjmut. Na~obojÄ\82­ dohromady pĹÂ\99ispÃ\84Â\9bje $\O(\log dH)$.
-\:Prvek se Ä\82Å\9fÃ\84Â\8dastnÄ\82­ nejvÄ\82Ë\9dĹÄ\84e~$d$ pĹÂ\99ehozenÄ\82­ do~niĹžĹÄ\84Ä\82­ Ä\82Å\9frovnÃ\84Â\9b. Pokud byl pĹÂ\99ihozen
-  do~haldy, uĹž tam setrvĂĄ, jinak pokaĹždĂŠ zaplatĂ­ $\O(1)$ za~zaĹ\99azenĂ­ do~pĹ\99ihrĂĄdky,
+\:Každý prvek může být nejvýše jednou za~dobu svého života vložen do~haldy
+  a nejvýše jednou z~ní vyjmut. Na~obojí dohromady pÅ\99ispÄ\9bje $\O(\log dH)$.
+\:Prvek se ÃºÄ\8dastní nejvýše~$d$ pÅ\99ehození do~nižší ÃºrovnÄ\9b. Pokud byl pÅ\99ihozen
+  do~haldy, už tam setrvá, jinak pokaždé zaplatí $\O(1)$ za~zařazení do~přihrádky,
   celkem tedy $\O(d)$ na prvek.
-\:VytvoĹ\99enĂ­, projitĂ­ a smazĂĄnĂ­ pĹ\99ihrĂĄdek na~jednĂŠ Ăşrovni nastane aĹž tehdy, co bylo
-  $H$~prvkĹŻ patĹ\99Ă­cĂ­ch do~tĂŠto ĂşrovnÄ\9b vloĹženo do~haldy. StaÄ\8dĂ­ tedy, aby kaĹždĂ˝
-  prvek pĹÂ\99ispÃ\84Â\9bl Ã\84Â\8dasem $\O(B/H) = \O(L^{1/d}/H)$.
+\:Vytvoření, projití a smazání přihrádek na~jedné úrovni nastane až tehdy, co bylo
+  $H$~prvků patřících do~této úrovně vloženo do~haldy. Stačí tedy, aby každý
+  prvek pÅ\99ispÄ\9bl Ä\8dasem $\O(B/H) = \O(L^{1/d}/H)$.
 \endlist
 
-\>KaĹždÄ\82Ë\9d prvek tedy platÄ\82­ $\O(d + \log dH + L^{1/d}/H) = \O(d + \log H + L^{1/d}/H)$.
-PojÄ\8fme najĂ­t nastavenĂ­ parametrĹŻ, kterĂŠ tento vĂ˝raz minimalizuje.
+\>Každý prvek tedy platí $\O(d + \log dH + L^{1/d}/H) = \O(d + \log H + L^{1/d}/H)$.
+Pojďme najít nastavení parametrů, které tento výraz minimalizuje.
 Nejprve zvolme~$H$ tak, aby se~$d$ vyrovnalo s~$L^{1/d}/H$. Tedy $H = L^{1/d}/d$.
-CelÄ\82Ë\9d vÄ\82Ë\9draz tÄ\82­m zjednoduĹÄ\84Ä\82­me na $\O(d + \log\,(L^{1/d}/d))$ =
-$\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Oba sÃ\84Â\8dÄ\82­tance volbou
-$d=\sqrt{\log L}$ vyrovnĂĄme.
+Celý výraz tím zjednodušíme na $\O(d + \log\,(L^{1/d}/d))$ =
+$\O(d + 1/d\cdot\log L - \log d) = \O(d + 1/d\cdot\log L)$. Oba sÄ\8dítance volbou
+$d=\sqrt{\log L}$ vyrovnáme.
 
-HOT Queue tedy zvlÄ\82Ä\84dne \<Insert> s~amortizovanou Ã\84Â\8dasovou sloĹžitostÄ\82­ $\O(\sqrt{\log L})$
-a ostatnĂ­ operace v~Ä\8dase amortizovanÄ\9b konstantnĂ­m. PouĹžijeme-li tuto strukturu
-v~DijkstrovÃ\84Â\9b algoritmu, spoÃ\84Â\8dte vzdÄ\82Ä\84lenosti v~Ã\84Â\8dase $\O(m + n\sqrt{\log L})$.
+HOT Queue tedy zvládne \<Insert> s~amortizovanou Ä\8dasovou složitostí $\O(\sqrt{\log L})$
+a ostatní operace v~čase amortizovaně konstantním. Použijeme-li tuto strukturu
+v~DijkstrovÄ\9b algoritmu, spoÄ\8dte vzdálenosti v~Ä\8dase $\O(m + n\sqrt{\log L})$.
 
-\h{DinicĹŻv algoritmus}
+\h{Dinicův algoritmus}
 
-ZajĂ­mavĂŠ vylepĹĄenĂ­ Dijkstrova algoritmu navrhl Dinic. VĹĄiml si, Ĺže pokud
-je kaĹždÄ\82Ä\84 hrana dlouhÄ\82Ä\84 alespoĹÂ\88~$\delta$, mĹŻĹžeme uzavÄ\82­rat nejen
-vrchol s~minimÄ\82Ä\84lnÄ\82­m ohodnocenÄ\82­m~$\mu$, ale i vĹÄ\84echny s~ohodnocenÄ\82­m
-menĹĄĂ­m neĹž $\mu+\delta$.
+Zajímavé vylepšení Dijkstrova algoritmu navrhl Dinic. Všiml si, že pokud
+je každá hrana dlouhá alespoÅ\88~$\delta$, můžeme uzavírat nejen
+vrchol s~minimálním ohodnocením~$\mu$, ale i vÅ¡echny s~ohodnocením
+menším než $\mu+\delta$.
 
-Pro takto upravenÄ\82Ë\9d DijkstrĹŻv algoritmus bude stÄ\82Ä\84le platit, Ä¹Å¾e pĹÂ\99i uzavÄ\82­rÄ\82Ä\84\82­
-vrcholu odpovĂ­dĂĄ ohodnocenĂ­ skuteÄ\8dnĂŠ vzdĂĄlenosti, takĹže uzavĹ\99enĂŠ vrcholy jiĹž
-nejsou znovu otevĂ­rĂĄny.
+Pro takto upravený Dijkstrův algoritmus bude stále platit, Å¾e pÅ\99i uzavírání
+vrcholu odpovídá ohodnocení skutečné vzdálenosti, takže uzavřené vrcholy již
+nejsou znovu otevírány.
 
-O~monotonii vzdÄ\82Ä\84lenostÄ\82­ jsme sice pĹÂ\99iĹÄ\84li, ale v~pĹÂ\99ihrÄ\82Ä\84dkovÄ\82Å  struktuĹÂ\99e nebo
-haldÃ\84Â\9b mĹŻĹžeme klÄ\82­Ã\84Â\8de nahradit hodnotami $h'(v) := \lfloor h(v)/\delta \rfloor$.
-Tyto hodnoty se totiĹž chovajĂ­ monotĂłnnÄ\9b a vrcholy se stejnĂ˝m $h'(v)$ mĹŻĹžeme
-libovolnÃ\84Â\9b zamÃ\84Â\9bĹÂ\88ovat.
+O~monotonii vzdáleností jsme sice pÅ\99iÅ¡li, ale v~pÅ\99ihrádkové struktuÅ\99e nebo
+haldÄ\9b můžeme klíÄ\8de nahradit hodnotami $h'(v) := \lfloor h(v)/\delta \rfloor$.
+Tyto hodnoty se totiž chovají monotónně a vrcholy se stejným $h'(v)$ můžeme
+libovolnÄ\9b zamÄ\9bÅ\88ovat.
 
-Kteroukoli z~popsanÄ\82Ë\9dch pĹÂ\99ihrÄ\82Ä\84dkovÄ\82Ë\9dch struktur mĹŻĹžeme tedy pouĹžÄ\82­t, pouze
-v~rozboru Ã\84Â\8dasovÄ\82Å  sloĹžitosti nahradÄ\82­me~$L$ vÄ\82Ë\9drazem $L/\delta$. Tento pĹÂ\99Ä\82­stup
-pĹÂ\99itom funguje i pro neceloÃ\84Â\8dÄ\82­selnÄ\82Å  dÄ\82Å lky hran, pouze potĹÂ\99ebujeme mÄ\82­t pĹÂ\99edem
-k~dispozici netriviĂĄlnĂ­ dolnĂ­ odhad na~vĹĄechny dĂŠlky.
+Kteroukoli z~popsaných pÅ\99ihrádkových struktur můžeme tedy použít, pouze
+v~rozboru Ä\8dasové složitosti nahradíme~$L$ výrazem $L/\delta$. Tento pÅ\99ístup
+pÅ\99itom funguje i pro neceloÄ\8díselné délky hran, pouze potÅ\99ebujeme mít pÅ\99edem
+k~dispozici netriviální dolní odhad na~všechny délky.
 
-\h{PotenciĂĄly}
+\h{Potenciály}
 
-VidÃ\84Â\9bli jsme, Ä¹Å¾e v~grafech s~nezÄ\82Ä\84pornÄ\82Ë\9dmi dÄ\82Å lkami hran se nejkratĹÄ\84Ä\82­ cesty
-hledajĂ­ snĂĄze. NabĂ­zĂ­ se nalĂŠzt nÄ\9bjakou transformaci, kterĂĄ by
-dovedla dÄ\82Å lky hran upravit tak, aby byly nejkratĹÄ\84Ä\82­ cesty zachovÄ\82Ä\84ny (samozĹÂ\99ejmÃ\84Â\9b
-ne jejich dÄ\82Å lky, ale alespoĹÂ\88 to, kterÄ\82Å  cesty jsou nejkratĹÄ\84Ä\82­). NabÄ\82­zÄ\82­ se
-nÄ\82Ä\84sledujÄ\82­cÄ\82­ fyzikÄ\82Ä\84lnÄ\82­ inspirace:
+VidÄ\9bli jsme, Å¾e v~grafech s~nezápornými délkami hran se nejkratší cesty
+hledají snáze. Nabízí se nalézt nějakou transformaci, která by
+dovedla délky hran upravit tak, aby byly nejkratší cesty zachovány (samozÅ\99ejmÄ\9b
+ne jejich délky, ale alespoÅ\88 to, které cesty jsou nejkratší). Nabízí se
+následující fyzikální inspirace:
 
-\s{Definice:} {\I PotenciĂĄl} budeme Ĺ\99Ă­kat libovolnĂŠ funkci $\psi: V\rightarrow {\bb R}$.
-Pro kaĹždĂ˝ potenciĂĄl zavedeme {\I redukovanĂŠ dĂŠlky hran} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
-PotenciĂĄl nazveme {\I pĹ\99Ă­pustnĂ˝,} pokud ĹžĂĄdnĂĄ hrana nemĂĄ zĂĄpornou redukovanou dĂŠlku.
+\s{Definice:} {\I Potenciál} budeme říkat libovolné funkci $\psi: V\rightarrow {\bb R}$.
+Pro každý potenciál zavedeme {\I redukované délky hran} $\ell_\psi(u,v) := \ell(u,v) + \psi(u) - \psi(v)$.
+Potenciál nazveme {\I přípustný,} pokud žádná hrana nemá zápornou redukovanou délku.
 
-\s{PozorovÄ\82Ä\84\82­:} Pro redukovanou dÄ\82Å lku libovolnÄ\82Å  cesty~$P$ z~$u$ do~$v$ platÄ\82­: $\ell_\psi(P) = \ell(P) + \psi(u) - \psi(v)$.
+\s{Pozorování:} Pro redukovanou délku libovolné cesty~$P$ z~$u$ do~$v$ platí: $\ell_\psi(P) = \ell(P) + \psi(u) - \psi(v)$.
 
 \proof
-NechĹĽ cesta~$P$ prochÄ\82Ä\84\82­ pĹÂ\99es vrcholy $u=w_1,\ldots,w_k=v$. Potom:
+NechÅ¥ cesta~$P$ prochází pÅ\99es vrcholy $u=w_1,\ldots,w_k=v$. Potom:
 $$
 \ell_\psi(P) = \sum_i \ell_\psi(w_i,w_{i+1}) = \sum_i \left( \ell(w_i,w_{i+1}) + \psi(w_i) - \psi(w_{i+1}) \right).
 $$
-Tato suma je ovĹÄ\84em teleskopickÄ\82Ä\84, takĹže z~nÄ\82­ zbude
+Tato suma je ovÅ¡em teleskopická, takže z~ní zbude
 $$
 \sum_i\ell(w_i,w_{i+1}) + \psi(w_1) - \psi(w_k) = \ell(P) + \psi(u) - \psi(v).
 $$
 \vskip-\baselineskip
 \qed
 
-\s{DĹŻsledek:} PotenciĂĄlovou redukcĂ­ se dĂŠlky vĹĄech cest mezi~$u$ a~$v$
-zmÃ\84Â\9b\82­ o~tutÄ\82ŠĹž konstantu, takĹže struktura nejkratĹÄ\84Ä\82­ch cest zĹŻstane nezmÃ\84Â\9b\84Â\9bna.
+\s{Důsledek:} Potenciálovou redukcí se délky všech cest mezi~$u$ a~$v$
+zmÄ\9bní o~tutéž konstantu, takže struktura nejkratších cest zůstane nezmÄ\9b\9bna.
 
-ZbÄ\82Ë\9d\82Ä\84 pĹÂ\99ijÄ\82­t na~to, kde si obstarat nÃ\84Â\9bjakÄ\82Ë\9d pĹÂ\99Ä\82­pustnÄ\82Ë\9d potenciÄ\82Ä\84l. PĹÂ\99idejme do~grafu
-novĂ˝ vrchol~$z$, pĹ\99iveÄ\8fme z~nÄ\9bj hrany nulovĂŠ dĂŠlky do~vĹĄech ostatnĂ­ch vrcholĹŻ
-a~oznaÄ\8dme~$\psi(v)$ vzdĂĄlenost ze~$z$ do~$v$ v~tomto grafu. Aby byl tento potenciĂĄl
-pĹ\99Ă­pustnĂ˝, musĂ­ pro kaĹždou hranu $uv$ platit $\ell_\psi(u,v) = \ell(u,v) + \psi(u) - \psi(v) \ge 0$.
-Tuto nerovnost mĹŻĹžeme upravit na $\ell(u,v) + d(z,u) - d(z,v) \ge 0$, Ã\84Â\8dili
-$d(z,u) + \ell(u,v) \ge d(z,v)$, coĹž je ale obyÄ\8dejnĂĄ trojĂşhelnĂ­kovĂĄ nerovnost
-pro vzdÄ\82Ä\84lenost v~grafu, kterÄ\82Ä\84 jistÃ\84Â\9b platÄ\82­.
+Zbývá pÅ\99ijít na~to, kde si obstarat nÄ\9bjaký pÅ\99ípustný potenciál. PÅ\99idejme do~grafu
+nový vrchol~$z$, přiveďme z~něj hrany nulové délky do~všech ostatních vrcholů
+a~označme~$\psi(v)$ vzdálenost ze~$z$ do~$v$ v~tomto grafu. Aby byl tento potenciál
+přípustný, musí pro každou hranu $uv$ platit $\ell_\psi(u,v) = \ell(u,v) + \psi(u) - \psi(v) \ge 0$.
+Tuto nerovnost můžeme upravit na $\ell(u,v) + d(z,u) - d(z,v) \ge 0$, Ä\8dili
+$d(z,u) + \ell(u,v) \ge d(z,v)$, což je ale obyčejná trojúhelníková nerovnost
+pro vzdálenost v~grafu, která jistÄ\9b platí.
 
-JednÄ\82­m vÄ\82Ë\9dpoÃ\84Â\8dtem nejkratĹÄ\84Ä\82­ch cest v~grafu se zÄ\82Ä\84pornÄ\82Ë\9dmi hranami (tĹÂ\99eba algoritmem BFM)
-tedy dokĂĄĹžeme spoÄ\8dĂ­tat potenciĂĄl, kterĂ˝ nĂĄm poslouŞí k~redukci vĹĄech hran na~nezĂĄpornĂŠ
-dÄ\82Å lky. To nÄ\82Ä\84m samozĹÂ\99ejmÃ\84Â\9b nepomĹŻĹže, chceme-li jednorÄ\82Ä\84zovÃ\84Â\9b hledat nejkratĹÄ\84Ä\82­ cestu,
-ale mĹŻĹže nÄ\82Ä\84m to vÄ\82Ë\9draznÃ\84Â\9b zjednoduĹÄ\84it dalĹÄ\84Ä\82­, sloĹžitÃ\84Â\9bjĹÄ\84Ä\82­ prÄ\82Ä\84ci s~grafem. Jak uvidÄ\82­me
-v~pĹ\99Ă­ĹĄtĂ­ kapitole, mĹŻĹžeme tak napĹ\99Ă­klad nalĂŠzt vzdĂĄlenosti mezi vĹĄemi dvojicemi
-vrcholĹŻ v~Ã\84Â\8dase $\O(nm + n^2\log n)$.
+Jedním výpoÄ\8dtem nejkratších cest v~grafu se zápornými hranami (tÅ\99eba algoritmem BFM)
+tedy dokážeme spočítat potenciál, který nám poslouží k~redukci všech hran na~nezáporné
+délky. To nám samozÅ\99ejmÄ\9b nepomůže, chceme-li jednorázovÄ\9b hledat nejkratší cestu,
+ale může nám to výraznÄ\9b zjednoduÅ¡it další, složitÄ\9bjší práci s~grafem. Jak uvidíme
+v~příští kapitole, můžeme tak například nalézt vzdálenosti mezi všemi dvojicemi
+vrcholů v~Ä\8dase $\O(nm + n^2\log n)$.
 
-Na~zĂĄvÄ\9br tohoto oddĂ­lu dokĂĄĹžeme jedno pomocnĂŠ tvrzenĂ­ o~potenciĂĄlech, kterĂŠ
-nĂĄm pomĹŻĹže v~konstrukci algoritmĹŻ typu \ppsp:
+Na~závěr tohoto oddílu dokážeme jedno pomocné tvrzení o~potenciálech, které
+nám pomůže v~konstrukci algoritmů typu \ppsp:
 
-\s{Lemma:} Pokud $f$ a~$g$ jsou pĹ\99Ă­pustnĂŠ potenciĂĄly, pak jsou jimi i:
+\s{Lemma:} Pokud $f$ a~$g$ jsou přípustné potenciály, pak jsou jimi i:
 \numlist\ndotted
-\:konvexnĂ­ kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolnĂŠ $\alpha,\beta\ge 0, \alpha+\beta=1$;
+\:konvexní kombinace $f$ a~$g$, tedy $\alpha f + \beta g$ pro libovolné $\alpha,\beta\ge 0, \alpha+\beta=1$;
 \:$\min(f,g)$;
 \:$\max(f,g)$.
 \endlist
 
-\proof BuÃ\84Â\8f $uv$ hrana. Potom z~definice pĹÂ\99Ä\82­pustnosti platÄ\82­ $\ell(u,v) \ge f(v) - f(u)$ a $\ell(u,v) \ge g(v) - g(u)$.
-JednotlivĂŠ Ä\8dĂĄsti tvrzenĂ­ dokĂĄĹžeme takto:
+\proof BuÄ\8f $uv$ hrana. Potom z~definice pÅ\99ípustnosti platí $\ell(u,v) \ge f(v) - f(u)$ a $\ell(u,v) \ge g(v) - g(u)$.
+Jednotlivé části tvrzení dokážeme takto:
 \numlist\ndotted
-\:Pokud obÃ\84Â\9b strany nerovnosti pro~$f$ vynÄ\82Ä\84sobÄ\82­me konstantou~$\alpha$, u~nerovnosti pro~$g$
-  konstantou~$\beta$ a obÃ\84Â\9b nerovnosti seÃ\84Â\8dteme, dostaneme:
+\:Pokud obÄ\9b strany nerovnosti pro~$f$ vynásobíme konstantou~$\alpha$, u~nerovnosti pro~$g$
+  konstantou~$\beta$ a obÄ\9b nerovnosti seÄ\8dteme, dostaneme:
   $$
   (\alpha+\beta) \cdot \ell(u,v) \ge (\alpha f(v) + \beta g(v)) - (\alpha f(u) + \beta g(u)),
   $$
-  coĹž je pĹÂ\99esnÃ\84Â\9b poĹžadovanÄ\82Ä\84 nerovnost pro pĹÂ\99Ä\82­pustnost funkce $\alpha f+\beta g$.
-\:OznaÃ\84Â\8dme $h := \min(f,g)$. NechĹĽ bez Ä\82Å\9fjmy na obecnosti $f(u)\le g(u)$. Pokud takÄ\82Å  platÄ\82­ $f(v)\le g(v)$,
-  shoduje se minimum s~funkcÄ\82­~$f$ a nenÄ\82­ co dokazovat. V~opaÃ\84Â\8d\82Å m pĹÂ\99Ä\82­padÃ\84Â\9b je $h(u) = f(u)$, $h(v) = g(v)$.
-  Tehdy si staÄ\8dĂ­ vĹĄimnout, Ĺže $h(v) - h(u) = g(v) - f(u) < f(v) - f(u) \le \ell(u,v)$, takĹže
-  potenciĂĄl~$h$ je pĹ\99Ă­pustnĂ˝.
-\:DokĂĄĹžeme analogicky.
+  což je pÅ\99esnÄ\9b požadovaná nerovnost pro pÅ\99ípustnost funkce $\alpha f+\beta g$.
+\:OznaÄ\8dme $h := \min(f,g)$. NechÅ¥ bez Ãºjmy na obecnosti $f(u)\le g(u)$. Pokud také platí $f(v)\le g(v)$,
+  shoduje se minimum s~funkcí~$f$ a není co dokazovat. V~opaÄ\8dném pÅ\99ípadÄ\9b je $h(u) = f(u)$, $h(v) = g(v)$.
+  Tehdy si stačí všimnout, že $h(v) - h(u) = g(v) - f(u) < f(v) - f(u) \le \ell(u,v)$, takže
+  potenciál~$h$ je přípustný.
+\:Dokážeme analogicky.
 \qeditem
 \endlist
 
-\h{Algoritmy pro problĂŠm typu \ppsp}
-
-ZamÃ\84Â\9bĹÂ\99me se nynÄ\82­ na~pĹÂ\99Ä\82­pad, kdy chceme hledat nejkratĹÄ\84Ä\82­ cesty mezi zadanou dvojicÄ\82­
-vrcholĹŻ $s$,~$t$. Obvykle se i v~tĂŠto situaci pouŞívajĂ­ algoritmy \sssp{} (SSSP) a v~obecnĂŠm
-pĹ\99Ă­padÄ\9b ani nenĂ­ efektivnÄ\9bjĹĄĂ­ Ĺ\99eĹĄenĂ­ znĂĄmo. Existuje ovĹĄem velkĂŠ mnoĹžstvĂ­ heuristik, kterĂ˝mi
-lze obvykle vÄ\82Ë\9dpoÃ\84Â\8det zrychlit. NÃ\84Â\9bkterÄ\82Å  z~nich si pĹÂ\99edvedeme na DijkstrovÃ\84Â\9b algoritmu.
-
-DijkstrĹŻv algoritmus ve~svĂŠ klasickĂŠ podobÄ\9b nevĂ­ vĹŻbec nic o~cĂ­lovĂŠm vrcholu a
-prohledÄ\82Ä\84 celÄ\82Ë\9d graf. Hned se nabÄ\82­zÄ\82­ vyuĹžÄ\82­t toho, Ä¹Å¾e od~okamĹžiku uzavĹÂ\99enÄ\82­
-kterĂŠhokoliv vrcholu se jiĹž jeho ohodnocenĂ­ nezmÄ\9bnĂ­. Pokud tedy uzavĹ\99eme cĂ­lovĂ˝
-vrchol, mĹŻĹžeme se zastavit.
-
-Jakou Ã\84Â\8dÄ\82Ä\84st grafu prohledÄ\82Ä\84\82Ä\84me teÃ\84Â\8f? V~metrice danÄ\82Å  vzdÄ\82Ä\84lenostmi v~grafu je to nejmenĹÄ\84Ä\82­
-koule se stĹÂ\99edem ve~vrcholu~$u$, kterÄ\82Ä\84 obsahuje nejkratĹÄ\84Ä\82­ cestu (dobĹÂ\99e se to
-pĹÂ\99edstavuje na~hledÄ\82Ä\84\82­ v~silniÃ\84Â\8d\82­ sÄ\82­ti na~rovinnÄ\82Å  mapÃ\84Â\9b).
-
-TakÄ\82Å  mĹŻĹžeme spustit prohledÄ\82Ä\84\82Ä\84\82­ z~obou koncĹŻ zÄ\82Ä\84roveĹÂ\88, tedy zkombinovat hledÄ\82Ä\84\82­
-od~$s$ v~pĹŻvodnÄ\82­m grafu s~hledÄ\82Ä\84\82­m od~$t$ v~grafu s~obrÄ\82Ä\84cenou orientacÄ\82­ hran.
-Oba postupy mĹŻĹžeme libovolnÄ\9b stĹ\99Ă­dat a zastavĂ­me se v~okamĹžiku, kdy jsme jeden
-vrchol uzavĹÂ\99eli v~obou smÃ\84Â\9brech. Pozor ovĹÄ\84em na to, Ä¹Å¾e souÃ\84Â\8det obou ohodnocenÄ\82­
-tohoto vrcholu nemusÄ\82­ bÄ\82Ë\9dt roven $d(v,u)$ -- zkuste vymyslet protipĹÂ\99Ä\82­klad.
-NejkratĹÄ\84Ä\82­ cesta jeĹÄ\84\84Â\9b mĹŻĹže vypadat tak, Ä¹Å¾e pĹÂ\99echÄ\82Ä\84\82­ po nÃ\84Â\9bjakÄ\82Å  hranÃ\84Â\9b mezi vrcholem
-uzavĹ\99enĂ˝m v~jednom smÄ\9bru a vrcholem uzavĹ\99enĂ˝m ve~smÄ\9bru druhĂŠm (ponechme bez dĹŻkazu).
-StaÄ\8dĂ­ tedy bÄ\9bhem relaxace zjistit, zda je konec hrany uzavĹ\99enĂ˝ v~opaÄ\8dnĂŠm
-smÄ\9bru prohledĂĄvĂĄnĂ­, a~pokud ano, zapoÄ\8dĂ­tat cestu do~prĹŻbÄ\9bĹžnĂŠho minima.
-
-ObousmÃ\84Â\9brnÄ\82Ë\9d DijkstrĹŻv algoritmus projde sjednocenÄ\82­ nÃ\84Â\9bjakÄ\82Å  koule okolo~$s$ s~nÃ\84Â\9bjakou
-koulÄ\82­ okolo~$t$, kterÄ\82Å  obsahuje nejkratĹÄ\84Ä\82­ cestu. PrĹŻmÃ\84Â\9bry koulÄ\82­ pĹÂ\99itom zÄ\82Ä\84visÄ\82­ na tom,
-jak budeme bÃ\84Â\9bhem vÄ\82Ë\9dpoÃ\84Â\8dtu stĹÂ\99Ä\82­dat oba smÃ\84Â\9bry prohledÄ\82Ä\84\82Ä\84\82­. V~nejhorĹÄ\84Ä\82­m pĹÂ\99Ä\82­padÃ\84Â\9b samozĹÂ\99ejmÃ\84Â\9b
-mĹŻĹžeme prohledat celĂ˝ graf.
+\h{Algoritmy pro problém typu \ppsp}
+
+ZamÄ\9bÅ\99me se nyní na~pÅ\99ípad, kdy chceme hledat nejkratší cesty mezi zadanou dvojicí
+vrcholů $s$,~$t$. Obvykle se i v~této situaci používají algoritmy \sssp{} (SSSP) a v~obecném
+případě ani není efektivnější řešení známo. Existuje ovšem velké množství heuristik, kterými
+lze obvykle výpoÄ\8det zrychlit. NÄ\9bkteré z~nich si pÅ\99edvedeme na DijkstrovÄ\9b algoritmu.
+
+Dijkstrův algoritmus ve~své klasické podobě neví vůbec nic o~cílovém vrcholu a
+prohledá celý graf. Hned se nabízí využít toho, Å¾e od~okamžiku uzavÅ\99ení
+kteréhokoliv vrcholu se již jeho ohodnocení nezmění. Pokud tedy uzavřeme cílový
+vrchol, můžeme se zastavit.
+
+Jakou Ä\8dást grafu prohledáváme teÄ\8f? V~metrice dané vzdálenostmi v~grafu je to nejmenší
+koule se stÅ\99edem ve~vrcholu~$u$, která obsahuje nejkratší cestu (dobÅ\99e se to
+pÅ\99edstavuje na~hledání v~silniÄ\8dní síti na~rovinné mapÄ\9b).
+
+Také můžeme spustit prohledávání z~obou konců zároveÅ\88, tedy zkombinovat hledání
+od~$s$ v~původním grafu s~hledáním od~$t$ v~grafu s~obrácenou orientací hran.
+Oba postupy můžeme libovolně střídat a zastavíme se v~okamžiku, kdy jsme jeden
+vrchol uzavÅ\99eli v~obou smÄ\9brech. Pozor ovÅ¡em na to, Å¾e souÄ\8det obou ohodnocení
+tohoto vrcholu nemusí být roven $d(v,u)$ -- zkuste vymyslet protipÅ\99íklad.
+Nejkratší cesta jeÅ¡tÄ\9b může vypadat tak, Å¾e pÅ\99echází po nÄ\9bjaké hranÄ\9b mezi vrcholem
+uzavřeným v~jednom směru a vrcholem uzavřeným ve~směru druhém (ponechme bez důkazu).
+Stačí tedy během relaxace zjistit, zda je konec hrany uzavřený v~opačném
+směru prohledávání, a~pokud ano, započítat cestu do~průběžného minima.
+
+ObousmÄ\9brný Dijkstrův algoritmus projde sjednocení nÄ\9bjaké koule okolo~$s$ s~nÄ\9bjakou
+koulí okolo~$t$, které obsahuje nejkratší cestu. PrůmÄ\9bry koulí pÅ\99itom závisí na tom,
+jak budeme bÄ\9bhem výpoÄ\8dtu stÅ\99ídat oba smÄ\9bry prohledávání. V~nejhorším pÅ\99ípadÄ\9b samozÅ\99ejmÄ\9b
+můžeme prohledat celý graf.
 
 \h{Algoritmus \astar}
 
-V~umÄ\9blĂŠ inteligenci se Ä\8dasto pro hledĂĄnĂ­ nejkratĹĄĂ­ cesty v~rozsĂĄhlĂ˝ch grafech
-(obvykle stavovĂ˝ch prostorech Ăşloh) pouŞívĂĄ algoritmus nazĂ˝vanĂ˝~\astar{} \cite{hart:astar}.
-JednĂĄ se o~modifikaci Dijkstrova algoritmu, kterĂĄ vyuŞívĂĄ heuristickou funkci
-pro dolnÄ\82­ odhad vzdÄ\82Ä\84lenosti do~cÄ\82­le; oznaÃ\84Â\8dme si ji $\psi(v)$. V~kaĹždÄ\82Å m kroku pak uzavÄ\82­ra
-vrchol~$v$ s~nejmenĹÄ\84Ä\82­m moĹžnÄ\82Ë\9dm souÃ\84Â\8dtem $h(v)+\psi(v)$ aktuÄ\82Ä\84lnÄ\82­ho ohodnocenÄ\82­ s~heuristikou.
+V~umělé inteligenci se často pro hledání nejkratší cesty v~rozsáhlých grafech
+(obvykle stavových prostorech úloh) používá algoritmus nazývaný~\astar{} \cite{hart:astar}.
+Jedná se o~modifikaci Dijkstrova algoritmu, která využívá heuristickou funkci
+pro dolní odhad vzdálenosti do~cíle; oznaÄ\8dme si ji $\psi(v)$. V~každém kroku pak uzavíra
+vrchol~$v$ s~nejmenším možným souÄ\8dtem $h(v)+\psi(v)$ aktuálního ohodnocení s~heuristikou.
 
-Intuice za tÄ\82­mto algoritmem je jasnÄ\82Ä\84: pokud vÄ\82­me, Ä¹Å¾e nÃ\84Â\9bjakÄ\82Ë\9d vrchol je blÄ\82­zko
-od~poÃ\84Â\8dÄ\82Ä\84taÃ\84Â\8d\82­ho vrcholu~$s$, ale bude z~nÃ\84Â\9bj urÃ\84Â\8ditÃ\84Â\9b daleko do cÄ\82­le~$t$, zatÄ\82­m ho
-odloĹžÄ\82­me a budeme zkoumat nadÃ\84Â\9bjnÃ\84Â\9bjĹÄ\84Ä\82­ varianty.
+Intuice za tímto algoritmem je jasná: pokud víme, Å¾e nÄ\9bjaký vrchol je blízko
+od~poÄ\8dátaÄ\8dního vrcholu~$s$, ale bude z~nÄ\9bj urÄ\8ditÄ\9b daleko do cíle~$t$, zatím ho
+odložíme a budeme zkoumat nadÄ\9bjnÄ\9bjší varianty.
 
-Heuristika se pĹ\99itom volĂ­ podle konkrĂŠtnĂ­ho problĂŠmu -- napĹ\99. hledĂĄme-li cestu
-v~mapÃ\84Â\9b, mĹŻĹžeme pouĹžÄ\82­t vzdÄ\82Ä\84lenost do~cÄ\82­le vzduĹÄ\84nou Ã\84Â\8darou.
+Heuristika se přitom volí podle konkrétního problému -- např. hledáme-li cestu
+v~mapÄ\9b, můžeme použít vzdálenost do~cíle vzduÅ¡nou Ä\8darou.
 
-Je u~tohoto algoritmu zaruÃ\84Â\8deno, Ä¹Å¾e vĹždy najde nejkratĹÄ\84Ä\82­ cestu? Na to nÄ\82Ä\84m dÄ\82Ä\84 odpovÃ\84Â\9bÃ\84Â\8f
-teorie potenciĂĄlĹŻ:
+Je u~tohoto algoritmu zaruÄ\8deno, Å¾e vždy najde nejkratší cestu? Na to nám dá odpovÄ\9bÄ\8f
+teorie potenciálů:
 
-\s{VÃ\84Â\9bta:} BÃ\84Â\9bh algoritmu \astar{} odpovÄ\82­dÄ\82Ä\84 prĹŻbÃ\84Â\9bhu Dijkstrova algoritmu
-na~grafu redukovanÄ\82Å m potenciÄ\82Ä\84lem~$-\psi$. PĹÂ\99esnÃ\84Â\9bji,
-pokud oznaÃ\84Â\8dÄ\82­me $h^*$ aktuÄ\82Ä\84lnÄ\82­ ohodnocenÄ\82­ v~\astar{} a $h$ aktuÄ\82Ä\84lnÄ\82­ ohodnocenÄ\82­
-v~synchronnÄ\9b bÄ\9bŞícĂ­m Dijkstrovi, bude vĹždy platit $h(v) = h^*(v) - \psi(s) + \psi(v)$.
+\s{VÄ\9bta:} BÄ\9bh algoritmu \astar{} odpovídá průbÄ\9bhu Dijkstrova algoritmu
+na~grafu redukovaném potenciálem~$-\psi$. PÅ\99esnÄ\9bji,
+pokud oznaÄ\8díme $h^*$ aktuální ohodnocení v~\astar{} a $h$ aktuální ohodnocení
+v~synchronně běžícím Dijkstrovi, bude vždy platit $h(v) = h^*(v) - \psi(s) + \psi(v)$.
 
 \proof
-IndukcĂ­ podle doby bÄ\9bhu obou algoritmĹŻ. Na poÄ\8dĂĄtku je $h^*(s)$ i $h(s)$ nulovĂŠ
-a vĹÄ\84echna ostatnÄ\82­ $h^*$ a~$h$ jsou nekoneÃ\84Â\8d\82Ä\84, takĹže tvrzenÄ\82­ platÄ\82­. V~kaĹždÄ\82Å m dalĹÄ\84Ä\82­m
-kroku \astar{} vybere vrchol~$v$ s~nejmenĹĄĂ­m $h^*(v) + \psi(v)$, coĹž je tentýŞ vrchol,
-kterĂ˝ vybere Dijkstra ($\psi(s)$ je stĂĄle stejnĂŠ).
-
-UvaĹžujme, co se stane bÃ\84Â\9bhem relaxace hrany $vw$: Dijkstra se pokusÄ\82­ snÄ\82­Ĺžit ohodnocenÄ\82­ $h(w)$
-o~$\delta = h(w) - h(v) - \ell_{-\psi}(v,w)$ a provede to, pokud $\delta>0$. UkĂĄĹžeme,
-Ĺže \astar{} udÄ\9blĂĄ totĂŠĹž:
+Indukcí podle doby běhu obou algoritmů. Na počátku je $h^*(s)$ i $h(s)$ nulové
+a vÅ¡echna ostatní $h^*$ a~$h$ jsou nekoneÄ\8dná, takže tvrzení platí. V~každém dalším
+kroku \astar{} vybere vrchol~$v$ s~nejmenším $h^*(v) + \psi(v)$, což je tentýž vrchol,
+který vybere Dijkstra ($\psi(s)$ je stále stejné).
+
+Uvažujme, co se stane bÄ\9bhem relaxace hrany $vw$: Dijkstra se pokusí snížit ohodnocení $h(w)$
+o~$\delta = h(w) - h(v) - \ell_{-\psi}(v,w)$ a provede to, pokud $\delta>0$. Ukážeme,
+že \astar{} udělá totéž:
 $$\eqalign{
 \delta &= (h^*(w) - \psi(s) + \psi(w)) - (h^*(v) - \psi(s) + \psi(v)) - (\ell(v,w) - \psi(v) + \psi(w)) \cr
 &= h^*(w) - \psi(s) + \psi(w) - h^*(v) + \psi(s) - \psi(v) - \ell(v,w) + \psi(v) - \psi(w) \cr
 &= h^*(w) - h^*(v) - \ell(v,w).
 }$$
-Oba algoritmy tedy aĹž na~posunutĂ­ danĂŠ potenciĂĄlem poÄ\8dĂ­tajĂ­ totĂŠĹž.
+Oba algoritmy tedy až na~posunutí dané potenciálem počítají totéž.
 \qed
 
-\s{DĹŻsledek:} Algoritmus \astar{} funguje jen tehdy, je-li potenciĂĄl $-\psi$ pĹ\99Ă­pustnĂ˝.
+\s{Důsledek:} Algoritmus \astar{} funguje jen tehdy, je-li potenciál $-\psi$ přípustný.
 
-NapĹÂ\99Ä\82­klad pro rovinnou mapu to heuristika danÄ\82Ä\84 euklidovskou vzdÄ\82Ä\84lenostÄ\82­~$\varrho$, tedy $\psi(v) := \varrho(v,t)$, splĹÂ\88uje:
-PĹ\99Ă­pustnost poĹžaduje pro kaĹždou hranu $uv$ nerovnost
+NapÅ\99íklad pro rovinnou mapu to heuristika daná euklidovskou vzdáleností~$\varrho$, tedy $\psi(v) := \varrho(v,t)$, splÅ\88uje:
+Přípustnost požaduje pro každou hranu $uv$ nerovnost
 $\ell(u,v) - \psi(v) + \psi(u) \ge 0$,
 tedy $\ell(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$.
-JelikoĹž $\ell(u,v) \ge \varrho(u,v)$,
-staÄ\8dĂ­ dokĂĄzat, Ĺže $\varrho(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$,
-coĹž je ovĹĄem trojĂşhelnĂ­kovĂĄ nerovnost pro metriku~$\varrho$.
+Jelikož $\ell(u,v) \ge \varrho(u,v)$,
+stačí dokázat, že $\varrho(u,v) - \varrho(v,t) + \varrho(u,t) \ge 0$,
+což je ovšem trojúhelníková nerovnost pro metriku~$\varrho$.
 
 \references
 \bye