]> mj.ucw.cz Git - ads1.git/blob - 3-grafy/3-grafy.tex
Grafy: Prepsani casti o BFS
[ads1.git] / 3-grafy / 3-grafy.tex
1 \input ../lecnotes.tex
2
3 \prednaska{3}{Prohledání do~¹íøky a do~hloubky}{}
4
5 \h{Prohledání do~¹íøky {\I Breadth-First Search -- BFS} }
6
7 Jde o grafový algoritmus, který postupnì prochází v¹echny vrcholy v~dané komponentì souvislosti.
8 Algoritmus nejprve projde v¹echny sousedy poèáteèního vrcholu, poté sousedy sousedù, atd\dots
9 Díky tomuto zpùsobu procházení se nìkdy té¾ nazývá \uv{\I algoritmus vlny}, nebo» se z~poèáteèního vrcholu ¹íøí pomyslná vlna, která v~ka¾dém kroku nalezne v¹echny uzly, které mají od~poèáteèního vrcholu stejnou vzdálenost. Algoritmus se tedy skvìle hodí napøíklad pro hledání nejkrat¹í cesty mezi dvìma vrcholy v~grafu.
10
11 Zatím pøedpokládejme, ¾e graf, se kterým pracujeme, je orientovaný.
12 Orientovanou hranu $(u,v)$ z~$u$ do~$v$ budeme obvykle zkracovat jako $uv$.
13 Pro neorientované grafy bude v¹e obdobné.
14
15 \figure{praseci-graf.eps}{Praseèí graf a prùchod vlny skrz nìj}{55mm}
16
17 \s{Popis algoritmu:}
18 Na zaèátku vlo¾íme do~fronty $Q$ poèáteèní vrchol $v_0$. Dále si v~poli~$Z$
19 budeme pro ka¾dý vrchol pamatovat znaèku, zda jsme ho ji¾ nav¹tívili ($Z[v]=1$), èi
20 nikoli ($Z[v]=0$). Na poèátku jsou v¹echny znaèky nulové, jen vrchol~$v_0$, který
21 je oznaèen a vlo¾en do fronty.
22
23 V~ka¾dém dal¹ím kroku pak zkoumáme frontu $Q$: pokud není prázdná, vezmeme
24 z~ní první vrchol~$u$ a podíváme se na~v¹echny vrcholy~$v$, do nich¾ z~$u$
25 vede hrana. Pokud sousedi je¹tì nejsou oznaèení, tak je oznaèíme a pøidáme je do~fronty
26 k~následnému zpracování. Toto opakujeme, dokud není fronta prázdná.
27
28 \s{Algoritmus:}
29
30 \algo
31 \:$Q \leftarrow \{v_0\}$.
32 \:$Z[*] \leftarrow 0, Z[v_0] \leftarrow 1$.
33 \:Dokud $Q \not= \emptyset $ opakujeme:
34 \::Vyzvedneme vrchol $u$ z~$Q$.
35 \::$\forall v: uv\in E$:
36 \:::Je-li $Z[v]=0 \Rightarrow Z[v] \leftarrow 1$, pøidáme $v$ do~$Q$.
37 \endalgo
38
39 \s{Pozorování:} {\I BFS} se zastaví.
40
41 \proof Zpracováváme jen vrcholy, které byly ve~frontì. Ka¾dý vrchol se dostane do~fronty maximálnì jednou. (Ka¾dý je oznaèen max. jednou, znaèky neodstraòujeme.)
42
43 \s{Lemma:} BFS($v_0$) oznaèí $v$ právì tehdy, kdy¾ existuje cesta z~$v_0$ do~$v$.
44
45 \proof 
46 \uv{$\Longrightarrow$}: 
47 Platí jako invariant po celou dobu bìhu algoritmu. To doká¾eme indukcí dle doby
48 bìhu algoritmu:
49
50 První krok indukce je triviální, nebo» cesta z~$v_0$ do~$v_0$ existuje v¾dy.
51 Nyní si pøedstavme, ¾e oznaèujeme vrchol~$v$ pøes hranu~$uv$. To znamená, ¾e
52 vrchol~$u$ ji¾ musel být oznaèený. Dle indukèního pøedpokladu tedy existuje
53 cesta z~$v_0$ do~$u$, a tudí¾ pokud k~této cestì \uv{pøilepíme} hranu~$uv$,
54 dostáváme sled z~$v_0$ do~$v$, který lze v¾dy zredukovat na cestu.
55
56 \uv{$\Longleftarrow$} Sporem: Nech» existuje neoznaèený vrchol $v$ dosa¾itelný
57 po nìjaké cestì z~$v_0$. Uva¾me nejkrat¹í cestu $(v_0, v)$: $v_0, v_1 \dots,
58 v_k = v$ a vezmìme minimální~$i$ takové, ¾e~$v_i$ není oznaèený. Víme, ¾e~$i>0$
59 (nebo»~$v_0$ je urèitì oznaèen u¾ na zaèátku algoritmu). Tudí¾~$v_{i-1}$ je
60 oznaèený. Pøi oznaèení jsme ho ov¹em pøidali do fronty, tak¾e jsme ho z~fronty
61 museli pozdìji zase vyjmout. Pøi tom jsme ov¹em museli objevit hranu $v_{i-1}v_i$
62 a oznaèit vrchol~$v_i$, co¾ je spor.
63 \qed
64
65 Nyní tedy víme, ¾e algoritmus je správný, a máme pøedstavu o tom, jak funguje.
66 Podíváme-li se na~nìj podrobnìji, zjistíme, ¾e je hodnì závislý na~tom, jak si
67 budeme graf pamatovat. Zanedlouho zároveò zjistíme, ¾e nám reprezentace grafu
68 v~pamìti znatelnì ovlivní èasovou (i pamì»ovou) slo¾itost celého algoritmu.
69
70 \h{Reprezentace grafu v~pamìti}
71
72 Mìjme nìjaký orientovaný graf~$G$ s~$n$ vrcholy a $m$~hranami. Jak ho reprezentovat?
73
74 Vrcholy mù¾eme oèíslovat od~1 do~$n$. Pro ulo¾ení hran máme na~výbìr hned nìkolik zpùsobù.
75 Pøedvedeme si je na grafu z~následujícího obrázku:
76 \figure{imgn_o4.eps}{Ukázkový graf}{\epsfxsize}
77
78 \s{1. matice sousednosti}
79
80 Matice sousednosti pro graf $G$ na~$n$ vrcholech je ètvercová matice $A$ o~rozmìrech $n \times n$,
81 taková, ¾e $A_{i,j}$ popisuje, jestli z~vrcholu~$i$ do vrcholu~$j$ vede hrana ($A_{i,j}=1$)
82 nebo nikoliv ($A_{i,j}=0$).
83
84 Ná¹ graf z~obrázku vý¹e by tedy v~maticové reprezentaci vypadal takto:
85
86 $$\bordermatrix{
87   & A & B & C & D\cr
88 A & 0 & 1 & 1 & 0\cr
89 B & 0 & 0 & 0 & 1\cr
90 C & 0 & 0 & 0 & 1\cr
91 D & 1 & 1 & 0 & 0\cr
92 }$$
93
94 S touto maticí se pracuje velmi snadno, napø. v¹echny sousedy $i$-tého vrcholu
95 zjistíme jednodu¹e tak, ¾e projdeme $i$-tý øádek matice a najdeme v¹echny jednièky.
96 Má ov¹em dvì zøejmé nevýhody: èasovou a pamì»ovou slo¾itost. Projití sousedù
97 jednoho vrcholu trvá v¾dy $\Theta(n)$, projití sousedù pro v¹echny vrcholy (co¾
98 potøebujeme v~BFS) pak trvá $\Theta(n^2)$. Velikost matice je v¾dy $n \times
99 n$, bez ohledu na~to, jak \uv{øídký} je graf. U grafu s mnoha vrcholy, ale
100 s malým poètem hran, tedy budeme zbyteènì plýtvat místem v~pamìti. Tato
101 reprezentace je tedy nevýhodná pøedev¹ím pro tøídy grafù, jako jsou stromy,
102 které mají $n-1$ hran, nebo rovinné grafy, které mají nejvý¹e $3n-6$ hran.
103
104 \s{Pozorování:} BFS s reprezentací maticí sousednosti bì¾í v~èase: $\Theta(n^2)$.
105
106 \proof
107 U¾ jsme si uvìdomili, ¾e ka¾dý vrchol se dostane do~fronty $Q$ nejvý¹e jednou. Pro ka¾dý vrchol ve~frontì potøebujeme projít jeho sousedy, co¾ nám trvá s~reprezentací maticí sousednosti $\Theta(n)$. Vrcholù je celkem $n$, tedy èasová slo¾itost je $\Theta(n^2)$.
108 \qed
109
110 \smallskip
111 \s{2. seznam sousedù}
112
113 V~matici sousednosti jsme museli procházet jak hrany, tak nehrany, co¾ bylo zbyteèné. Bylo by tedy výhodnìj¹í pamatovat si pro ka¾dý vrchol pouze jeho sousedy. To mù¾eme zaøídit napøíklad jedním ze~dvou následujících zpùsobù:
114
115 Uchovávejme pole indexované vrcholy tak, ¾e v~ka¾dém prvku pole je ukazatel
116 na~spojový seznam sousedù tohoto vrcholu. Tedy $L(v)=\{w: vw \in E(G)\}$.
117
118 Pokud se nám nebude chtít pracovat se spojovými seznamy, mù¾eme vyu¾ít
119 reprezentaci pomocí dvou polí. První pole~$V$ bude opìt indexované vrcholy.
120 V~druhém poli~$E$ budou pro ka¾dý vrchol ulo¾eni jeho sousedé. V~poli~$V$ si
121 pamatujeme pro ka¾dý vrchol~$i$ index do~pole~$E$, kde zaèínají jeho sousedé,
122 a navíc dodefinujeme, ¾e $V[n+1]=m+1$.
123 K sousedùm vrcholu~$i$ se pak ji¾ dostaneme snadno -- nalezneme je na pozicích
124 $V[i], \dots, V[i+1]-1$.
125
126 \figure{sousedi.eps}{Znázornìní polí seznamu sousedù}{40mm}
127
128 Na tuto reprezentaci u¾ staèí prostor $\Theta(n + m)$, co¾ u¾ je, na~rozdíl
129 od~pøedchozího kvadratického prostoru, docela pøíjemné.
130
131 \s{Pozorování:} BFS s~reprezentací seznamem sousedù bì¾í v~èase $\Theta(n+m)$.
132
133 \proof
134 Algoritmus zpracuje ka¾dý vrchol nejvý¹e jednou a stráví jím èas lineární
135 v~poètu odchozích hran, tedy $\Theta({\rm deg}^-(v))$. Èasová slo¾itost celého
136 algoritmu tedy èiní:
137 $$\Theta\left(n+\sum_{v\in V(G)} {\rm deg}^-(v)\right) = \Theta(n+m).$$
138 \qed
139
140 \s{3. orákulum}
141
142 Dal¹í mo¾ností reprezentace je jakési orákulum, které nám na po¾ádání øekne (spoèítá),
143 kam vedou hrany z~daného vrcholu. To se hodí napøíklad tehdy, pokud graf vznikl
144 výpoètem a nechceme plýtvat pamìtí na jeho ulo¾ení. To se hodí napøíklad u~u¾
145 zmínìného hlavolamu \uv{Lloydova osmièka}.
146
147 \smallskip
148 \s{Neorientované grafy}
149
150 Chceme-li reprezentovat neorientovaný graf, ulo¾íme ka¾dou hranu v~obou orientacích.
151
152 \h{Výpoèet vzdáleností}
153
154 Abychom mohli vyu¾ít toho, ¾e algoritmus prochází vrcholy grafu ve~vlnì,
155 k~výpoètu vzdáleností, doplníme do nìj dvì pomocná pole:
156 $D[v]$ bude øíkat, na~kolik krokù jsme se do~$v$ dostali,
157 $P[v]$ bude obsahovat {\I pøedchùdce} vrcholu~$v$, toti¾ vrchol~$u$,
158 ze~kterého jsme se do~$v$ dostali po hranì a jeho¾ $D[u]=D[v]-1$.
159
160 \smallskip
161 \s{Roz¹íøený algoritmus:}
162 \algo
163 \:$Q \leftarrow \{v_0\}$.
164 \:$Z[*] \leftarrow 0, Z[v_0] \leftarrow 1$.
165 \:$D[*] \leftarrow \infty, D[v_0] \leftarrow 0$.
166 \:Dokud $Q \not= \emptyset $ opakujeme:
167 \::Vyzvedneme vrchol $u$ z~$Q$.
168 \::Pro ka¾dý vrchol $v$, do~kterého vede hrana z~vrcholu $u$:
169 \:::Je-li $Z[v]=0$:
170 \::::$Z[v] \leftarrow 1, D[v] \leftarrow D[u]+1, P[v] \leftarrow u$
171 \::::Pøidáme $v$ do~$Q$.
172 \endalgo
173
174 \s{Definice: {\I Fáze bìhu algoritmu}:} Ve~fázi $F_0$ je zpracováván vrchol $v_0$. Ve~fázi $F_{i+1}$ jsou zpracovávány vrcholy ulo¾ené do~fronty $Q$ bìhem fáze $F_i$.
175
176 \s{Pozorování:} Ka¾dý vrchol~$v$ dosa¾itelný z~$v_0$ se úèastní právì jedné fáze,
177 a to té s~èíslem~$D[v]$.
178
179 \s{Lemma:} Po zastavení BFS pro v¹echny vrcholy dosa¾itelné z~$v_0$ platí, ¾e $D[v]$
180 je rovno $d(v_0,v)$, toti¾ vzdálenosti (délce nejkrat¹í cesty) z~$v_0$ do~$v$.
181
182 \proof
183 Nejprve si uvìdomíme, ¾e kdykoliv je~$v$ oznaèen, vede do nìj z~$v_0$ nìjaký
184 sled délky~$v$ (indukcí, stejnì jako jsme pøed chvílí dokazovali, ¾e BFS projde
185 v¹echny dosa¾itelné vrcholy). Proto nemù¾e být $D[v]$ men¹í ne¾ $d(v_0,v)$.
186
187 Sporem doká¾eme, ¾e nemù¾e být ani vìt¹í. Pøedpokládejme, ¾e existuje nìjaký
188 \uv{¹patný} vrchol~$v$, pro který je $D[v] > d(v_0,v)$. Nech» $P$ je nìkterá z~nejkrat¹ích
189 cest z~$v_0$ do~$v$. Z~mo¾ných ¹patných vrcholù si vyberme takový, jeho¾ $P$ je nejkrat¹í
190 mo¾ná. Jeliko¾ pro vrchol~$v_0$ je zajisté $D[v_0] = d(v_0,v_0) = 0$, musí být $v$
191 rùzný od~$v_0$, tak¾e má na~$P$ nìjakého pøedchùdce~$u$. Pro toho ov¹em je vzdálenost
192 spoèítána správnì: $D[u] = d(v_0,u) = d(v_0,v)-1$.
193
194 Uva¾ujme nyní, co se stalo v~okam¾iku, kdy jsme~$D[u]$ nastavili. Tehdy jsme~$u$
195 ulo¾ili do fronty, po èase jsme ho z~fronty zase vytáhli a prozkoumali jsme v¹echny
196 vrcholy, do ní¾ vede z~$u$ hrana. Tedy i vrchol~$v$, tak¾e $D[v]$ v~tomto okam¾iku
197 nemù¾e být vìt¹í ne¾ $D[u]+1 = d(v_0,v)$, a~to je spor.
198 \qed
199
200 Víme tedy, ¾e BFS správnì spoèítá délky nejkrat¹ích cest do v¹ech vrcholù grafu.
201 Pomocí pøedchùdcù v~poli~$P$ mù¾eme tyto cesty dokonce snadno rekonstruovat:
202 pøedposledním vrcholem na nejkrat¹í cestì do~vrcholu~$v$ musí být vrchol $P[v]$,
203 jeho pøedchùdcem $P[P[v]]$, \dots, a¾ do~vrcholu~$v_0$.
204
205 Pøedchùdci nám tedy kódují strukturu nejkrat¹ích cest do~v¹ech vrcholù.
206 Mù¾eme se na nì dívat také následovnì:
207
208 \s{Definice:} Strom nejkrat¹ích cest je orientovaný strom s~mno¾inou vrcholù
209 $W=\{ v\in V(G) \mid \hbox{$v$ dosa¾itelný z~$v_0$} \}$
210 a hranami $\{ (P(v),v) \mid v\in W, v\ne v_0 \}$.
211
212 \s{Pozorování:} Koøenem stromu nejkrat¹ích cest je vrchol~$v_0$, cesta v~tomto
213 stromu z~$v_0$ do~$v$ (jednoznaènì urèená, je to strom) je pak jednou z~nejkrat¹ích
214 cest z~$v_0$ do~$v$ v~pùvodním grafu.
215
216 \smallskip
217 \s{Komponenty souvislosti}
218
219 V~neorientovaných grafech mù¾eme BFS jednodu¹e pou¾ít na nalezení komponent souvislosti.
220 Ji¾ víme, ¾e BFS spu¹tìné z~vrcholu~$v_0$ projde právì ty vrcholy, které jsou z~$v_0$
221 dosa¾itelné, co¾ jsou v~neorientovaném grafu pøesnì ty, které le¾í v~té¾e komponentì.
222
223 Staèí opakovanì spou¹tìt BFS z~dosud neoznaèených vrcholù, poka¾dé nám oznaèí
224 jednu komponentu.
225
226 \s{Algoritmus:}
227 \algo
228 \:Pro v¹echny vrcholy $v \in V(G)$ opakujeme:
229 \::Pokud je vrchol $v$ neoznaèený:
230 \:::Spustíme $\<BFS>(v)$ a pøiøadíme objevené vrcholy nové komponentì.
231 \endalgo
232
233 To, co jsme o~BFS zjistili, mù¾eme shrnout do následující vìty:
234
235 \s{Vìta:} $\<BFS>(v_0)$ v~èase $\Theta(n + m)$ spoète:
236 \itemize\ibull
237 \:vrcholy dosa¾itelné z~$v_0$
238 \:vzdálenosti tìchto vrcholù od~$v_0$
239 \:strom nejkrat¹ích cest z~$v_0$
240 \endlist
241
242 \>Prohledávání do~¹íøky ale není jediný algoritmus, který nìjak systematicky prochází graf. Jak u¾ název kapitoly napovídá, budeme se zabývat je¹tì druhým algoritmem, prohledáváním do~hloubky. Podívejme se, jak bude vypadat \dots
243
244 \h{Prohledávání do~hloubky {\I Depth-First Search -- DFS }}
245
246 Tento algoritmus neprochází graf ve~vlnì jako BFS, nýbr¾ ho prochází
247 rekurzivnì. V¾dy se zanoøí co nejhloubìji a¾ do~listu a pak se o~kus vrátí
248 a opìt se sna¾í zanoøit. Vrcholy, ve kterých u¾ byl, ignoruje.
249
250 Opìt uva¾me nejdøíve graf orientovaný. Následnì si uká¾eme, ¾e v~neorientovaném grafu budou pouze malé zmìny.
251
252 Budeme pou¾ívat podobné znaèení jako u~BFS. V~poli $Z$ si budeme pamatovat, zda jsme vrchol ji¾ nav¹tívili (hodnota 1), nebo ne (hodnota 0). Navíc promìnná~$T$ bude znaèit dobu bìhu algoritmu - tedy jakési \uv{hodiny}. Pøi ka¾dém nalezení nového vrcholu èi jeho opu¹tìní tuto promìnnou zvý¹íme o~1. Do~polí $\<in>$ a $\<out>$ si budeme ukládat èas (prvního) nalezení a opu¹tìní vrcholu.
253
254 \s{Algoritmus:}
255
256 \algo
257 \: inicializace: $Z[*] \leftarrow 0, T \leftarrow 1, \<in>[*] \leftarrow ?, \<out>[*] \leftarrow ?$
258 \: $DFS(v): Z[v] \leftarrow 1, \<in>[v] \leftarrow T|++|$
259 \:: Pro $w$: $vw \in E(G)$:
260 \::: Pokud $Z[w]=0 \Rightarrow DFS(w)$
261 \:: $out[v] \leftarrow T|++|$
262 \endalgo
263
264 \s {Vìta:} DFS($v_0$) v~èase $\Theta(m+n)$ oznaèí právì v¹echny vrcholy dosa¾itelné z~$v_0$.
265
266 \proof
267 Nejdøíve je potøeba dokázat, ¾e pokud je vrchol $v$ dosa¾itelný z~vrcholu $v_0$, tak jej DFS oznaèí. Dùkaz bude podobný jako u~BFS.
268
269 V analýze èasové slo¾itosti si pak opìt uvìdomíme, ¾e algoritmus vezme ka¾dý vrchol i hranu do~ruky právì jednou, tak¾e èasová slo¾itost bude $\Theta(n + m)$.
270 \qed
271
272 \figure{img5_dfso.eps}{Graf a znázornìní prùbìhu DFS s~jednotlivými hranami:}{\epsfxsize}
273
274 Mù¾eme si v¹imnout, ¾e jak DFS prochází graf, rozdìluje hrany do~4 skupin: hrany {\I stromové, zpìtné, dopøedné a pøíèné}.
275
276 Jedinì {\I stromové} hrany jsou takové, ¾e se po~nich DFS opravdu vydá. Vedou toti¾ do~vrcholu, který nebyl dosud objeven. V~ukázkovém grafu to jsou hrany: $\{(A \rightarrow B), (B \rightarrow C), (B \rightarrow D)\}$.
277
278 Pokud algoritmus objeví z~vrcholu $v$ hranu do~ji¾ døíve nav¹tíveného vrcholu $w$ a zároveò platí, ¾e $w$ je ve~stejném podstromu jako $v$, tak nazveme hranu $vw$ {\I zpìtnou}. Pro rozpoznání je dùle¾ité, ¾e vrchol $w$ byl ji¾ objeven, ale je¹tì ne opu¹tìn. V~ukázkovém grafu se jedná o hranu: $(C \rightarrow A)$.
279
280 Kdy¾ pøi prohledávání sousedù vrcholu $v$ narazíme na~vrchol $w$, který jsme ji¾ nav¹tívili, a to v~podstromì vrcholu $v$, tak nazveme hranu $vw$ {\I dopøednou}, nebo» vede z~$v$ do~jeho potomka. Platí tedy, ¾e jsme nejdøíve objevili vrchol $v$, potom vrchol $w$, pak jsme vrchol $w$ opustili a nyní jsme na~nìj znovu narazili po~dopøedné hranì. V~ukázkovém grafu hrana: $(A \rightarrow D)$.
281
282 Posledním typem hran je {\I pøíèná} hrana. Ta vede do~vrcholu v~sousedním podstromì zprava doleva. V~tomto pøípadì jsme tedy nejdøíve objevili vrchol $w$, ten jsme následnì opustili a a¾ pak jsme objevili vrchol $v$. V~ukázkovém grafu to je hrana: $(D \rightarrow C)$.
283
284 \s{K zamy¹lení:} Proè nemohou vést pøíèné hrany také zleva doprava?
285
286 K~rozpoznávání typù hran se nám tedy velmi hodí pole $\<in>$ a $\<out>$, ve~kterých si pamatujeme èasy objevení a opu¹tìní vrcholu. Podle toho, jak se intervaly objevení a opu¹tìní obou vrcholù pøekrývají, mù¾eme jednoznaènì rozhodnout, o jaký typ hrany se jedná:
287
288 U~zpìtných hran je poøadí: $\<in>(w)$, $\<in>(v)$, $\<out>(v)$, $\<out>(w)$. Intervaly do~sebe budou zanoøené takto: $<<>_v>_w$.
289
290 U~dopøedných hran je poøadí: $\<in>(v)$, $\<in>(w)$, $\<out>(w)$, $\<out>(v)$. Intervaly do~sebe budou zanoøené takto: $<<>_w>_v$.
291
292 U~pøíèných hran je poøadí: $\<in>(w)$, $\<out>(w)$, $\<in>(v)$, $\<out>(v)$. Intervaly do~sebe budou zanoøené takto: $<>_w<>_v$.
293
294 Pozn: Pou¾íváme zde toto znaèení: $<>_v = <in(v), out(v)>$. Jedná se o interval objevení a opu¹tìní vrcholu $v$.
295
296 \s{Typy hran ($v \rightarrow w$):}
297
298 \itemize\ibull
299 \:Stromové hrany \dots po nich DFS pro¹lo. $\{(A \rightarrow B), (B \rightarrow C), (B \rightarrow D)\}$
300 \:Zpìtné hrany $<<>_v>_w$\dots vedou do~pøedchùdce $v$ ve~stromu. $\{(C \rightarrow A)\}$
301 \:Dopøedné hrany $<<>_w>_v$\dots vedou do~potomka. $v$ $\{(A \rightarrow D)\}$
302 \:Pøíèné hrany $<>_w<>_v$\dots vedou do~vrcholu $v$ v~sousedním podstromì, v¾dy zprava doleva. $\{(D \rightarrow A)\}$
303 \endlist
304
305 \s{Pozorování:} Hrany, po~kterých DFS pro¹lo, tvoøí DFS strom.
306
307 \s{Pozorování:} Intervaly ($\<in>(v)$, $\<out>(v)$) $\forall v \in V(G) $ tvoøí dobré uzávorkování. (Intervaly synù disjunktnì vyplòují otce $\Rightarrow$ intervaly se nemohou køí¾it).
308
309 Nakonec si je¹tì uvìdomme, jak bude vypadat prohledávání do~hloubky na~neorientovaném grafu. Algortimus bude úplnì stejný, jenom se nám zredukuje poèet typù hran na~dvì: {\I stromové} a~{\I zpìtné}. Ani {\I dopøedné} ani {\I pøíèné} nebudou existovat, nebo» se z~{\I pøíèných} stanou {\I stromové} a z~{\I dopøedných zpìtné}.
310
311 \bye