a v¹echna $\sigma_0[i:{}]$ u¾ máme setøídìná, mù¾eme v¹echna $\sigma_2[i:{}]$ setøídit dvìma prùchody pøihrádkového tøídìní.
\:Dopoèítáme $L_2$: Stejným trikem jako $A_2$ -- pokud jsou první písmena rùzná, je spoleèný prefix prázdný, jinak
-má délku $1+{\rm LCP}(\sigma_0[i+1:{}],\sigma_0[j+1:{}]) = 1+\min_{i+1\le k< j+1} L_0[k]$. Minimum zvládneme pro ka¾dou
+má délku $1+{\rm LCP}(\sigma_0[i+1:\nobreak{}],\sigma_0[j+1:{}]) = 1+\min_{i+1\le k< j+1} L_0[k]$. Minimum zvládneme pro ka¾dou
dvojici $i,j$ spoèítat v~konstantním èase pomocí datové struktury pro intervalová minima.
\:$A_0,A_1,A_2\buildrel merge\over\longrightarrow A$ -- sléváme tøi setøídìné posloupnosti,
a jeho funkce \<back>.
\endalgo
+\goodbreak
+
\s{Èasová slo¾itost:}
Kanonikalizace pracuje v~amortizovanì konstantním èase, proto¾e ka¾dá její iterace
\input ../sgr.tex
-\prednaska{11}{Kreslení grafù do~roviny}{}
+\prednaska{11}{Kreslení grafù do roviny}{}
Rovinné grafy se objevují v~nejrùznìj¹ích praktických aplikacích teorie grafù,
a~tak okolo nich vyrostlo znaèné mno¾ství algoritmù. I~kdy¾ existují výjimky,
le¾ícími pod~ním pøeklopit podle koøenové artikulace, ani¾ bychom poru¹ili
rovinnost.
+\finalfix{
+\figure{planar1.eps}{Pøed nakreslením zpìtných hran \dots}{\epsfxsize}
+\figure{planar2.eps}{\dots\ po nìm (ètvereèky jsou externì aktivní vrcholy)}{\epsfxsize}
+}
+
V¹imnìme si, ¾e pokud vede z~nìjakého u¾ nakresleného vrcholu je¹tì nenakreslená hrana,
lze pokraèovat po~nenakreslených hranách a¾ do~koøene DFS stromu. V¹echny vrcholy, ke~kterým
je¹tì bude potøeba nìco pøipojit (takovým budeme øíkat {\I externì aktivní} a hranám
zpìtnou hranou spojí s~jinými bloky. Zpìtné hrany byly a¾ donedávna
externì aktivní, tak¾e pøidání jedné zpìtné hrany nahradí cestu
po~okraji bloku touto hranou (tím vytvoøí novou stìnu) a také mù¾e
-slouèit nìkolik blokù do~jednoho:
+slouèit nìkolik blokù do~jednoho, jak je vidìt z~obrázkù.
+\separatefix{
\figure{planar1.eps}{Pøed nakreslením zpìtných hran \dots}{\epsfxsize}
\figure{planar2.eps}{\dots\ po nìm (ètvereèky jsou externì aktivní vrcholy)}{\epsfxsize}
+}
Bude se nám hodit, ¾e èas potøebný na~tuto operaci je pøímo úmìrný poètu
hran, které ubyly z~vnìj¹í stìny, co¾ je amortizovanì konstanta.
tj. blok obsahující ¾ivý vrchol. Není-li ¾ivý vrchol èi blok externì aktivní,
budeme mu øíkat {\I internì aktivní.} Pakli¾e není vrchol/blok ani ¾ivý, ani externì aktivní,
budeme ho nazývat {\I neaktivní.}
+\finalfix{\looseness=1}
Pøed procházením podstromù tedy nejprve probereme v¹echny zpìtné hrany vedoucí do~$v$
a oznaèíme ¾ivé vrcholy. Pro ka¾dou zpìtnou hranu potøebujeme o¾ivit vrchol, z~nìj¾
\:{\I pøestane být 2-souvislý} -- tehdy se zamìøíme na~bloky le¾ící na~cestì~$xy$:
\numlist\nparen
+\finalfix{\rightskip=0.5\rightskip}
\:{\I $w$ je artikulace} na této cestì -- BÚNO je taková artikulace v~DFS prohledána po~bloku obsahujícím~$x$,
ale pøed~$y$. Tehdy nám jistì $x$ nezabránilo v~tom, abychom do~$w$ do¹li (mù¾e blokovat
jenom jednu stranu hranice), tak¾e jsme se ve~$w$ museli rozhodnout, ¾e pøednostnì zpracujeme
\:{\I zùstane 2-souvislý} a vznikne z~nìj nìjaký blok~$B'$ -- tehdy rozebereme, jaké hrany vedou mezi $v$ a $B'$:
\numlist\nparen
+\finalfix{\rightskip=0.5\rightskip}
\:{\I více ne¾ dvì hrany} -- minor~$N_2$.
\:{\I alespoò jedna hrana na \uv{horní} cestu} (to jest na~tu, na~ni¾ nele¾í~$w$) -- minor~$N_3$.
\:{\I dvì hrany do~$x,y$ nebo na \uv{dolní} cestu} -- a» u¾ jsme vstoupili na~hranici bloku~$B'$
\h{Globálnì minimální øez (Nagamochi, Ibaraki \cite{nagaiba:conn})}
-Buï $G$ neorientovaný graf s~nezáporným ohodnocením na~hranách. Oznaèíme si:
+Buï $G$ neorientovaný graf s~nezáporným ohodnocením hran. Oznaèíme si:
\s{Znaèení:}
Nejprve v¹ak budeme potøebovat jedno u¾iteèné lemma s~hnusnì technickým dùkazem:
\s{Hnusnì technické lemma (HTL):} Buïte¾ $s,t$ vrcholy grafu $(V,E)$, $\d(U)$ minimální \st-øez a $u\ne v$ dva rùzné
-vrcholy z~$U$. Pak existuje mno¾ina vrcholù $W \subseteq U$ taková, ¾e $\d(W)$ je minimální $uv$-øez.
-[To dùle¾ité a netriviální je, ¾e celá $W$ le¾í v~$U$.]
+vrcholy z~$U$. Pak existuje mno¾ina vrcholù $W \subseteq U$ taková, ¾e $\d(W)$ je minimální $uv$-øez.
+\foot{To dùle¾ité a netriviální je, ¾e celá $W$ le¾í v~$U$.}
\fig{4-ght-htl.eps}{\epsfxsize}
BÚNO mù¾eme pøedpokládat, ¾e $s\in U$ a $t\not\in U$, $u\in X$ a $v\not\in X$ a $s\in X$.
Pokud by tomu tak nebylo, mù¾eme vrcholy pøeznaèit nebo nìkterou z~mno¾in nahradit jejím doplòkem.
-Nyní mohou nastat dva pøípady:\numlist\nalpha
+Nyní mohou nastat následující dva pøípady:\numlist\nalpha
\vbox to 0pt{\rightline{\epsfysize=2.5cm\epsfbox{4-ght-htl-a.eps}}\vss}\vskip-\baselineskip
{\advance\hsize by -14em
\:$t\not\in X$. Tehdy si v¹imneme, ¾e platí:
\fig{4-ght-g1g2-before.eps}{0.45\hsize}
\fig{4-ght-g1g2-after.eps}{0.9\hsize}
+\finalfix{\bigskip}
Dále vytvoøíme mno¾iny vrcholù $R_1=R \cap \overline W$ a $R_2=R \cap W$. Dle indukèního
pøedpokladu ($R_1$ i $R_2$ jsou men¹í ne¾ $R$) existuje \PGHT{} $T_1=((R_1,F_1),C_1)$
\figure{mst2.eps}{Kostra $T$, cesta $T[e]$ a výsledek operace $\<swap>(T,e,e')$}{\epsfxsize}
+\figure{mst1.eps}{Jeden krok dùkazu swapovacího lemmatu}{\epsfxsize}
+
\s{Lemma o~swapování:}
Máme-li libovolné kostry $T$ a $T'$, pak lze z~$T$ dostat $T'$ koneèným poètem operací \<swap>.
Po~koneèném poètu tìchto krokù tedy musíme dojít k~$T'$.
\qed
-\figure{mst1.eps}{Jeden krok dùkazu swapovacího lemmatu}{\epsfxsize}
-
\s{Monotónní lemma o~swapování:}
Je-li $T$ kostra, k~ní¾ neexistují ¾ádné lehké hrany, a~$T'$ libovolná kostra,
pak lze od~$T$ k~$T'$ pøejít posloupností swapù, pøi které váha kostry neklesá.
\input ../sgr.tex
-\prednaska{6}{Rychlej¹í algoritmy na~minimální kostry}{}
+\prednaska{6}{Rychlej¹í algoritmy na minimální kostry}{}
V~této kapitole popí¹eme nìkolik pokroèilej¹ích algoritmù pro problém minimální
kostry. Vesmìs to budou rùzná vylep¹ení klasických algoritmù z~minulé kapitoly.
Pokud je $\cal C$ minorovì uzavøená tøída grafù, existuje koneèná mno¾ina grafù $Z$ taková,
¾e pro ka¾dý graf $G$ platí:
$$G \not\in {\cal C} \iff \exists H \in Z: H \preceq G.$$
-
Jinými slovy, ka¾dou minorovì uzavøenou tøídu lze charakterizovat {\I koneèným} poètem zakázaných minorù.
To není samo sebou, dokazuje se to dosti obtí¾nì (a~je to jedna z~nejslavnìj¹ích kombinatorických
vìt za~posledních mnoho let), ale plyne z~toho spousta zajímavých dùsledkù.
ale je definováno, ¾e neinicializovanou buòku mù¾eme pøeèíst a dostaneme
nìjakou korektní, i kdy¾ libovolnou, hodnotu. Tehdy nám pomù¾e:
-{\narrower
+%{\narrower\medskip
\s{Vìta:} Buï $P$ program pro Word-RAM s~nulami inicializovanou
pamìtí, bì¾ící v èase $T(n)$. Pak existuje program~$P'$ pro Word-RAM
v~tém¾e èase udr¾ovat.
\qed
-}
+%\medskip}
\s{\uv{Minové pole}:} Neinicializované buòky není ani dovoleno èíst.
V~tomto pøípadì nejsme schopni deterministické redukce, ale alespoò
Libovolný $n$-slo¾kový vektor, jeho¾ slo¾ky jsou $b$-bitová èísla
($n(b+1)\le w$), zakódujeme poskládáním jednotlivých slo¾ek vektoru za~sebe,
prolo¾enì nulovými bity:
+
+\nobreak
\alik{\0 x_{n-1} \0 x_{n-2} \9\9\9 \0 x_1\0 x_0 \cr}
\>S~vektory budeme provádìt následující operace: (latinkou znaèíme vektory,
Staèí zvolit bitovou masku, která v~$i$-té slo¾ce ponechá právì $\varphi(i)$-tý bit.
+\finalfix{\goodbreak}
+
\:$\<Pack>(x)$ -- dostane vektor nul a jednièek a vytvoøí èíslo, jeho¾ bity
jsou právì slo¾ky vektoru (jinými slovy ¹krtne nuly mezi bity):
pøekvapení v¹ak to, kam jsme se dostali, bude staèit ke~spoèítání ranku
prvku a z~rankù u¾ odvodíme i ostatní operace.
-\ss{Pøíklad:}
-\figure{trie.eps}{Trie. Ohodnocení hran je pouze pro názornost, není
-souèástí struktury.}{\hsize}
+\s{Pøíklad:} Trie pro zadanou mno¾inu èísel. Ohodnocení hran je pouze pro názornost, není
+souèástí struktury.
+\fig{trie.eps}{\hsize}
\s{Lemma R:} $\rank_X(x)$ je urèen jednoznaènì kombinací:
\numlist\pnromanp
pstops '2:0L(210mm,0mm)+1L(210mm,148mm)' <$< | sed 's/^%%BoundingBox: .*/%%BoundingBox: 0 0 595 842/;s/^%%DocumentPaperSizes:.*/%%DocumentPaperSizes: a4\n%%Orientation: Landscape/' >$@
mostlyclean:
- rm -f *.dvi *.log *~ core *.o *.aux *.bbl *.blg
+ rm -f *.dvi *.log *~ core *.o *.aux *.bbl *.blg *.toc
clean:: mostlyclean
rm -f *.ps *.pdf
\input ../sgr.tex
+\def\separatefix#1{}
+\def\finalfix#1{#1}
+
+% Sazba obsahu
+\newwrite\toc
+\immediate\openout\toc=ga.toc
+\def\writetoc#1#2{\write\toc{\string\tocentry{#1}{#2}{\the\count0}}}
+\def\tocout{
+\immediate\closeout\toc
+\immediate\openin\toc=ga.toc
+\ifeof\toc
+\else
+\input ga.toc
+\fi
+\immediate\closein\toc
+}
+
+% Ujisti se, ze na strance zbyva dost mista
+\def\prechapter#1#2{%
+\vskip 0pt plus 30pt
+\goodbreak
+\vskip 0pt plus -30pt
+\writetoc{#1}{#2}
+}
\def\chapterend{\bigbreak\bigbreak}
+{\nopagenumbers
+\vglue 0pt
+
+\vfill
+\centerline{\big Martin Mare¹}
+\vskip 1in
+\centerline{\Big Krajinou grafových algoritmù}
+\bigskip
+\bigskip
+\centerline{\large prùvodce pro støednì pokroèilé}
+
+\vfill
+\vfill
+\centerline{\large ITI 2007}
+\vfill\eject
+
+\vglue 0pt plus 1fill
+\leftline{\copyright~2007~Martin Mare¹}
+\bigskip
+\leftline{\bo ISBN 12-34567-89-0}
+\bigskip
+\eject
+}
+
\input body.tex
\prednaska{L}{Literatura}{}
-
\dumprefs
-\bye
+
+\vfill\eject
+
+~~~
+
+\vfill\eject
+
+\def\writetoc#1#2{}
+\prednaska{O}{Obsah}{}
+
+\def\tocentry#1#2#3{\line{\hbox to 1.5em{\hfil #1.} #2\dotfill #3}\vskip 2pt}
+\tocout
+\tocentry{O}{Obsah}{\the\count0}
+
+\vfill\eject
+\nopagenumbers
+{\obeylines\parskip=0pt\parindent=0pt
+\vglue 0pt plus 1fill
+
+{\large Mgr. Martin Mare¹}
+
+\medskip
+
+{\Large Krajinou grafových algoritmù}
+
+\bigskip
+
+Vydal Institut Teoretické Informatiky
+~~~Univerzita Karlova v Praze
+~~~Matematicko-Fyzikální Fakulta
+~~~Malostranské nám.~25
+~~~118 00 Praha 1
+~~~jako 999. publikaci v~ITI Series.
+
+\bigskip
+
+Sazbu písmem Computer Modern v~programu \TeX\ provedl autor.
+\medskip
+Vytisklo Reprostøedisko UK MFF.
+
+\bigskip
+
+Vydání první
+72 stran
+Náklad 100 výtiskù
+Praha 2007
+
+\bigskip
+
+{\bo ISBN 12-34567-89-0}
+}
+
+\eject\end
% Zacatek prednasky {cislo prednasky}{jmeno prednasky}{jmeno zapisovatele}
\def\prednaska#1#2#3{%
+\prechapter{#1}{#2}
+\vbox{%
\line{{\Large\bf #1. #2} \hfil {\it #3}}
\vskip 4pt
-\hrule
+\hrule}
\medskip
}
+\def\prechapter#1#2{}
% Nadpis {text}
\def\h#1{\medbreak\leftline{\bf #1}\nobreak\smallskip\nobreak}
\begingroup
\let\:=\algoitem
\let\*=\algohang
-\parskip=1pt plus 1pt minus 0.3pt
+\parskip=1pt plus 0.2pt minus 0.3pt
\rightskip=2em
\itemcount=0
}
\multiply\dimen0 by \count0
\vbox to 0pt{}
\nointerlineskip
-\vbox to 0pt{\vbox to \dimen0{\vss\rightline{\box0\hskip 1em}\vss}}
+\vbox to 0pt{\vbox to \dimen0{\vss\rightline{\box0\hskip 1em}\vss}\vss}
\nointerlineskip
}
% Matematicke symboly
\def\symdiff{\mathop{\Delta}}
+
+% Hacky pro finalni sazbu
+\def\separatefix#1{#1}
+\def\finalfix#1{}