From: Martin Mares Date: Wed, 13 Mar 2013 20:11:24 +0000 (+0100) Subject: DFS: Revize pro novou prednasku X-Git-Url: http://mj.ucw.cz/gitweb/?a=commitdiff_plain;p=ads1.git DFS: Revize pro novou prednasku --- diff --git a/4-dfs/4-dfs.tex b/4-dfs/4-dfs.tex index ebe9d4e..d8189ff 100644 --- a/4-dfs/4-dfs.tex +++ b/4-dfs/4-dfs.tex @@ -1,217 +1,231 @@ \input ../lecnotes.tex -\let\la\leftarrow -\prednaska{4}{Aplikace DFS}{do pou¾itelné podoby dokopal Jan \uv{Moskyto} Matìjka} +\prednaska{4}{Aplikace DFS}{} -\h{Detekce cyklù v orientovaném grafu} +\h{Opakování DFS} -Algoritmus na vypsání {\I v¹ech} cyklù v grafu si neuká¾eme, nebo» tento -problém je tì¾¹í, ne¾ se zdá. Mimo jiné proto, ¾e cyklù mù¾e být a¾ -exponenciálnì mnoho. Zde probíráme nalezení {\I nìjakého} cyklu v orientovaném -grafu. +DFS spu¹tìné z~vrcholu~$v_0$ v~èase $\Theta(n+m)$ nalezne podgraf +dosa¾itelný z~$v_0$ a pro nìj spoète: -\s{Definice:} $\(G)$ znaèíme spu¹tìní DFS tak, aby pro¹el v¹echny vrcholy. +\itemize\ibull +\:Èasy pøíchodu $\(v)$ a odchodu $\(v)$ pro v¹echny vrcholy~$v$. +\:Klasifikaci v¹ech hran, tedy jejich rozdìlení na {\I stromové, zpìtné, +dopøedné a pøíèné.} +\endlist + +Pokud není celý graf dosa¾itelný z~$v_0$, èasto se nám hodí volat +DFS opakovanì, dokud existují nedosa¾itelné vrcholy: -Realizace pøedchozí definice je jednoduchá. \algo -\:Dokud existuje nenav¹tívený vrchol $v$: -\::Spustíme $\(v)$. +\:Pro v¹echny vrcholy~$v$: +\::Pokud $v$ je¹tì není oznaèen jako nav¹tívený: +\:::Spustíme DFS z~vrcholu~$v$. \endalgo -\s{Lemma:} Cyklus je v grafu $G$ právì tehdy, kdy¾ $\(G)$ oznaèí nìjakou -hranu jako zpìtnou. - -\proof Buï $v_1,v_2,\dots,v_k,v_1$ cyklus v grafu $G$ a $v_1$ buï BÚNO vrchol s -max. $\(v_i)$. Pak jistì $\(v_k) < \(v_1)$. Jakého typu je hrana -$(v_k,v_1)$? +V¹imnìte si, ¾e tento algoritmus stále pracuje v~èase $\Theta(n+m)$. +(Mimochodem, stejného výsledku bychom dosáhli, pokud bychom do grafu +pøidali nìjaký nový vrchol a hrany z~nìj do v¹ech ostatních vrcholù.) -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á. +\h{Detekce cyklù v orientovaném grafu} -V opaèném smìru nalezneme pro zpìtnou hranu $(x,y)$ cestu z $y$ do $x$ po -stromových hranách. \qed +Mìjme orientovaný graf~$G$. Chceme zjistit, zda se v~nìm nachází orientovaný +cyklus (alespoò jeden; najít v¹echny je mnohem obtí¾nìj¹í, mimo jiné proto, +¾e jich mù¾e být exponenciálnì mnoho). -\s{Algoritmus:} -\algo -\algin Graf $G$ -\:Spustíme $\(G)$ a pøi nalezení první zpìtné hrany $(u,v)$ zastavíme. -\:Pokud jsme nalezli zpìtnou hranu: -\::Vypí¹eme v¹echny vrcholy mezi $(u,v)$ ze zásobníku onoho DFS v opaèném poøadí. -\:jinak -\::Graf je acyklický. -\endalgo +\s{Lemma:} Cyklus je v grafu $G$ právì tehdy, kdy¾ DFS provedené na celý +graf oznaèí nìjakou hranu jako zpìtnou. -\s{Èasová i pamì»ová slo¾itost} je $\O(m+n)$, nebo» se jedná o triviálnì upravené DFS. +\proof +Pokud existuje zpìtná hrana z~$u$ do~$v$, pak spolu s~cestou po stromových +hranách z~$v$ do~$u$ tvoøí cyklus. -\h{Topologické uspoøádání DAGu (grafu bez orientovaných cyklù)} +A~naopak: mìjme nìjaký cyklus a buï $v$ jeho vrchol s~nejni¾¹ím $\(v)$. +Tím pádem na hranì vedoucí z~$v$ do následujícího vrcholu na cyklu roste \, +co¾ je ov¹em mo¾né pouze na zpìtné hranì. +\qed -\s{Definice:} {\it Topologické uspoøádání} acyklického orientovaného grafu $G$ o $k$ -vrcholech je ohodnocení vrcholù èísly $1\dots k$ tak, ¾e $(u,v) \in E(G) -\Rightarrow f(u) < f(v)$. +%\s{Algoritmus:} +%\algo +%\algin Graf $G$ +%\:Spustíme $\(G)$ a pøi nalezení první zpìtné hrany $(u,v)$ zastavíme. +%\:Pokud jsme nalezli zpìtnou hranu: +%\::Vypí¹eme v¹echny vrcholy mezi $(u,v)$ ze zásobníku onoho DFS v opaèném poøadí. +%\:jinak +%\::Graf je acyklický. +%\endalgo -\s{Pozorování:} Vhodné topologické uspoøádání nám dá napøíklad $\$ z -$\(G^R)$. $G^R$~budi¾ graf $G$, ve kterém otoèíme orientace v¹ech hran. +\s{Èasová i pamì»ová slo¾itost} je $\O(m+n)$, nebo» se jedná o triviálnì upravené DFS. -\h{Hledání mostù v neorientovaném grafu} +\h{Topologické uspoøádání DAGu (grafu bez orientovaných cyklù)} -\s{Definice:} Hrana $uv \in E(G)$ je {\I most}, pokud se jejím odebráním -z~grafu $G$ zvý¹í poèet komponent souvislosti tohoto grafu. +\s{Definice:} {\it Topologické uspoøádání} acyklického orientovaného grafu +je lineární uspoøádání~$\prec$ na~vrcholech grafu takové, ¾e kdykoliv je $uv$ +hrana, pak $u\prec v$. -\s{Pozorování:} Hrana, která je v nìjakém cyklu, nemù¾e být mostem. Z cyklu -toti¾ lze libovolnì odebrat jednu hranu a pøesto zùstane souvislý. V¹echny -ostatní hrany naopak mosty jsou. +\s{Jiný pohled:} Je to prosté oèíslování $f: V(G) \rightarrow {\bb N}$ +takové, ¾e pro jakoukoliv hranu $uv\in E(G)$ platí $f(u) < f(v)$. -Mù¾e být mostem jiná hrana ne¾ stromová? Zpìtné hrany nutnì tvoøí cyklus. -Pøíèné a dopøedné se v neorientovaném DFS neobjeví. +\s{Pozorování:} Jak u¾ víme, spustíme-li DFS na acyklický graf, nenajde ¾ádnou +zpìtnou hranu. Na v¹ech ostatních typech hran \ klesá, tak¾e obrácené poøadí +\ù je topologické. +Z~toho plyne, ¾e v~èase $\Theta(n+m)$ lze topologicky uspoøádat libovolný DAG. -Hledáme tedy v¹echny stromové hrany, které nejsou v ¾ádném cyklu. Projdeme graf -zase pomocí upraveného DFS. +\h{Nejdel¹í cesta v ohodnoceném DAGu} -Kdy je hrana $uv$ v nìjakém cyklu? Kdy¾ existuje cesta $v\dots w$ (a nebo -$v=w$), zpìtná hrana $wx$ a cesta $x\dots u$ (a nebo $x=u$). +Mìjme DAG~$G$, ohodnocení jeho hran $\ell: E(G) \rightarrow {\bo R}$ +a nìjaký vrchol~$u$. Pro ka¾dý vrchol~$v$ chceme spoèítat $D(v)$ -- délku nejdel¹í cesty +z~$u$ do~$v$. -\smallskip -\s{Algoritmus} bude je¹tì trochu více upravené DFS. Pro ka¾dý vrchol~$v$ si -budeme kromì hloubky je¹tì pamatovat $z(v)$. To bude nejmen¹í \ vrcholu, -do kterého se dá dostat po zpìtných hranách z~vrcholu $v$ nebo podstromu pod ním. +\s{Algoritmus:} \algo -\:Vstoupíme do vrcholu $u$ jako DFS. -\:$x \la $~minimum z $\(v)$ pøes v¹echny zpìtné hrany $uv$ -\:$y \la $~minimum ze $z(w)$ pøes v¹echny stromové hrany $uw$ -\:$z(u) \la \min xy$ -\:Pokud $z(u) \ge \(u)$, -\::je jistì mostem hrana, po které jsme vstoupili do $u$. +\:Zvolíme topologické uspoøádání $w_1 \dots w_n$ na $G$. +\:Pro $v=w_1,\ldots,w_n$ postupnì provádíme: +\::Pokud $v=u$, pak $D(u) \= 0$. +\::Jinak: +$$D(v)\=\max_{w: wv \in E} (D(w) + \ell(wv)).$$ +(Pozor, mù¾e to být maximum z~prázdné mno¾iny, v~takovém pøípadì +je rovno $-\infty$.) \endalgo -\s{Èasová i pamì»ová slo¾itost} tohoto upraveného DFS jsou $\O(m+n)$. +\s{Pozorování:} V¹imnìte si, ¾e koneèné~$D(v)$ vyjde právì tìm vrcholùm~$v$, +které jsou dosa¾itelné z~$u$. -\qed - -\h{Nejdel¹í cesta v ohodnoceném DAGu} +\s{Èasová slo¾itost:} Topologické uspoøádání trvá $\Theta(n+m)$, +projití grafu s~výpoètem vzdáleností takté¾. -\s{Definice:} Pro $u,v \in V$ bude $D(u,v)$ délka nejdel¹í cesty z $u$ do $v$. -$D^R(u,v)$ bude délka nejdel¹í cesty v grafu s otoèenými hranami. +\s{TODO:} Kritické hrany. -Neexistuje-li cesta z $u$ do $v$, nech» $D(u,v) = -\infty$. -%Zvolme pak $D(u)$ jako nejdel¹í cestu zaèínající v $u$. Pak platí: $$D(u) = \max_{v\in V} D(u,v)$$ +%\h{Hledání kritických hran v ohodnoceném DAG-u} +%\s{Definice:} Hrana je kritická právì tehdy, kdy¾ le¾í na nìkteré z nejdel¹ích cest. +% +%\s{Pozorování:} Hrana $(x,y)$ je kritická právì tehdy, kdy¾ $D(u,x) + e(x,y) = D(u,y)$. +% +%\s{Algoritmus:} +%\algo +%\algin Graf $G$, v nìm vrchol $u$. +%\:Nalezneme v grafu $G$ nejdel¹í cesty z $u$ pøedchozím algoritmem +%\:Vybereme ty hrany, které splòují rovnost $D(u,x) + e(x,y) = D(u,y)$ -- kritické +%\algout Seznam kritických hran. +%\endalgo +%\s{Èasová a pamì»ová slo¾itost:} $\O(n+m)$ -\s{Algoritmus:} +\h{Hledání mostù v neorientovaném grafu} -\algo -\algin Graf $G$, v nìm vrchol $u$. -\:Zvolíme topologické uspoøádání $w_1 \dots w_n$ na $G$. Nech» $w_k=u$. -\:Pøedpoèítáme si ke ka¾dému vrcholu v¹echny jeho pøedchùdce, tedy mno¾inu -$W_i = \{w_j\mid(w_j,w_i)\in E\}$. -\:Pro v¹echny vrcholy $w_i$ pøed $u$ ($\forall w_i: i(v) = \min\{ \(w) \mid \hbox{z~$T_v$ vede zpìtná +hrana do~$w$} \}$. -\s{Definice:} $R$ bude relace na $V(G)$ taková, ¾e $uRv$ právì tehdy, kdy¾ existuje orientovaná cesta v~$G$ z~$u$ do~$v$ a souèasnì z~$v$ do~$u$. +\s{Dùsledek:} Stromová hrana~$uv$ je most právì tehdy, kdy¾ $\(v) > \(u)$. -% WTF? -%\>{\I Pozorování:} Pokud $R$ je ekvivalence a $u...v$ $v...w$ je $u$-$w$ sled $\Rightarrow$ existuje $u$-$w$ cesta. +Staèí domyslet, ¾e bìhem DFS mù¾eme snadno spoèítat \ pro v¹echny vrcholy. +Kdykoliv opou¹tíme vrchol~$v$, polo¾íme $\(v)$ rovnu minimu z~\ jeho +synù a \ vrcholù, do nich¾ z~$v$ vede zpìtná hrana. Tím DFS asymptoticky +nezpomalíme. -\s{Definice:} $G$ je {\I silnì souvislý} právì tehdy, kdy¾ $\forall (u,v) \in V(G): uRv$. +\h{Komponenty silné souvislosti} -\s{Definice:} {\I Komponenty silné souvislosti} grafu $G$ jsou ekvivalenèní tøídy relace $R$. +\s{Definice:} Buï $T$ bude relace na $V(G)$ definovaná tak, ¾e $uTv$ právì tehdy, +existuje-li orientovaná cesta v~$G$ z~$u$ do~$v$ a souèasnì z~$v$ do~$u$. -\s{Poznámka:} Je $R$ vùbec ekvivalence? Ano, zkuste si v definici prohodit $u$ a $v$. +\s{Pozorování:} $T$ je ekvivalence. Tøídám této ekvivalence se øíká {\I komponenty +silné souvislosti} (v~tomto oddílu øíkejme prostì {\I komponenty}). Graf je {\I silnì +souvislý,} pokud má právì jednu komponentu, tedy pokud $uTv$ pro ka¾dé dva vrcholu $u,v$. -\s{Definice:} {\I Graf komponent} $C(G)$ +\s{Definice:} {\I Graf komponent} ${\cal C}(G)$ je graf, jeho¾ vrcholy jsou +komponenty grafu~$G$ a z~komponenty $C_i$ vede hrana do~$C_j$ právì tehdy, +kdy¾ v~pùvodním grafu~$G$ existuje hrana z~nìjakého vrcholu $u\in C_i$ do nìjakého $v\in C_j$. -$V(C(G))$: Komponenty silné souvislosti grafu $G$ +Jiný pohled: ${\cal C}(G)$ je graf, který z~$G$ vznikne kontrakcí ka¾dé komponenty +do~jednoho vrcholu. (Násobné hrany pøi kontrakcích odstraòujeme.) -$(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. +\s{Lemma:} Graf komponent ${\cal C}(G)$ ka¾dého grafu~$G$ je acyklický. \proof -Sporem: Nech» $C_1, C_2, \dots C_k$ tvoøí cyklus v~$C(G)$. Podle definice grafu -komponent tedy musí existovat 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$. +Sporem: Nech» $C_1, C_2, \dots C_k$ tvoøí cyklus v~${\cal C}(G)$. Podle definice grafu +komponent tedy musí existovat vrcholy $x_1, \ldots, x_k$ ($x_i \in C_i$) +a $y_1, \ldots, y_k$ ($y_i \in C_{i+1}$, indexujeme modulo~$k$) takové, +¾e $x_i y_i$ jsou hrany grafu~$G$. + +V¹echny komponenty $C_i$ jsou silnì souvislé, tedy existuje cesta z~$y_{i-1}$ +do~$x_i$ v~$C_i$. + +Slepením tìchto hran a cest vznikne cyklus v~grafu~$G$ tvaru +$$ +x_1, y_1, \hbox{cesta v~$C_2$}, x_2, y_2, \hbox{cesta v~$C_3$}, x_3, \ldots, +x_k, y_k, \hbox{cesta v~$C_1$}, x_1. +$$ +To je ov¹em spor s~tím, ¾e vrcholy~$x_i$ le¾í v~rùzných komponentách. +\qed -V¹echny $C_i$ jsou silnì souvislé, tedy existuje cesta z~$y_{i-1} \pmod k$ do~$x_i$ -v~$C_i$. Slepíme nyní v¹echny tyhle cesty a hrany za sebe. -{\catcode`\@\active\let@\rightarrow$$x_1@y_1@\dots@x_2@y_2@\dots@x_3@y_3@\dots\,\dots\,\dots@x_k@y_k@\dots@x_1$$} +\s{Definice:} Buï~$G^R$ graf, který vznikne z~$G$ otoèením orientace v¹ech hran. -Slepením vznikne cyklus v~$G$, co¾ je spor, nebo» v¹echny vrcholy -v~cyklu musí le¾et v jedné komponentì souvislosti. -\qed +\s{Pozorování:} $G^R$ má tyté¾ komponenty jako~$G$. Navíc ${\cal C}(G^R) = ({\cal C}(G))^R$. -\smallskip +\s{Definice:} {\I Zdroj} øíkáme vrcholu, do~nìj¾ nevedou ¾ádné hrany. Symetricky +{\I stok} je vrchol, z~nìj¾ nevedou hrany. -\s{Definice:} {\it Zdroj} v grafu $G$ je takový vrchol, do kterého nevedou ¾ádné hrany +\s{Pozorování:} Ka¾dý DAG má alespoò jeden zdroj a alespoò jeden stok. +Zdroje v~$G$ jsou stoky v~$G^R$ a naopak. -\s{Definice:} {\it Zdrojová komponenta} grafu $G$ je taková komponenta silné -souvislosti, která tvoøí zdroj v $C(G)$. +\s{Definice:} {\it Zdrojová komponenta} grafu $G$ je taková komponenta, +která tvoøí zdroj v $C(G)$. (Jinými slovy, ani v~$G$ do ní nevedou ¾ádné hrany +z~jiných komponent.) -\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$. +\s{Trik:} Nech»~$C$ je nìjaká zdrojová komponenta a~$v$ libovolný její vrchol. +Potom DFS spu¹tìné v~$G^R$ z~vrcholu~$v$ oznaèí právì vrcholy komponenty~$C$. -Pustíme-li $\(G)$, pak vrchol s maximálním $\(v)$ le¾í nutnì ve zdrojové -komponentì (laskavý ètenáø doká¾e samostatnì). +\s{Plán:} Najdeme vrchol s~maximálním $\(v)$. Ten urèitì le¾í ve~zdrojové +komponentì (rozmyslete si). Spustíme z~nìj DFS v~$G^R$, tím oznaèíme jednu +komponentu. Odtrhneme ji a postup opakujeme. Dokonce nemusíme pøepoèítávat +\y. Staèí toti¾ pou¾ít následujicí: -\s{Tvrzeníèko:} 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:} Pokud $(C_1, C_2) \in E({\cal C}(G))$, pak $$\max_{x \in C_1} \(x) > \max_{x \in C_2} \(x).$$ \proof -\itemize\ibull -\: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 +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í. -Vybereme si tedy vrchol $v_1$ ve zdrojové komponentì grafu $G$ (ten s maximálním $\(v_1)$), spustíme -$\(v)$ v $G^R$ a v¹echny dosa¾ené vrcholy $w$ oznaèkujeme -- $\(w) \la v$. - -Nyní si vybereme vrchol $v_2$ ve zdrojové komponentì neoznaèkované èásti $G'$ -grafu $G$ (ten s maximálním $\(v_2)$) \dots\ a algoritmus analogicky opakujeme, dokud -existují neoznaèkované vrcholy. +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í. +\qed -\s{Pozorování:} Neoznaèkovaná èást $G'$ grafu $G$ je prázdná, nebo má zdrojovou -komponentu. Kdyby zdrojovou komponentu nemìla, tak nemá zdroj ani $C(G')$, tedy -$C(G')$ buïto obsahuje cyklus (spor s definicí), nebo je prázdný. +Staèí tedy vybrat vrchol s~nejvìt¹ím \, spustit z~nìj DFS v~$G^R$, +èím¾ oznaèíme první komponentu. Pak vybereme vrchol s~nejvìt¹ím \ +z~tìch, které je¹tì nebyly oznaèeny, a~pokraèujeme\dots \goodbreak \s{Algoritmus:} \algo \algin Graf $G$ \:Sestrojíme $G^R$ -\:$Z \la$ prázdný zásobník, $\(*) \la$ ? +\:$Z \=$ prázdný zásobník, $\(*) \=$ ? \: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$ s omezením jen na vrcholy $w$, pro které $\(w) =~?$, v¹em nav¹tíveným vrcholùm $w$ nastavíme $\(w) \la v$. +\:::pustíme $\(v)$ v $G^R$ s omezením jen na vrcholy $w$, pro které $\(w) =~?$, v¹em nav¹tíveným vrcholùm $w$ nastavíme $\(w) \= v$. \algout Pro ka¾dý vrchol $v$ vrátíme jeho komponentu $\(v)$. \endalgo -\s{Èasová a pamì»ová slo¾itost} bude $\O(m+n)$, nebo» první DFS má $\O(m+n)$, -ka¾dé dal¹í DFS se omezí jen na svoji komponentu silné souvislosti a souèet -velikostí v¹ech komponent souvislosti je $\O(m+n)$. +\s{Èasová a pamì»ová slo¾itost} bude $\Theta(m+n)$, nebo» první DFS má $\Theta(m+n)$, +ka¾dé dal¹í DFS se omezí jen na svoji komponentu a souèet +velikostí v¹ech komponent je $\Theta(m+n)$. \bye