From c2514b3de5b42aa20dbbfd83cae1858e61b77479 Mon Sep 17 00:00:00 2001 From: Martin Mares Date: Tue, 24 May 2011 15:15:03 +0200 Subject: [PATCH] DFS: Nova verze od Paliho --- 4-dfs/4-dfs.tex | 108 ++++++++++++++++++++++++++++++++++++++++++++++++ 4-dfs/Makefile | 3 ++ 2 files changed, 111 insertions(+) create mode 100644 4-dfs/4-dfs.tex create mode 100644 4-dfs/Makefile diff --git a/4-dfs/4-dfs.tex b/4-dfs/4-dfs.tex new file mode 100644 index 0000000..0cb8e0a --- /dev/null +++ b/4-dfs/4-dfs.tex @@ -0,0 +1,108 @@ +\input ../lecnotes.tex + +\prednaska{4}{Aplikace DFS}{} + +\h{Nejdel¹í cesta v DAG-u (v grafu bez orientovaných cyklù):} + +\s{Definice:} Pro $w \in V$ bude $D(w)$ délka nejdel¹í cesty z $u$ do $w$. $D^R(w)$ bude délka nejdel¹í cesty v grafù s hranami opaène. + +\s{Algoritmus:} + +\algo +\algin Graf $G$ +\:Zvolíme topologické uspoøádání $w_1 \dots w_n$ na $G$ +\:Pro ka¾dé $w_i$ pøed $u$ nastavíme $D(w_i)=-\inf$ a $D(u)=0$ +\:Postupnì procházíme vrcholy $w_i \in V(G)$ v topologickém poøadí a pro $\forall w_i$ spoèítáme $D(w_i)$ +\::$D(w_i)=\max_{\forall w_j \mid (w_j, w_i) \in E} (D(w_j)) + 1$ +\algout Vrátime $D(v)$ +\endalgo + +\s{Èasová slo¾itost:} Sestrojení topologického uspoøádání v $O(n+m)$. Poèítání indukcí $D(w)$ také v $O(n+m)$. + +\s{Definice:} Hrana je kritická právì tehdy, kdy¾ $e$ le¾í na nìkteré z nejdel¹ích cest. + +\>{\I Pozorování:} $e = (x,y)$ kritická kdy¾ $D(x) + D^R(y) + e(x,y) = D(v)$ + +%%%%%% +% +%\s{Definice:} $e \in E(G)$ je most v neorientovaném grafu $G$ právì tehdy, kdy¾ $G-e$ má více komponent ne¾ $G$. +% +%\h{Hledání mostu} +% +%\>{\I Pozorování:} Zpìtná hrana není most. +% +%Jak to poznat o stromové? +% +%\s{Definice:} $\(v) := \min\{\(w) \mid \exists x \in T_v: (x, w) \hbox{ je zpìtná}\}$ +% +%\>{\I Pozorování:} ${u, v}$, $\(u) < \(v)$ není most právì tehdy kdy¾ existuje zpìtná hrana z $T_v$ do $w$ "nad $u$" (t.j. $\(w) < \(u)$) +% +%$\(v) < \(u)$ +% +%$\(s_1) \dots \(sk)$ známe +% +%\>{\I Pozorování:} $\(v) = \min\{\(s_1) \dots \(s_k), in(v), \min\{\(w) \mid (v, w) \hbox{ je zpìtná}\}\}$ +% +%%%%%% + +\h{Rozkládání orientovaných grafù na komponenty souvislosti} + +\s{Definice:} $R$ bude relace na $V(G)$ tak, ¾e $uRv \Longleftrightarrow$ existuje orientovaná cesta v~$G$ z~$u$ do~$v$ a opaène. + +\>{\I Pozorování:} Ak $R$ je ekvivalence a $u...v$ $v...w$ je $u$-$w$ sled $\Rightarrow$ existuje $u$-$w$ cesta. + +\s{Definice:} $G$ je silnì souvislý $\Longleftrightarrow \forall (u,v) \in V(G) : uRv$. + +{\narrower +\s{Definice:} Komponenty silné souvislosti grafu $G \Longleftrightarrow$ ekvivalence tøídy relace $R$ je +DAG - ka¾dý vrchol ve své komponente. +} + +\s{Definice:} Graf komponent $C(G)$ + +$V(C(G))$: Komponenty (silne souvislého) 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)$ + +\smallskip + +\s{Lemma:} $\forall (G) : C(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. +\qed + +\smallskip + +\s{Trik:} + +1. Uva¾ujme graf $G^R$ ($G$ s hranami opaène) + +~~~Pokud $v$ le¾í ve zdrojové komponente grafu $G$, pak DFS(v) v $G^R$ projde právì komponenty G. + +2. Vrchol s maximálním $\(v)$ le¾í ve zdrojové komponente. + +2*. 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)$. +\endlist +\qed + +\s{Algoritmus:} + +\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$: +\::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)$. +\endalgo + +\bye diff --git a/4-dfs/Makefile b/4-dfs/Makefile new file mode 100644 index 0000000..412cacb --- /dev/null +++ b/4-dfs/Makefile @@ -0,0 +1,3 @@ +P=4-dfs + +include ../Makerules -- 2.39.2