3 \prednaska{11}{Kreslení grafů do roviny}{}
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).
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.
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.
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ů).}
29 \s{Definice:} Prohledávání orientovaného grafu do~hloubky rozdělí hrany do~čtyř druhů:
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
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
46 Nyní už se zaměříme pouze na~neorientované grafy~\dots
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ů.
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.
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ů.
66 Nyní si stačí rozmyslet, jak existenci zpětných hran testovat rychle. K~tomu se bude hodit:
68 \s{Definice:} Je-li $v$ vrchol grafu, pak:
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.
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.
79 Rozpoznávání bloků a artikulací můžeme shrnout do~následujícího lemmatu:
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.
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.
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
103 \figure{planar1.epdf}{Před nakreslením zpětných hran \dots}{}
104 \figure{planar2.epdf}{\dots\ po něm (čtverečky jsou externí vrcholy)}{}
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.
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ů.
123 \figure{planar1.epdf}{Před nakreslením zpětných hran \dots}{}
124 \figure{planar2.epdf}{\dots\ po něm (čtverečky jsou externí vrcholy)}{}
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.
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é.
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:
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í.}
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:
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ů.
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.
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.
168 \h{Reprezentace bloků a překlápění}
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
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ě
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.
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.
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.
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.
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.
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í.}
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.}
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.
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.
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.
245 \h{Kreslení zpětných hran}
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
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í.
263 Přitom se řídíme dvěma jednoduchými pravidly:
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é.)
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,
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.
283 \h{Hotový algoritmus}
285 \s{Algoritmus (kreslení do roviny):}
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ů.
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.
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.
312 \h{Důkaz korektnosti}
314 \s{Lemma:} Pokud existuje zpětná hrana, kterou algoritmus nenakreslil, graf na~vstupu
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.
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í):
330 \centerline{\epsfbox{minor1.epdf}\qquad\epsfbox{minor2.eps}}
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$):
340 \centerline{\epsfbox{minor3.epdf}\qquad\epsfbox{minor4.eps}}
342 \centerline{\epsfbox{minor5.epdf}\qquad\epsfbox{minor6.eps}}
345 \>Uvažme, jak bude $B$ vypadat po~odebrání vrcholu~$v$ a hran z~něj vedoucích:
348 \:{\I přestane být 2-souvislý} -- tehdy se zaměříme na~bloky ležící na~cestě~$xy$:
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.
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$.
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$.
366 \:{\I zůstane 2-souvislý} a vznikne z~něj nějaký blok~$B'$ -- tehdy rozebereme, jaké hrany vedou mezi $v$ a $B'$:
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$.
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.