]> mj.ucw.cz Git - ads1.git/commitdiff
4: prepis nejdelsi cesty, rozkladu na komponenty, dopsani detekce cyklu
authorJan 'Moskyt' Matejka <moskyto@atrey.karlin.mff.cuni.cz>
Mon, 20 Jun 2011 14:26:08 +0000 (16:26 +0200)
committerJan 'Moskyt' Matejka <moskyto@atrey.karlin.mff.cuni.cz>
Mon, 20 Jun 2011 14:35:16 +0000 (16:35 +0200)
4-dfs/4-dfs.tex

index 20fc03973472805eae7496324415667c69966908..f8af8bbf106b102f20101b5e054814e1a10463c5 100644 (file)
@@ -1,4 +1,5 @@
 \input ../lecnotes.tex
+\let\la\leftarrow
 
 \prednaska{4}{Aplikace DFS}{}
 
@@ -52,7 +53,7 @@ $$D(u,w_i)=\max_{w_j \mid (w_j, w_i) \in E} (D(u,w_j)) + e(w_i,w_j)$$
 %
 %%%%%%
 
-\h{Rozkládání orientovaných grafù na komponenty souvislosti}
+\h{Rozkládání orientovaných grafù na komponenty silné souvislosti}
 
 \s{Definice:} $R$ bude relace na $V(G)$ tak, ¾e $uRv$ znamená, ¾e existuje orientovaná cesta v~$G$ z~$u$ do~$v$ a opaènì.
 
@@ -65,35 +66,42 @@ $$D(u,w_i)=\max_{w_j \mid (w_j, w_i) \in E} (D(u,w_j)) + e(w_i,w_j)$$
 
 \s{Definice:} Graf komponent $C(G)$
 
-$V(C(G))$: Komponenty (silne souvislého) grafu $G$
+$V(C(G))$: Komponenty silné souvislosti grafu $G$
 
-$(C_1,C_2) \in E(C(G)) \Longleftrightarrow \exists v_1 \in C_1, v_2  \in C_2 : (v_1, v_2) \in E(G)$
+$(C_1,C_2) \in E(C(G)) \Leftrightarrow \exists v_1 \in C_1, v_2  \in C_2: (v_1, v_2) \in E(G)$
 
 \smallskip
 
 \s{Lemma:} Graf komponent $C(G)$ ka¾dého grafu $G$ je DAG.
 
 \proof
-Sporem: Nech» $C_1, C_2, \dots C_k$ tvoøí cyklus v~$C(G)$. Potom existují vrcholy $x_1 \dots x_k \in C_i$ a $y_1 \dots y_k \in C_{i+1}$ takové, ¾e $(x_i, y_i)$ jsou hrany grafu~$G$. V¹echny $C_i$ jsou silne souvislé, teda existuje cesta z~$y_{i-1}$ do~$x_i$ v~$C_i$. Slepením vznikne cyklus v~$G$, co¾ je spor.
+Sporem: Nech» $C_1, C_2, \dots C_k$ tvoøí cyklus v~$C(G)$. Potom existují
+vrcholy $x_1 \dots x_k \in C_i$ a $y_1 \dots y_k \in C_{i+1}$ takové, ¾e $(x_i,
+y_i)$ jsou hrany grafu~$G$.
+
+V¹echny $C_i$ jsou silnì souvislé, tedy existuje cesta z~$y_{i-1}$ do~$x_i$
+v~$C_i$. Slepením vznikne cyklus v~$G$, co¾ je spor, nebo» v¹echny vrcholy
+v~cyklu musí le¾et v jedné komponentì souvislosti.
 \qed
 
 \smallskip
 
-\s{Trik:}
-
-1. Uva¾ujme graf $G^R$ ($G$ s hranami opaène)
+\s{Definice:} {\it Zdrojová komponenta} grafu $G$ je taková komponenta silné
+souvislosti, která tvoøí zdroj v $C(G)$.
 
-~~~Pokud $v$ le¾í ve zdrojové komponente grafu $G$, pak DFS(v) v $G^R$ projde právì komponenty G.
+\s{Trik:} Uva¾ujme graf $G^R$ (graf $G$, ve kterém otoèíme orientace v¹ech hran). Pokud
+$v$~le¾í ve zdrojové komponentì grafu $G$, pak $<DFS>(v)$ v $G^R$ projde právì
+komponenty~$G$.
 
-2. Vrchol s maximálním $\<out>(v)$ le¾í ve zdrojové komponente.
+Pustíme-li $<DFS>(G)$, pak vrchol s maximálním $\<out>(v)$ le¾í nutnì ve zdrojové
+komponentì (laskavý ètenáø doká¾e samostatnì). 
 
-2*. Pokud $(C_1, C_2) \in E(C(G))$, pak $\max_{x \in C_1} \<out>(x) > \max_{x \in C_2} \<out>(x)$.
+\s{Tvrzeníèko:} Dále pokud $(C_1, C_2) \in E(C(G))$, pak $$\max_{x \in C_1} \<out>(x) > \max_{x \in C_2} \<out>(x).$$
 
 \proof
-2*:
 \itemize\ibull
-\:a.) DFS vstoupí nedøíve do $C_1$ : Z $C_2$ vyleze urèitì døív ne¾ z $C_1 \Rightarrow \<out>(C_1) > \<out>(C_2)$.
-\:b.) nejdøíve do $C_2$: Nejdøív se vrátím z celé $C_2$, a¾ pak nìkdy zase vlezu do $C_1 \Rightarrow \<out>(C_1) > \<out>(C_2)$.
+\:Buïto DFS vstoupí nejdøíve do $C_1$ -- nìkdy odtamtud dojde do $C_2$ a zase se nìkdy vrátí, rozhodnì ale døíve ne¾ z $C_1$. Pro tento pøípad tvrzeníèko platí.
+\:Nebo vstoupí nejdøíve do $C_2$. Odtud nemù¾e nikdy dojít do $C_1$. Vrátí se tedy rozhodnì døíve z celé $C_2$, ne¾ kdy vùbec vstoupí do $C_1$, tedy pro tento pøípad také tvrzeníèko platí.
 \endlist
 \qed
 
@@ -102,12 +110,46 @@ Sporem: Nech
 \algo
 \algin Graf $G$
 \:Sestrojíme $G^R$
-\:$S \in \emptyset$ seznam, $\<komp>(*) \Rightarrow$ ?
-\:Spustíme $\<DFS>(G)$, pøi opu¹tení vrcholu ho pøidáme na zaèátek $S$.
-\:Postupòe pro $v \in S$:
+\:$Z$ prázdný zásobník, $\<komp>(*) \la$ ?
+\:Spustíme $\<DFS>(G)$, pøi opu¹tení vrcholu jej vlo¾íme do $Z$. Máme tedy vrcholy v zásobníku setøídìné podle $\<out>(v)$.
+\:Postupnì pro $v \in Z$:
 \::Pokud $\<komp>(v)=~?$
-\:::pustíme $\<DFS>(v)$ v $G^R$, nav¹tíveným vrcholom $w$ nastavíme $\<komp>(w) \Rightarrow v$.
-\algout Pro ka¾dý vrchol $v$, jeho komponentu $\<komp>(v)$.
+\:::pustíme $\<DFS>(v)$ v $G^R$, nav¹tíveným vrcholùm $w$ nastavíme $\<komp>(w) \la v$.
+\algout Pro ka¾dý vrchol $v$ vrátíme jeho komponentu $\<komp>(v)$.
+\endalgo
+
+\h{Detekce cyklù v grafu}
+
+Algoritmus na vypsání {\I v¹ech} cyklù v grafu si neuká¾eme, nebo» tento
+problém je tì¾¹í, ne¾ se zdá. Zde probíráme nalezení {\I nìjakého} cyklu v grafu.
+
+\s{Lemma:} Cyklus je v grafu $G$ právì tehdy, kdy¾ $<DFS>(G)$ oznaèí nìjakou
+hranu jako zpìtnou.
+
+\proof Nech» je v grafu $G$ cyklus $v_1,v_2,\dots,v_k,v_1$, nech» $<DFS>(G)$ urèí
+nìjakou funkci $\<out>$. Nech» je oznaèení vrcholù takové, ¾e $\<out>(v_1)$ je
+maximální pøes celý cyklus. Pak jistì $\<out>(v_k) < \<out>(v_1)$. 
+
+Nyní uva¾me poøadí opou¹tìní vrcholù na rùzných typech hran $(x,y)$. Na
+stromové, dopøedné a pøíèné hranì platí $\<out>(x) > \<out>(y)$, na zpìtné
+$\<out>(x) < \<out>(y)$. Tedy $(v_k,v_1)$ musí být nutnì zpìtná.
+
+Opaèná implikace je triviální.
+\qed
+
+Dùkaz nám sám dává zpùsob, jak najít cyklus v grafu.
+
+\s{Algoritmus:}
+\algo
+\algin Graf $G$
+\:$Z$ budi¾ prázdný zásobník.
+\:Spustíme $\<DFS>(G)$ a pøi nalezení první zpìtné hrany $(u,v)$ zastavíme.
+\:Postupnì pro v¹echny otevøené vrcholy $w$ v poøadí, ve kterém by se z~nich DFS vracelo
+\::vlo¾íme $w$ na zásobník $Z$
+\::Pokud $w = v$ (nalezli jsme konec zpìtné hrany)
+\:::ukonèíme cyklus
+\algout Obsah zásobníku $Z$ (nalezený cyklus).
 \endalgo
 
+
 \bye