]> mj.ucw.cz Git - ga.git/blob - 11-planar/11-planar.tex
Suffixove stromy: Lepsi vyklad Ukkonenova algoritmu
[ga.git] / 11-planar / 11-planar.tex
1 \input ../sgr.tex
2
3 \prednaska{11}{Kreslení grafù do roviny}{}
4
5 Rovinné grafy se objevují v~nejrùznìj¹ích praktických aplikacích teorie grafù,
6 a~tak okolo nich vyrostlo znaèné mno¾ství algoritmù. I~kdy¾ existují výjimky,
7 jako napøíklad ji¾ zmínìné hledání kostry rovinného grafu, vìt¹ina takových
8 algoritmù pracuje s~konkrétním vnoøením grafu do~roviny (rovinným nakreslením).
9
10 Proto se zamìøíme na~algoritmus, který zadaný graf buïto vnoøí do~roviny, nebo se
11 zastaví s~tím, ¾e graf není rovinný. Tarjan ji¾ v~roce 1974 ukázal \cite{tarjan:planarity},
12 ¾e je to mo¾né provést v~lineárním èase, ale jeho algoritmus je ponìkud
13 komplikovaný. Od~té doby se objevilo mnoho zjednodu¹ení, prozatím vrcholících
14 algoritmem Boyera a Myrvoldové \cite{boyer:cutting}, a ten zde uká¾eme.
15
16 Zmiòme je¹tì, ¾e existují i algoritmy, které vytváøejí rovinná nakreslení s~rùznými
17 speciálními vlastnostmi. Je to napøíklad Schnyderùv algoritmus~\cite{schnyder:grid}
18 generující v~lineárním èase nakreslení, v~nìm¾ jsou hrany úseèkami a vrcholy
19 le¾í v~møí¾ových bodech møí¾ky $(n-2)\times (n-2)$, a~o~nìco jednodu¹¹í algoritmus
20 Chrobaka a Payneho \cite{chrobak:grid} kreslící do~møí¾ky $(2n-4)\times (n-2)$.
21 Oba ov¹em pracují tak, ¾e vyjdou z~obyèejného rovinného nakreslení a upravují ho,
22 aby splòovalo dodateèné podmínky.
23
24 \h{DFS a bloky}
25
26 Pøipomeòme si nejprve nìkteré vlastnosti prohledávání do~hloubky (DFS) a jeho pou¾ití
27 k~hledání komponent vrcholové 2-souvislosti {\I (blokù).}
28
29 \s{Definice:} Prohledávání orientovaného grafu do~hloubky rozdìlí hrany do~ètyø druhù:
30 \itemize\ibull
31 \:{\I stromové} -- po~nich DFS pro¹lo a rekurzivnì se zavolalo; tyto hrany
32 vytváøejí {\I DFS strom} orientovaný z~koøene;
33 \:{\I zpìtné} -- vedou do~vrcholu, který le¾í na cestì z~koøene DFS stromu
34 do právì prohledávaného vrcholu; jinými slovy vedou do vrcholu, který se
35 právì nachází na~zásobníku;
36 \:{\I dopøedné} -- vedou do~ji¾ zpracovaného vrcholu le¾ícího v~DFS stromu pod aktuálním vrcholem;
37 \:{\I pøíèné} -- zbývající hrany, které vedou do vrcholu ji¾ zpracovaného vrcholu
38 v~jiném podstromu.
39 \endlist
40
41 \s{Pozorování:}
42 Pokud DFS spustíme na neorientovaný graf a hranu, po~ní¾ jsme u¾ jednou pro¹li,
43 v~opaèném smìru ignorujeme, existují pouze stromové a zpìtné hrany. DFS strom
44 tvoøí kostru grafu.
45
46 Nyní u¾ se zamìøíme pouze na~neorientované grafy~\dots
47
48 \s{Lemma:} Relace \uv{Hrany $e$ a $f$ le¾í na~spoleèné kru¾nici} (znaèíme $e\sim f$) je ekvivalence. Její
49 tøídy tvoøí maximální 2-souvislé podgrafy (bloky); ekvivalenèní tøídy s~jedinou hranou (mosty) pova¾ujeme
50 za triviální bloky. Vrchol $v$ je artikulace právì tehdy, sousedí-li s~ním hrany z~více blokù.
51
52 Pokud spustíme na~graf DFS, je pøirozené testovat, do~jakých blokù patøí stromové
53 hrany sousedící s~právì prohledávaným vrcholem~$v$: stromová hrana $uv$, po~které jsme
54 do~$v$ pøi¹li, a hrany $vw_1$ a¾ $vw_k$ vedoucí do~podstromù $T_1$ a¾ $T_k$ (zpìtné hrany
55 jsou v¾dy ekvivalentní s~hranou $uv$). Pokud je $uv \sim vw_i$, musí existovat cesta
56 z~podstromu $T_i$ do~vrcholu~$u$, která nepou¾ije právì testované hrany. Taková cesta
57 ale mù¾e podstrom opustit pouze zpìtnou hranou (stromová je zakázaná a dopøedné ani pøíèné
58 neexistují). Jinými slovy $uv\sim vw_i$ právì tehdy, kdy¾ existuje zpìtná hrana z~podstromu~$T_i$
59 do~vrcholu $u$ nebo blí¾e ke~koøeni.
60
61 Pokud nìkterá dvojice $vw_i$, $vw_j$ není ekvivalentní pøes hranu $uv$ (nebo pokud hrana $uv$
62 ani neexistuje, co¾ se nám v~koøeni DFS stromu mù¾e stát), le¾í tyto hrany v~rùzných blocích, proto¾e
63 $T_i$ a $T_j$ mohou být spojeny jen pøes své koøeny (pøíèné hrany neexistují). Ze~zpìtných
64 hran tedy získáme kompletní strukturu blokù.
65
66 Nyní si staèí rozmyslet, jak existenci zpìtných hran testovat rychle. K~tomu se bude hodit:
67
68 \s{Definice:} Je-li $v$ vrchol grafu, pak:
69 \itemize\ibull
70 \:$\<Enter>(v)$ udává poøadí, v~nìm¾ DFS do~vrcholu~$v$ vstoupilo.
71 \:$\<Ancestor>(v)$ je nejmen¹í z~\<Enter>ù vrcholù, do~nich¾ vede z~$v$ zpìtná hrana,
72 nebo $+\infty$, pokud z~$v$ ¾ádná zpìtná hrana nevede.
73 \:$\<LowPoint>(v)$ je minimum z~\<Ancestor>ù vrcholù le¾ících v~podstromu pod~$v$, vèetnì $v$ samého.
74 \endlist
75
76 \s{Pozorování:} \<Enter>, \<Ancestor> i \<LowPoint> v¹ech vrcholù lze spoèítat
77 bìhem prohledávání, tedy také v~lineárním èase.
78
79 Rozpoznávání blokù a artikulací mù¾eme shrnout do~následujícího lemmatu:
80
81 \s{Lemma:} Pokud $v$ je vrchol grafu, $u$ jeho otec a $w$ jeho syn v~DFS stromu,
82 pak stromové hrany $uv$ a $vw$ le¾í v~tomté¾ bloku ($uv\sim vw$) právì
83 tehdy, kdy¾ $\<LowPoint>(w) < \<Enter>(v)$, a~$v$ je artikulace právì kdy¾
84 nìkterý z~jeho synù $w$ má $\<LowPoint>(w) \ge \<Enter>(v)$.
85 Koøen DFS stromu je artikulace, právì kdy¾ má více ne¾ jednoho syna.
86
87 \h{Postup kreslení}
88
89 Graf budeme kreslit v~opaèném poøadí oproti DFS, tj. od~nejvìt¹ích \<Enter>ù k~nejmen¹ím,
90 a v¾dy si budeme udr¾ovat blokovou strukturu ji¾ nakreslené èásti grafu, uspoøádanou
91 podle DFS stromu -- ka¾dý blok bude mít svùj koøen, s~výjimkou nejvy¹¹ího bloku
92 je tento koøen souèasnì artikulací v~nadøazeném bloku. Aby se nám tato situace snadno
93 reprezentovala, artikulace naklonujeme a ka¾dý blok dostane svou vlastní kopii artikulace.
94
95 Také budeme vyu¾ívat toho, ¾e nakreslení ka¾dého bloku, který není
96 most, je ohranièeno kru¾nicí, a mosty zdvojíme, aby to pro nì platilo
97 také. Navíc v~libovolném nakreslení mù¾eme kterýkoliv blok spolu se v¹emi bloky
98 le¾ícími pod~ním pøeklopit podle koøenové artikulace, ani¾ bychom poru¹ili
99 rovinnost.
100
101 \finalfix{
102 \smallskip
103 \figure{planar1.eps}{Pøed nakreslením zpìtných hran \dots}{\epsfxsize}
104 \figure{planar2.eps}{\dots\ po nìm (ètvereèky jsou externí vrcholy)}{\epsfxsize}
105 }
106
107 V¹imnìme si, ¾e pokud vede z~nìjakého u¾ nakresleného vrcholu je¹tì nenakreslená hrana,
108 lze pokraèovat po~nenakreslených hranách a¾ do~koøene DFS stromu. V¹echny vrcholy, ke~kterým
109 je¹tì bude potøeba nìco pøipojit (takovým budeme øíkat {\I externí} a hranám
110 rovnì¾; za~chvíli to nadefinujeme formálnì), proto musí le¾et v~té¾e stìnì dosud nakresleného
111 podgrafu a bez újmy na~obecnosti si vybereme, ¾e to bude vnìj¹í stìna.
112
113 Základním krokem algoritmu tedy bude roz¹íøit nakreslení o~nový
114 vrchol~$v$ a o~v¹echny hrany vedoucí z~nìj do~jeho (ji¾ nakreslených)
115 DFS-následníkù.  Stromové hrany pùjdou nakreslit v¾dy, pøidáme je jako
116 triviální bloky (2-cykly) a nejsou-li to mosty, brzy se nìjakou
117 zpìtnou hranou spojí s~jinými bloky. Zpìtné hrany byly a¾ donedávna
118 externí, tak¾e pøidání jedné zpìtné hrany nahradí cestu
119 po~okraji bloku touto hranou (tím vytvoøí novou stìnu) a také mù¾e
120 slouèit nìkolik blokù do~jednoho, jak je vidìt z~obrázkù.
121
122 \separatefix{
123 \figure{planar1.eps}{Pøed nakreslením zpìtných hran \dots}{\epsfxsize}
124 \figure{planar2.eps}{\dots\ po nìm (ètvereèky jsou externí vrcholy)}{\epsfxsize}
125 }
126
127 Bude se nám hodit, ¾e èas potøebný na~tuto operaci je pøímo úmìrný poètu
128 hran, které ubyly z~vnìj¹í stìny, co¾ je amortizovanì konstanta.
129
130 Mù¾e se nám ale také stát, ¾e zpìtná hrana zakryje nìjaký externí vrchol.
131 Tehdy musíme nìkteré bloky pøeklopit tak, aby externí vrcholy
132 zùstaly venku. Potøebujeme tedy datové struktury, pomocí nich¾ bude mo¾né
133 pøeklápìt efektivnì a co víc, také rychle poznávat, kdy je pøeklápìní potøebné.
134
135 \h{Externí vrcholy}
136
137 Jestli¾e z~nìjakého vrcholu~$v$ bloku~$B$ vede dosud nenakreslená hrana, musí
138 být tento vrchol na~vnìj¹í stìnì, tak¾e musí také zùstat na~vnìj¹í stìnì
139 i~vrchol, pøes který je~$B$ pøipojen ke~zbytku grafu. Proto externost
140 nadefinujeme tak, aby pokrývala i tyto pøípady:
141
142 \s{Definice:} Vrchol~$w$ je {\I externí,} pokud buïto z~$w$ vede zpìtná
143 hrana do~je¹tì nenakresleného vrcholu, nebo je pod~$w$ pøipojen externí
144 blok, èili blok obsahující alespoò jeden externí vrchol. Ostatním vrcholùm
145 budeme øíkat {\I interní.}
146
147 Jinými slovy platí, ¾e vrchol $w$ je externí pøi zpracování vrcholu~$v$, pakli¾e $\<Ancestor>(w) < \<Enter>(v)$,
148 nebo pokud pro nìkterého ze~synù $x$ le¾ícího v~jiném bloku je $\<LowPoint>(x) < \<Enter>(v)$.
149 Druhá podmínka funguje díky tomu, ¾e koøen bloku má v~tomto bloku právì jednoho syna
150 (jinak by existovala pøíèná hrana, co¾ víme, ¾e není pravda), tak¾e minimum z~\<Ancestor>ù
151 v¹ech vrcholù le¾ících uvnitø bloku je pøesnì \<LowPoint> tohoto syna.
152 Ve~statickém grafu by se v¹echny testy redukovaly na~$\<LowPoint>(w)$, nám se ov¹em bloková
153 struktura prùbì¾nì mìní, tak¾e musíme uva¾ovat bloky v~souèasném okam¾iku. Proto si zavedeme:
154
155 \s{Definice:} $\<BlockList>(w)$ je seznam v¹ech blokù pøipojených v~daném okam¾iku
156 pod vrcholem~$w$, reprezentovaných jejich koøeny (klony vrcholu~$w$) a jedinými syny koøenù.
157 Tento seznam udr¾ujeme setøídìný vzestupnì podle $\<LowPoint>$ù synù.
158
159 \s{Lemma:} Vrchol~$w$ je externí pøi zpracování vrcholu~$v$, pokud je buïto $\<Ancestor>(w) < \<Enter>(v)$,
160 nebo první prvek seznamu $\<BlockList>(w)$ má $\<LowPoint> < \<Enter>(v)$. Navíc
161 seznamy \<BlockList> lze udr¾ovat v~amortizovanì konstantním èase.
162
163 \proof První èást plyne pøímo z~definic. V¹echny seznamy na~zaèátku bìhu algoritmu
164 sestrojíme v~lineárním èase pøihrádkovým tøídìním a kdykoliv slouèíme blok
165 s~nadøazeným blokem, odstraníme ho ze~seznamu v~pøíslu¹né artikulaci.
166 \qed
167
168 \h{Reprezentace blokù a pøeklápìní}
169
170 Pro ka¾dý blok si potøebujeme pamatovat vrcholy, které le¾í na~hranici
171 (nìkteré z~nich jsou externí, ale to u¾ umíme poznat) a bloky,
172 které jsou pod nimi pøipojené. Dále je¹tì vnitøní strukturu bloku vèetnì
173 uvnitø pøipojených dal¹ích blokù, ale jeliko¾ ¾ádné vnitøní vrcholy nejsou
174 externí, vnitøek u¾ neovlivní dal¹í výpoèet a potøebujeme jej pouze
175 pro vypsání výstupu.
176
177 Pro na¹e úèely bude staèit zapamatovat si u~ka¾dého bloku, jestli je
178 oproti nadøazenému bloku pøeklopen. Tuto informaci zapí¹eme do~koøene
179 bloku. Ka¾dý vrchol na~hranici bloku pak bude obsahovat dva~ukazatele
180 na~sousední vrcholy. Neumíme sice lokálnì poznat, který ukazatel odpovídá
181 kterému smìru, ale kdy¾ se nìjakým smìrem vydáme, doká¾eme ho dodr¾et
182 -- staèí si v¾dy vybrat ten ukazatel, který nás nezavede do~právì
183 opu¹tìného vrcholu.
184
185 Ka¾dý vrchol si také bude pamatovat seznam svých sousedù,
186 podle orientace bloku buïto v~hodinkovém nebo opaèném poøadí.
187 Chceme-li pøidat hranu, potøebujeme tedy znát absolutní orientaci,
188 ale to pùjde snadno, jeliko¾ hrany pøidáváme jen k~vrcholùm na~hranici,
189 poté co k~nim po~hranici dojdeme z~koøene.
190
191 K~pøeklopení bloku vèetnì v¹ech podøízených blokù nám staèí invertovat
192 bit v~koøeni, pokud chceme pøeklopit jen tento blok, invertujeme bity
193 i v~koøenech v¹ech podøízených blokù, je¾ najdeme obcházením hranice.
194
195 Na~konci algoritmu spustíme dodateèný prùchod, který v¹echny pøeklápìcí
196 bity pøenese ve~smìru od~koøene k~potomkùm a urèí tak absolutní orientaci
197 v¹ech seznamù sousedù i hranic.
198
199 \h{®ivý podgraf}
200
201 Kdy¾ nakreslíme nový vrchol~$v$ a z~nìj vedoucí stromové hrany, musíme obejít
202 ka¾dý podstrom, ve~vhodném poøadí nakreslit zpìtné hrany do~$v$ a podle
203 potøeby pøeklopit bloky. V~podstromu ov¹em mù¾e být mnoho blokù, které
204 ¾ádnou pozornost nevy¾adují a bìh algoritmu by zbyteènì brzdily.
205 Proto si pøed samotným kreslením oznaèíme {\I ¾ivou} èást grafu -- to je
206 èást, kterou potøebujeme bìhem kreslení nav¹tívit; zbytku grafu se budeme
207 sna¾it vyhýbat, aby nás nezdr¾oval.
208
209 \s{Definice:}
210 Vrchol~$w$ je {\I ¾ivý,} pokud z~nìj buïto vede zpìtná hrana do~právì
211 zpracovávaného vrcholu~$v$, nebo pokud pod ním je pøipojen ¾ivý blok,
212 tj. blok obsahující ¾ivý vrchol.
213
214 ®ivé vrcholy pøitom mohou být i~externí (pokud z~nich vedou zpìtné hrany
215 jak do vrcholu~$v$, tak do je¹tì nenakreslených vrcholù).
216 Pokud nìjaký vrchol není ani ¾ivý, ani externí, budeme ho nazývat {\I pasivní.}
217
218 Pøed procházením podstromù tedy nejprve probereme v¹echny zpìtné hrany vedoucí do~$v$
219 a oznaèíme ¾ivé vrcholy. Pro ka¾dou zpìtnou hranu potøebujeme o¾ivit vrchol, z~nìj¾
220 hrana vede, dále artikulaci, pod~ní¾ je tento blok pøipojen, a dal¹í artikulace
221 na~cestì do~$v$. Tedy poka¾dé, kdy¾ vstoupíme do~bloku (nìjakým vrcholem na~vnìj¹í stìnì),
222 potøebujeme nalézt koøen bloku. To udìláme tak, ¾e zaèneme obcházet vnìj¹í
223 stìnu obìma smìry souèasnì, a¾ dojdeme v~nìkterém smìru do~koøene. Navíc si v¹echny
224 vrcholy, pøes nì¾ jsme pro¹li, oznaèkujeme a pøiøadíme k~nim rovnou ukazatel na~koøen,
225 tudí¾ po~¾ádné èásti hranice neprojdeme vícekrát.\foot{Znaèky ani nebude potøeba
226 mazat, kdy¾ si u nich poznamenáme, který vrchol byl koøenem v~okam¾iku, kdy jsme
227 znaèku vytvoøili, a znaèky patøící ke~starým koøenùm budeme ignorovat, resp. pøepisovat.}
228
229 Výstupem této èásti algoritmu budou znaèky u~¾ivých vrcholù a u~artikulací
230 také seznamy podøízených ¾ivých blokù. Tyto seznamy budeme udr¾ovat uspoøádané
231 tak, aby externí bloky následovaly po~v¹ech interních. To nám usnadní práci
232 v~hlavní èásti algoritmu.
233
234 \s{Lemma:} Pro ka¾dý koøen trvá znaèení ¾ivých vrcholù èas $\O(k+\ell)$, kde $k$ je poèet
235 kreslených zpìtných hran a $\ell$ poèet hran, které zmizely z~vnìj¹í stìny, èili
236 amortizovanì konstanta.
237
238 \proof
239 Po~¾ádné hranì neprojdeme více ne¾ jednou. Navíc alespoò polovina z~tìch, po~nich¾
240 jsme pro¹li, zmizí z~vnìj¹í stìny, tak¾e hledání koøenù blokù trvá $\O(\ell)$.
241 Pro ka¾dou zpìtnou hranu oznaèíme jeden vrchol jako ¾ivý a pak pokraèujeme hledáním
242 koøenù, které jsme ji¾ zapoèítali.
243 \qed
244
245 \h{Kreslení zpìtných hran}
246
247 Nyní ji¾ máme v¹e pøipraveno -- datové struktury, detekci externích vrcholù
248 a oznaèování ¾ivého podgrafu -- a zbývá doplnit, jak algoritmus kreslí zpìtné
249 hrany. Jeliko¾ zpìtné hrany vedoucí do~$v$ nemohou zpùsobit slouèení blokù
250 le¾ících pod~$v$ (na~to jsou potøeba zpìtné hrany vedoucí nìkam nad~$v$ a ty
251 je¹tì nekreslíme), zpracováváme ka¾dý podstrom zvlá¹». V¾dy pøidáme triviální blok
252 pro stromovou hranu, pod nìj pøipojíme blokovou strukturu zatím nakreslené
253 èásti podstromu a vydáme se po~hranici této struktury nejdøíve jedním
254 a pak druhým smìrem.
255
256 Oba prùchody vypadají následovnì: Procházíme seznam vrcholù na~hranici a pasivní
257 vrcholy pøeskakujeme. Pokud objevíme ¾ivý vrchol, nakreslíme v¹e, co z~nìj vede,
258 pøípadnì se zanoøíme do~¾ivých blokù, které jsou pøipojeny pod tímto vrcholem.
259 Pokud objevíme externí vrchol (poté, co jsme ho pøípadnì o¹etøili jako ¾ivý),
260 procházení zastavíme, proto¾e za externí vrchol ji¾ nemù¾eme po~této stranì
261 hranice nic pøipojit, ani¾ by se externí vrchol dostal dovnitø nakreslení.
262
263 Pøitom se øídíme dvìma jednoduchými pravidly:
264
265 \s{Pravidlo \#1:} V~ka¾dém ¾ivém vrcholu zpracováváme nejdøíve zpìtné hrany do~$v$,
266 pak podøízené ¾ivé interní bloky a koneènì podøízené ¾ivé externí bloky.
267 (K~tomu se nám hodí, ¾e máme seznamy ¾ivých podøízených blokù setøídìné.)
268
269 \s{Pravidlo \#2:} Pokud vstoupíme do~dal¹ího bloku, vybereme si smìr, ve~kterém
270 budeme pokraèovat, následovnì: preferujeme smìr k~¾ivému internímu
271 vrcholu, pokud takový neexistuje, pak k~¾ivému externímu vrcholu.
272 Pokud se tento smìr li¹í od~smìru, ve~kterém jsme zatím hranici obcházeli,
273 blok pøeklopíme.
274
275 Èasová slo¾itost této èásti algoritmu je lineární ve~velikosti ¾ivého podgrafu
276 a¾ na~dvì výjimky. Jednou je konec prohledávání od~posledního ¾ivého vrcholu
277 k~bodu zastavení, druhou pak vybírání strany hranice pøi vstupu do~bloku.
278 V~obou mù¾eme procházet a¾ lineárnì mnoho pasivních vrcholù. Pomù¾eme si
279 ov¹em snadno: kdykoliv projdeme souvislý úsek hranice tvoøený pasivními
280 vrcholy, pøidáme pomocnou hranu, která tento úsek pøeklene. Mù¾eme ji dokonce
281 pøidat do~nakreslení a podrozdìlit si tak vnìj¹í stìnu.
282
283 \h{Hotový algoritmus}
284
285 \s{Algoritmus (kreslení do roviny):}
286
287 \algo
288 \:Pokud má graf více ne¾ $3n-6$ hran, odmítneme ho rovnou jako nerovinný.
289 \:Prohledáme graf $G$ do~hloubky, spoèteme \<Enter,> \<Ancestor> a \<LowPoint> v¹ech vrcholù.
290 \:Vytvoøíme \<BlockList> v¹ech vrcholù pøihrádkovým tøídìním.
291 \:Procházíme vrcholy v~poøadí klesajících \<Enter>ù, pro ka¾dý vrchol~$v$:
292 \::Nakreslíme v¹echny stromové hrany z~$v$ jako triviální bloky \hfil\break (2-cykly).
293 \::Oznaèíme ¾ivý podgraf.
294 \::Pro ka¾dého syna vrcholu~$v$ obcházíme ¾ivý podgraf nále¾ící k~tomuto vrcholu
295    v~obou smìrech a kreslíme zpìtné hrany do~$v$.
296 \::Zkontrolujeme, zda v¹echny zpìtné hrany vedoucí do~$v$ byly nakresleny, a pokud ne,
297    prohlásíme graf za~nerovinný a skonèíme.
298 \:Projdeme hotové nakreslení do~hloubky a zorientujeme seznamy sousedù.
299 \endalgo
300
301 \s{Vìta:} Tento algoritmus pro ka¾dý graf dobìhne v~èase $\O(n)$ a pokud byl graf rovinný,
302 vydá jeho nakreslení, v~opaèném pøípadì ohlásí nerovinnost.
303
304 \proof První krok je korektní, jeliko¾ pro v¹echny rovinné grafy je $m\le 3n-6$; nadále
305 tedy mù¾eme pøedpokládat, ¾e $m=\O(n)$. Lineární èasovou slo¾itost krokù 4--6 a~9 jsme ji¾
306 diskutovali, kroky~7--8 jsou lineární ve~velikosti ¾ivého podgrafu, a~tedy také $\O(n)$.
307 Nakreslení vydané algoritmem je v¾dy rovinné a v¹echny stromové hrany jsou v¾dy
308 nakresleny, zbývá tedy ukázat, ¾e zpìtnou hranu mù¾eme nenakreslit, jen pokud
309 graf nebyl rovinný. Tomu vìnujeme zbytek kapitoly.
310 \qed
311
312 \h{Dùkaz korektnosti}
313
314 \s{Lemma:} Pokud existuje zpìtná hrana, kterou algoritmus nenakreslil, graf na~vstupu
315 není rovinný.
316
317 \proof Pro spor pøedpokládejme, ¾e po~zpracování vrcholu~$v$ existuje nìjaká
318 zpìtná hrana~$wv$, kterou algoritmus nenakreslil, èili ¾e pøístup z~$v$ k~$w$
319 je v~obou smìrech blokován externími vrcholy. Rozborem pøípadù uká¾eme,
320 ¾e tato situace vede ke~sporu buïto s~pravidly \#1 a \#2 nebo s~rovinností grafu.
321
322 Oznaème $B$ blok, ve~kterém le¾í na~obou stranách hranice nìjaké externí
323 vrcholy $x$ a~$y$ a pod nimi je pøipojen nìjakou cestou vrchol~$w$. Takový blok
324 musí urèitì existovat, proto¾e jinak by algoritmus v¹echny bloky na~cestì z~$v$ do~$w$
325 popøeklápìl tak, aby se hrana $wv$ ve¹la. V~grafu se tedy musí vyskytovat jeden
326 z~následujících minorù (do~vrcholu~$u$ jsme kontrahovali celou dosud nenakreslenou èást grafu;
327 vybarvená èást odpovídá vnitøku bloku; hranaté vrcholy jsou externí):
328
329 \bigskip
330 \centerline{\epsfbox{minor1.eps}\qquad\epsfbox{minor2.eps}}
331 \bigskip
332
333 Minor~$M$ pøitom odpovídá situaci, kdy $v$ nele¾í v~bloku~$B$. Tento pøípad
334 snadno vylouèíme, proto¾e $M$ je isomorfní s~grafem $K_{3,3}$. V~grafu se proto
335 musí vyskytovat~$N$. Tento minor je ale rovinný, tak¾e musíme ukázat, ¾e vnitøek
336 bloku brání nakreslení hrany~$vw$ dovnitø. V¾dy pak dojdeme k~nìkterému z~následujících
337 nerovinných minorù ($N_1$ a¾ $N_3$ jsou isomorfní s~$K_{3,3}$ a $N_4$ s~$K_5$):
338
339 \bigskip
340 \centerline{\epsfbox{minor3.eps}\qquad\epsfbox{minor4.eps}}
341 \bigskip
342 \centerline{\epsfbox{minor5.eps}\qquad\epsfbox{minor6.eps}}
343 \bigskip
344
345 \>Uva¾me, jak bude $B$ vypadat po~odebrání vrcholu~$v$ a hran z~nìj vedoucích:
346
347 \numlist\nalpha
348 \:{\I pøestane být 2-souvislý} -- tehdy se zamìøíme na~bloky le¾ící na~cestì~$xy$:
349
350 \numlist\nparen
351 \finalfix{\rightskip=0.5\rightskip}
352 \:{\I $w$ je artikulace} na této cestì -- BÚNO je taková artikulace v~DFS prohledána po~bloku obsahujícím~$x$,
353 ale pøed~$y$. Tehdy nám jistì $x$ nezabránilo v~tom, abychom do~$w$ do¹li (mù¾e blokovat
354 jenom jednu stranu hranice), tak¾e jsme se ve~$w$ museli rozhodnout, ¾e pøednostnì zpracujeme
355 pokraèování cesty do~$y$ pøed hranou~$vw$, a~to je spor s~pravidlem~\#1.
356
357 \:{\I $w$ je v~bloku pøipojeném pod takovou artikulací} -- aby se pravidlo~\#1 vydalo
358 do~$y$ místo podøízených blokù, musí být alespoò jeden z~nich externí,
359 tak¾e v~$G$ je minor~$N_1$.
360
361 \:{\I $w$ je v~bloku na~cestì nebo pøipojen pod takový blok} -- opìt si v¹imneme, ¾e do~bloku jsme
362 vstoupili mezi~$x$ a~$y$. Abychom se podle pravidla~\#2 rozhodli pro stranu, z~ní¾ nevede
363 hrana~$vw$, musela na~druhé stranì být také hrana do~$v$, a~proto se v~grafu vyskytuje minor~$M$.
364 \endlist
365
366 \:{\I zùstane 2-souvislý} a vznikne z~nìj nìjaký blok~$B'$ -- tehdy rozebereme, jaké hrany vedou mezi $v$ a $B'$:
367
368 \numlist\nparen
369 \finalfix{\rightskip=0.5\rightskip}
370 \:{\I více ne¾ dvì hrany} -- minor~$N_2$.
371 \:{\I alespoò jedna hrana na \uv{horní} cestu} (to jest na~tu, na~ni¾ nele¾í~$w$) -- minor~$N_3$.
372 \:{\I dvì hrany do~$x,y$ nebo na \uv{dolní} cestu} -- a» u¾ jsme vstoupili na~hranici bloku~$B'$
373 kteroukoliv hranou, pravidlo~\#2 nám øeklo, ¾e máme pokraèovat vrchem, co¾ je mo¾né jedinì tehdy,
374 je-li na~spodní cestì je¹tì jeden externí vrchol, a~to dává minor~$N_4$.
375 \qeditem
376
377 \endlist
378
379 \endlist
380
381 \s{Poznámka:} Podle tohoto dùkazu bychom také mohli v~lineárním èase v~ka¾dém nerovinném
382 grafu nalézt Kuratowského podgraf, dokonce také v~$O(n)$, jeliko¾ kdy¾ je $m>3n-6$,
383 mù¾eme se omezit na~libovolných $3n-5$ hran, které urèitì tvoøí nerovinný podgraf.
384
385 \references
386 \bye