深さ優先探索

同義語:depth-first searchDFS後退辺深さ優先探索木

概要

深さ優先探索(depth-first search)とは、グラフの頂点を訪れるとき、まだ訪れていない行き先があればすぐにそちらへ進み、行き先が尽きたら 1 つ前の頂点へ引き返すことを繰り返す探索の手順である。各頂点の発見時刻と終了時刻の区間は入れ子か交わらないかのどちらかになり、無向グラフでは探索の木に入らない辺がすべて先祖と子孫を結ぶ。このため、部分木から先祖へ戻る辺の有無を表す数 $\mathrm{low}(v)$ によって、除くとグラフが分かれる辺(橋)をすべて、頂点の個数と辺の本数の和に比例する手間で判定できる。有向グラフでは、子孫から先祖へ戻る辺があることと有向閉路があることが同値で、閉路がなければ終了時刻の大きい順の並びが位相的整列になる。

$$\newcommand{C}[0]{\mathbb{C}} \newcommand{div}[0]{\mathbin{÷}} \newcommand{N}[0]{\mathbb{N}} \newcommand{Q}[0]{\mathbb{Q}} \newcommand{R}[0]{\mathbb{R}} \newcommand{Z}[0]{\mathbb{Z}} $$

前提知識: グラフ, 木, 閉路, 有向グラフ

迷路を抜けるとき、糸を垂らしながら行けるところまで進み、行き止まりに当たったら糸をたどって最後の分かれ道まで戻り、まだ行っていない道に入る。これをグラフの上で行うのが 深さ優先探索 である。近いところから同心円状に広げる幅優先探索と違い、深さ優先探索は 1 本の道をどこまでも伸ばし、引き返すときに初めて分かれ道を試す。
この探し方は、たどった辺がなす木(深さ優先探索木)に特別な形を与える。無向グラフでは、木に入らなかった辺はすべて、木の上で先祖と子孫の関係にある 2 頂点を結ぶ(thm-dfs-no-cross)。この性質から、除くとグラフが分かれてしまう辺(閉路の記事で定義した橋)を、探索の途中で求めた数値だけで判定できる(thm-dfs-bridge)。有向グラフでは、子孫から先祖へ戻る辺があるかどうかで有向閉路の有無が分かり、なければ頂点を探索の終わった順の逆に並べると、すべての辺が前から後ろへ向かう(thm-dfs-dag)。

定義

この記事のグラフは頂点が有限個で、無向グラフは単純グラフ、有向グラフはループと同じ向きの平行辺のないものとする。無向グラフでは「$u$ の隣接頂点」を、有向グラフでは「$u$ から出る辺 $u\to v$ の終点 $v$」を考える。どちらも以下では $u$ の 行き先 と呼ぶ。

深さ優先探索

グラフ $G$ に対し、次の手順を 深さ優先探索(depth-first search、DFS)という。各頂点には印が付いているか付いていないかの状態があり、時刻を数える変数 $c$ を $0$ から始める。
訪問 $\mathrm{visit}(u)$:$u$ に印を付け、$c$ を $1$ 増やして $\mathrm{pre}(u):=c$ とする。$u$ の行き先 $v$ を順に 1 つずつ見て、$v$ に印が付いていなければ $p(v):=u$ とし、$\mathrm{visit}(v)$ を行い、それが終わってから次の行き先に進む。行き先をすべて見終えたら、$c$ を $1$ 増やして $\mathrm{post}(u):=c$ とし、訪問を終える。
全体:頂点を順に 1 つずつ見て、印が付いていなければ、その頂点 $r$ について $\mathrm{visit}(r)$ を行う(このような $r$ を 根 という)。
$\mathrm{pre}(u)$ を $u$ の 発見時刻、$\mathrm{post}(u)$ を 終了時刻、区間 $[\mathrm{pre}(u),\mathrm{post}(u)]$ を $u$ の 訪問区間 という。$p(v)$ を $v$ の 親 といい、辺 $p(v)v$(有向なら $p(v)\to v$)を 木の辺 という。頂点と木の辺からなるグラフを 深さ優先探索森 といい、根が 1 つのときは 深さ優先探索木 という。

訪問の中で別の訪問を行い、それが終わってから元の訪問を続けるので、訪問は入れ子になる。ある時点で進行中の訪問は、根から始まる親子の列 $r,\dots,p(u),u$ をなし、最後に始まったものが最初に終わる。各頂点は印が付くときに 1 回だけ訪問されるので、手順は有限回で終わる。行き先を見る順番によって森の形は変わる。
深さ優先探索森は、各根を根とする根付き木の集まりである。頂点 $u$ から親をたどって $v$ に着くとき、$v$ を $u$ の 先祖、$u$ を $v$ の 子孫 という($u$ 自身も $u$ の先祖かつ子孫とみなし、$u$ 以外のものを真の先祖・真の子孫という)。$v$ とその子孫全体からなる部分木を $T_v$ と書く。

直感

訪問区間は、頂点を「開いた」時刻と「閉じた」時刻である。$u$ を開いているあいだに開いた頂点は、すべて $u$ を閉じる前に閉じられる。開き括弧と閉じ括弧の対応と同じ形で、2 つの訪問区間は入れ子になるか交わらないかのどちらかになる。無向グラフでは、頂点 $u$ を開いているあいだに、$u$ の隣の頂点はすべて開かれる。だから隣り合う 2 頂点は、必ず一方が他方を開いているあいだに開かれ、先祖と子孫の関係になる。これが深さ優先探索の要の性質である。

例

2 つの三角形を橋でつないだグラフ

頂点 $1,\dots,6$ と辺 $12,23,31,34,45,56,64$ からなるグラフを、頂点 $1$ から、行き先を番号の小さい順に見て探索する。$1\to2\to3\to4\to5\to6$ と進み($3$ では $1,2$ に印が付いているので $4$ へ進む)、$6$ の行き先 $4,5$ にはどちらも印があるので引き返す。時刻は次のとおりである。

頂点$1$$2$$3$$4$$5$$6$
発見時刻 $\mathrm{pre}$$1$$2$$3$$4$$5$$6$
終了時刻 $\mathrm{post}$$12$$11$$10$$9$$8$$7$
$\mathrm{low}$(thm-dfs-bridge)$1$$1$$1$$4$$4$$4$

深さ優先探索木は道 $1,2,3,4,5,6$ で、木に入らない辺 $31$ と $64$ はどちらも先祖と子孫を結ぶ。辺 $34$ だけが橋であり、thm-dfs-bridge の判定では $\mathrm{low}(4)=\mathrm{pre}(4)$ がこれを示している。

有向グラフの探索

頂点 $a,b,c$ と辺 $a\to b$、$a\to c$、$c\to b$ の有向グラフを、$a$ から、行き先を $b,c$ の順に見て探索する。$a$(時刻 $1$)から $b$(時刻 $2$)へ進み、$b$ には行き先がないので終了(時刻 $3$)。$a$ に戻って $c$(時刻 $4$)へ進み、$c$ の行き先 $b$ にはもう印があるので終了(時刻 $5$)。最後に $a$ が終了(時刻 $6$)。木の辺は $a\to b$、$a\to c$ で、辺 $c\to b$ は先祖と子孫の関係にない 2 頂点を結ぶ。有向グラフでは thm-dfs-no-cross が成り立たない。終了時刻の大きい順に並べると $a,c,b$ で、3 本の辺はどれも前から後ろへ向かう(thm-dfs-dag)。

括弧の定理

訪問区間の入れ子

深さ優先探索の結果について、相異なる頂点 $u,v$ の訪問区間は、交わらないか、一方が他方の内側にあるかのどちらかである。さらに次は同値である。

  1. $u$ は $v$ の真の先祖である。
  2. $\mathrm{pre}(u)<\mathrm{pre}(v)<\mathrm{post}(v)<\mathrm{post}(u)$ である。
  3. $\mathrm{pre}(u)<\mathrm{pre}(v)<\mathrm{post}(u)$ である($v$ は $u$ の訪問の途中で発見される)。

要点:訪問は入れ子に行われ、時刻 $\mathrm{pre}(v)$ に進行中の訪問はちょうど $v$ の真の先祖の訪問である。

詳しい証明を開く

まず「時刻 $\mathrm{pre}(v)$ の直前に進行中の訪問は、$v$ の真の先祖の訪問ちょうどである」を $\mathrm{pre}(v)$ についての帰納法で示す。$v$ が根なら、根の訪問は全体の手順から直接始まるので、その直前に進行中の訪問はなく、根には真の先祖もない。$v$ が根でなければ、$\mathrm{visit}(v)$ は $\mathrm{visit}(p(v))$ の中から直接始まるので、その直前に進行中の訪問は、$p(v)$ の訪問と、時刻 $\mathrm{pre}(p(v))$ の直前に進行中だった訪問(進行中の訪問は、最後に始まったものが最初に終わるので、$p(v)$ の訪問が続いているあいだはそれらも続いている)である。帰納法の仮定により後者は $p(v)$ の真の先祖の訪問で、合わせて $v$ の真の先祖の訪問ちょうどになる。

3 ⇒ 1:$\mathrm{pre}(u)<\mathrm{pre}(v)<\mathrm{post}(u)$ なら、時刻 $\mathrm{pre}(v)$ に $u$ の訪問は進行中なので、上の主張から $u$ は $v$ の真の先祖である。1 ⇒ 2:上の主張から、時刻 $\mathrm{pre}(v)$ に $u$ の訪問は進行中で $\mathrm{pre}(u)<\mathrm{pre}(v)$ であり、$v$ の訪問は $u$ の訪問より後に始まったので先に終わり、$\mathrm{post}(v)<\mathrm{post}(u)$ である。2 ⇒ 3 は明らか。

前半:$\mathrm{pre}(u)<\mathrm{pre}(v)$ としてよい。$\mathrm{pre}(v)<\mathrm{post}(u)$ なら 3 が成り立つので 2 により $v$ の区間は $u$ の区間の内側にある。$\mathrm{post}(u)<\mathrm{pre}(v)$ なら 2 つの区間は交わらない(時刻はすべて相異なる)。$\square$

この補題は無向グラフでも有向グラフでも成り立つ(Eri19 §6.1、p. 228 と Lemma 6.1、p. 230)。辺の向きは使っていない。

無向グラフ:木に入らない辺

木に入らない辺は先祖と子孫を結ぶ

無向グラフ $G$ の深さ優先探索において、どの辺 $uv$ も、$u$ と $v$ の一方が他方の先祖であるような 2 頂点を結ぶ。とくに、木に入らない辺は、深さ優先探索森の同じ木の中で、先祖と真の子孫を結ぶ。

$\mathrm{pre}(u)<\mathrm{pre}(v)$ としてよい。時刻 $\mathrm{pre}(u)$ には $v$ に印が付いていない。$u$ の訪問は、終わる前に $u$ のすべての隣接頂点を見るので、$v$ も見る。そのとき $v$ に印が付いていなければ、$p(v)=u$ となり $u$ は $v$ の親である。すでに印が付いていれば、$v$ は時刻 $\mathrm{pre}(u)$ より後、$u$ の訪問が終わる前に発見されているので $\mathrm{pre}(u)<\mathrm{pre}(v)<\mathrm{post}(u)$ であり、lem-dfs-parenthesis の 3 ⇒ 1 により $u$ は $v$ の真の先祖である。どちらの場合も $u$ は $v$ の先祖である。$\square$

$u$ を開いているあいだに $u$ の隣接頂点を必ず見る、という無向グラフの対称性だけが使われている。有向グラフでは辺 $c\to b$ を $c$ から見るとき $b$ がすでに閉じていることがあり、結論は成り立たない(ex-dfs-directed)。また、幅優先探索 の木では、木に入らない辺が先祖と子孫を結ぶとは限らない。4 角形 $s,a,c,b$ を $s$ から幅優先探索すると、木の辺は $sa,sb,ac$ で、辺 $bc$ の両端はどちらも他方の先祖でない。

根が関節点となる条件

連結な無向グラフ $G$(頂点 $3$ 個以上)を根 $r$ から深さ優先探索する。$G$ から $r$ と $r$ に接続する辺を除いたグラフが連結でないことと、$r$ が深さ優先探索木で子を $2$ 個以上もつことは同値である。

thm-dfs-no-cross により、どの辺も深さ優先探索森の同じ木の 2 頂点を結ぶので、$G$ が連結なら森は $r$ を根とする 1 本の木で、すべての頂点を含む。とくに $r$ は子をもつ。$r$ の子が $c_1$ だけなら、$T_{c_1}$ は $r$ 以外のすべての頂点を含む木なので、$r$ を除いても連結である。子が $c_1,c_2,\dots$(2 個以上)なら、$T_{c_1}$ の頂点と $T_{c_2}$ の頂点を結ぶ辺はない。そのような辺があれば、thm-dfs-no-cross により一方が他方の先祖になるが、$T_{c_1}$ と $T_{c_2}$ は先祖・子孫の関係で結ばれない(共通の先祖は $r$ だけ)からである。$T_{c_1}$ の頂点 $x$ から出る辺の他端は、同じ定理により $x$ の先祖か子孫であり、$T_{c_1}$ の中にあるか $r$ である。よって $r$ を除くと、$T_{c_1}$ の頂点からほかの頂点へ行く道はなく、連結でない。$\square$

除くと連結成分が増える頂点を 関節点 という。根でない頂点では、子が 2 個以上あっても関節点とは限らない(下の反例の表)。根以外の頂点の判定も、次の定理と同じ考え方で探索中の数値から行えるが、この記事では扱わない。

橋の判定

無向グラフの辺 $e$ を除くと連結成分の個数が増えるとき、$e$ を 橋 という(閉路 の記事の定義「橋」)。$e$ が橋であることと、$e$ を含む閉路がないことは同値である(同記事の定理「閉路に含まれる辺と橋」)。深さ優先探索では、各頂点 $v$ について次の数を考える。
$$ \mathrm{low}(v):=\min\Bigl(\{\mathrm{pre}(v)\}\cup\{\mathrm{pre}(w)\mid x\in T_v,\ xw\text{ は木に入らない辺}\}\Bigr) $$
すなわち、$v$ の部分木の頂点から木に入らない辺を 1 本使って行ける頂点の発見時刻の最小値(なければ $\mathrm{pre}(v)$)である。

深さ優先探索による橋の判定

無向グラフ $G$ の深さ優先探索について、次が成り立つ。

  1. 木に入らない辺は橋でない。
  2. 木の辺 $e=p(v)v$ について、次は同値である。
    (i) $e$ は橋である。
    (ii) $T_v$ の頂点とそれ以外の頂点を結ぶ辺は $e$ だけである。
    (iii) $T_v$ の頂点と $v$ の真の先祖を結ぶ、木に入らない辺はない。
    (iv) $\mathrm{low}(v)=\mathrm{pre}(v)$ である。

準備として、$T_v$ の頂点 $x$ とその外の頂点 $w$ を結ぶ辺 $f=xw$ で $f\ne e$ のものは、木に入らない辺で、$w$ は $v$ の真の先祖であることを示す。木の辺は頂点と親を結ぶが、$x\ne v$ なら $p(x)\in T_v$、$x$ の子も $T_v$ に属するので、$T_v$ の内と外を結ぶ木の辺は $e$ だけである。よって $f$ は木に入らない。thm-dfs-no-cross により $w$ は $x$ の先祖か子孫で、$x$ の子孫は $T_v$ に属するから $w$ は $x$ の先祖である。$x$ の先祖は $x$ から親をたどって $v$ を経て根に至る列の頂点で、$w\notin T_v$ なので $w$ は $v$ の真の先祖である。
また、$T_v$ の頂点 $x$ は $v$ の子孫なので、lem-dfs-parenthesis により $\mathrm{pre}(x)\ge\mathrm{pre}(v)$ であり、$v$ の真の先祖 $w$ については $\mathrm{pre}(w)<\mathrm{pre}(v)$ である。
1:木に入らない辺 $xw$ は、thm-dfs-no-cross により一方($w$ とする)が他方の真の先祖である。$w=p(x)$ なら $xw$ は木の辺になってしまうので、$w$ は $x$ から親を 2 回以上たどった先にある。木の中の $w$ から $x$ への道(長さ $2$ 以上)に辺 $xw$ を加えると閉路になるので、$xw$ は橋でない。
2:(i) ⇒ (ii):$e$ のほかに $T_v$ の内と外を結ぶ辺 $f=xw$($x\in T_v$)があったとする。準備により $w$ は $v$ の真の先祖である。木の中の $w$ から $p(v)$ への道、辺 $e$、木の中の $v$ から $x$ への道、辺 $f$ をつなぐと、$w$ に戻る閉じた歩道で、頂点は重複しない(前半は $v$ の真の先祖、後半は $T_v$ の頂点)。長さは $3$ 以上である($w=p(v)$ なら $f\ne e$ より $x\ne v$ で、$v$ から $x$ への道の長さが $1$ 以上になる)。よって $e$ は閉路に含まれ、橋でない。
(ii) ⇒ (i):$e$ を含む閉路があったとすると、閉路から $e$ を除いたものは $v$ と $p(v)$ を結ぶ道で、$T_v$ の頂点から始まり外の頂点で終わるので、どこかで $T_v$ の内と外を結ぶ辺を通る。その辺は $e$ でないので (ii) に反する。よって $e$ を含む閉路はなく、$e$ は橋である。
(ii) ⇒ (iii) は明らかで、(iii) ⇒ (ii) は準備による。
(iii) ⇔ (iv):$x\in T_v$ から出る木に入らない辺 $xw$ の他端 $w$ は、準備と thm-dfs-no-cross により、$T_v$ の頂点($\mathrm{pre}(w)\ge\mathrm{pre}(v)$)か $v$ の真の先祖($\mathrm{pre}(w)<\mathrm{pre}(v)$)である。よって $\mathrm{low}(v)<\mathrm{pre}(v)$ であることと、$v$ の真の先祖へ向かうそのような辺があることは同値である。$\square$

$T_v$ は $v$ と $v$ の子 $c$ の部分木 $T_c$ の和なので、
$$ \mathrm{low}(v)=\min\Bigl(\{\mathrm{pre}(v)\}\cup\{\mathrm{pre}(w)\mid vw\text{ は木に入らない辺}\}\cup\{\mathrm{low}(c)\mid c\text{ は }v\text{ の子}\}\Bigr) $$
であり、$v$ の訪問を終えるときには子の訪問はすべて終わっているから、$\mathrm{low}(v)$ はその時点で計算できる。こうしてすべての橋が、深さ優先探索 1 回の手間で求まる。(i) ⇔ (ii) は深さ優先探索木に限らず任意の全域木で成り立つが(Eri19 第 6 章の演習 5、p. 246)、(ii) を「先祖へ戻る辺がない」(iii) に言い換えられるのは、thm-dfs-no-cross のおかげである。ex-dfs-two-triangles の表の $\mathrm{low}$ はこの式で計算したもので、$\mathrm{low}(v)=\mathrm{pre}(v)$ となる根以外の頂点は $4$ だけなので、橋は $34$ だけである。

手間

深さ優先探索の手間

各頂点の行き先の一覧が与えられているとき、深さ優先探索で訪問はちょうど $n$ 回($n$ は頂点の個数)行われ、行き先を見る回数の合計は、無向グラフでは $2m$、有向グラフでは $m$ である($m$ は辺の本数)。

全体の手順はすべての頂点を見るので、どの頂点にもいつか印が付き、印が付くのは訪問を始めるときだけで、印は消えないから、各頂点はちょうど 1 回訪問される。頂点 $u$ の訪問で行き先を見る回数は、無向なら $\deg u$、有向なら $u$ から出る辺の本数で、その和はそれぞれ $2m$(握手補題、次数(グラフ) の記事の定理「次数の総和と辺数」)と $m$ である。$\square$

1 回の操作の手間を一定とみなせば、深さ優先探索とそれによる橋の判定は、$n+m$ に比例する手間で終わる。

有向グラフ:閉路と並べ方

有向グラフの 有向閉路 とは、相異なる頂点 $v_0,\dots,v_{k-1}$($k\ge2$)で $v_0\to v_1\to\dots\to v_{k-1}\to v_0$ がすべて辺であるものをいう。有向閉路のない有向グラフを 有向非巡回グラフ(DAG)という。頂点を 1 列に並べて、すべての辺 $u\to v$ で $u$ が $v$ より前にあるようにしたものを 位相的整列 という。有向閉路があれば位相的整列はない(閉路を一周すると前に戻ってしまう)。

後退辺と有向閉路

有向グラフ $G$ の深さ優先探索について、次が成り立つ。

  1. どの辺 $u\to v$ についても、$\mathrm{post}(v)<\mathrm{post}(u)$ であるか、$v$ が $u$ の真の先祖であるかのどちらかである(後者の辺を 後退辺 という)。
  2. $G$ が有向閉路をもつことと、後退辺があることは同値である。
  3. $G$ が有向閉路をもたなければ、頂点を終了時刻の大きい順に並べたものは位相的整列である。

1:$\mathrm{pre}(u)<\mathrm{pre}(v)$ の場合。時刻 $\mathrm{pre}(u)$ に $v$ には印がなく、$u$ の訪問は終わる前に行き先 $v$ を見る。そのとき $v$ に印がなければ $v$ は $u$ の子になり、印があれば $v$ は $u$ の訪問の途中で発見されている。どちらの場合も $\mathrm{pre}(u)<\mathrm{pre}(v)<\mathrm{post}(u)$ で、lem-dfs-parenthesis により $\mathrm{post}(v)<\mathrm{post}(u)$ である。
$\mathrm{pre}(v)<\mathrm{pre}(u)$ の場合。$\mathrm{pre}(u)<\mathrm{post}(v)$ なら、$u$ は $v$ の訪問の途中で発見されたので、lem-dfs-parenthesis の 3 ⇒ 1 により $v$ は $u$ の真の先祖である。そうでなければ $\mathrm{post}(v)<\mathrm{pre}(u)<\mathrm{post}(u)$ である。
2:後退辺 $u\to v$ があれば、木の中の $v$ から $u$ への有向の道(木の辺は親から子へ向かう)に辺 $u\to v$ を加えると有向閉路になる($v\ne u$ なので $k\ge2$)。逆に後退辺がなければ、1 によりすべての辺 $u\to v$ で $\mathrm{post}(v)<\mathrm{post}(u)$ である。有向閉路 $v_0\to\dots\to v_{k-1}\to v_0$ があれば $\mathrm{post}(v_0)>\mathrm{post}(v_1)>\dots>\mathrm{post}(v_{k-1})>\mathrm{post}(v_0)$ となり矛盾する。
3:有向閉路がなければ 2 により後退辺はなく、1 によりすべての辺 $u\to v$ で $\mathrm{post}(u)>\mathrm{post}(v)$ である。よって終了時刻の大きい順に並べると、どの辺も前から後ろへ向かう。$\square$

とくに、有向非巡回グラフには位相的整列が必ずあり、深さ優先探索 1 回で求まる。これは Eri19 §6.2(p. 231)と §6.3(p. 232)にある。有向グラフで木に入らない辺は、後退辺のほかに、先祖から子孫へ向かう辺(前進辺)と、先祖・子孫の関係にない 2 頂点を結ぶ辺(横断辺)がありうる(同書 p. 229)。横断辺はつねに終了時刻の大きい方から小さい方へ向かう(1 による)。

条件を外した反例

外す条件反例成り立たなくなること
thm-dfs-no-cross の無向性ex-dfs-directed の辺 $c\to b$木に入らない辺は先祖と子孫を結ぶ
深さ優先探索の木(幅優先探索の木に替える)4 角形 $s,a,c,b$ の幅優先探索木と辺 $bc$木に入らない辺は先祖と子孫を結ぶ
cor-dfs-root の「根である」ex-dfs-nonroot の頂点 $a$子が $2$ 個以上なら、除くと連結でない
thm-dfs-dag の 3 の「有向閉路がない」辺 $a\to b$、$b\to a$終了時刻の大きい順が位相的整列になる
全体の手順(すべての頂点から始める)辺のない 2 頂点を、一方からの訪問だけで済ませる森がすべての頂点を含む
反例:子を 2 個もつが関節点でない頂点

頂点 $s,a,b,c$ と辺 $sa,ab,ac,bs,cs$ のグラフを、$s$ から行き先を $a,b,c$ の順に見て探索する。$s\to a\to b$ と進み、$b$ の行き先 $a,s$ には印があるので $a$ に戻り、$c$ へ進む。$c$ の行き先 $a,s$ にも印がある。木の辺は $sa,ab,ac$ で、$a$ は子 $b,c$ をもつ。しかし $a$ を除いても辺 $bs,cs$ が残り、$s,b,c$ は連結である。$T_b$ と $T_c$ の頂点がそれぞれ $a$ の真の先祖 $s$ へ戻る辺 $bs$、$cs$ をもつからである。

表の残りの確認

2 行目は thm-dfs-no-cross の後の段落、4 行目:$a$ から探索すると $\mathrm{pre}(a)=1$、$\mathrm{pre}(b)=2$、$\mathrm{post}(b)=3$、$\mathrm{post}(a)=4$ で、大きい順の $a,b$ では辺 $b\to a$ が後ろから前へ向かう(この辺は後退辺である)。5 行目:訪問を 1 回しか行わないと、根と同じ連結成分の外の頂点は森に入らない。

補足

深さ優先探索と幅優先探索

幅優先探索 はキュー(先に入れたものを先に出す列)で頂点を管理し、層の番号が距離になる。深さ優先探索は、進行中の訪問の列(最後に始めたものを先に終える列、スタック)で頂点を管理し、括弧の構造(lem-dfs-parenthesis)をもつ。最短の道を求めるには幅優先探索を、橋・関節点・有向閉路・位相的整列のように木の先祖と子孫の関係を使う問題には深さ優先探索を使う。どちらも手間は $n+m$ に比例する。

呼び名についての注意

木に入らない辺を、無向グラフでは「後退辺」とまとめて呼ぶことが多い。thm-dfs-no-cross により、それらはすべて子孫から先祖へ戻る辺とみなせるからである。有向グラフの辺の 4 分類(木の辺・前進辺・後退辺・横断辺)は、行き先を見る順番によって変わる(Eri19 p. 229)。発見時刻・終了時刻は、文献により訪問の前順序(preorder)・後順序(postorder)とも呼ばれる。

関連項目

参考文献

[1]
Jeff Erickson, Algorithms, Independently published, 2019, 第 6 章 Depth-First Search:§6.1(pp. 227–230、訪問区間の入れ子 p. 228、辺の分類 p. 229、Lemma 6.1 p. 230)、§6.2(p. 231)、§6.3(p. 232)、演習 5(p. 246、橋)

Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する