From: Jan 'Moskyt' Matejka Date: Mon, 20 Jun 2011 14:26:08 +0000 (+0200) Subject: 4: prepis nejdelsi cesty, rozkladu na komponenty, dopsani detekce cyklu X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;h=ac1ed331185eecd2f3178b4dd23696780a83c3ee;p=ads1.git 4: prepis nejdelsi cesty, rozkladu na komponenty, dopsani detekce cyklu --- diff --git a/4-dfs/4-dfs.tex b/4-dfs/4-dfs.tex index 20fc039..f8af8bb 100644 --- a/4-dfs/4-dfs.tex +++ b/4-dfs/4-dfs.tex @@ -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 $(v)$ v $G^R$ projde právì +komponenty~$G$. -2. Vrchol s maximálním $\(v)$ le¾í ve zdrojové komponente. +Pustíme-li $(G)$, pak vrchol s maximálním $\(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} \(x) > \max_{x \in C_2} \(x)$. +\s{Tvrzeníèko:} Dále pokud $(C_1, C_2) \in E(C(G))$, pak $$\max_{x \in C_1} \(x) > \max_{x \in C_2} \(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 \(C_1) > \(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 \(C_1) > \(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, $\(*) \Rightarrow$ ? -\:Spustíme $\(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, $\(*) \la$ ? +\:Spustíme $\(G)$, pøi opu¹tení vrcholu jej vlo¾íme do $Z$. Máme tedy vrcholy v zásobníku setøídìné podle $\(v)$. +\:Postupnì pro $v \in Z$: \::Pokud $\(v)=~?$ -\:::pustíme $\(v)$ v $G^R$, nav¹tíveným vrcholom $w$ nastavíme $\(w) \Rightarrow v$. -\algout Pro ka¾dý vrchol $v$, jeho komponentu $\(v)$. +\:::pustíme $\(v)$ v $G^R$, nav¹tíveným vrcholùm $w$ nastavíme $\(w) \la v$. +\algout Pro ka¾dý vrchol $v$ vrátíme jeho komponentu $\(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¾ $(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» $(G)$ urèí +nìjakou funkci $\$. Nech» je oznaèení vrcholù takové, ¾e $\(v_1)$ je +maximální pøes celý cyklus. Pak jistì $\(v_k) < \(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í $\(x) > \(y)$, na zpìtné +$\(x) < \(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 $\(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