§D2.11有向グラフ・位相ソート・強連結成分

最終更新

辺に向きがあるとき、頂点のあいだの関係は対称ではなくなります。「uuからvvへ行くことができる」ことと「vvからuuへ行くことができる」ことが別の主張になるので、連結性の扱いも変わります。本記事は、向きのある辺をもつグラフについて二つのことを扱います。

第一は、有向閉路をもたない有向グラフの頂点を、どの辺も前から後ろへ向くように一列に並べることです。この並べ方を位相順序といいます。位相順序が存在することと有向閉路をもたないことが同値であることを証明し、位相順序を求める手続きを与えます。この並べ方は、「関係・同値関係・順序集合」で定めた半順序(§D2.5 定義 3.1)を全順序へ広げる操作にあたります。すなわち、比較することができない二つの要素に対しても、もとの順序と矛盾しない前後を定めます。

第二は、互いに行き来することができる頂点をまとめる操作です。このまとまりを強連結成分といいます。強連結成分を一つの頂点へ縮めると、有向閉路をもたない有向グラフが得られます。深さ優先探索を二度実行して強連結成分を求める手順を与え、その手順が正しい答えを返すことを証明します。

以下、有向グラフの頂点の個数をnn、辺の個数をmmと書きます。

1 有向グラフ

定義 1.1 (有向グラフと有向道). 有向グラフとは、有限集合VVと、VVの相異なる二つの要素の順序対からなる集合A⊆V×VA \subseteq V \times Vの組D=(V,A)D = (V, A)をいう。VVの要素を頂点、AAの要素を辺といい、辺(u,v)(u, v)をu→vu \to vとも書いて、uuをその始点、vvを終点という。始点と終点が一致する辺は考えない。

頂点vvについて、vvを始点とする辺の本数を出次数deg⁡+(v)\deg^{+}(v)、vvを終点とする辺の本数を入次数deg⁡−(v)\deg^{-}(v)という。

頂点の列v0,v1,…,vkv_0, v_1, \dots, v_k(k≥0k \ge 0)で、i=0,…,k−1i = 0, \dots, k-1について(vi,vi+1)∈A(v_i, v_{i+1}) \in Aを満たすものを、v0v_0からvkv_kへの有向歩道といい、kkをその長さという。頂点がすべて相異なる有向歩道を有向道という。v0=vkv_0 = v_kかつk≥1k \ge 1である有向歩道を閉じた有向歩道といい、そのうちv0,v1,…,vk−1v_0, v_1, \dots, v_{k-1}がすべて相異なるものを有向閉路という。uuからvvへの有向道が存在するとき、vvはuuから到達可能であるという。長さ00の有向道により、どの頂点も自分自身から到達可能である。

命題 1.2 (出次数と入次数の総和). 有向グラフD=(V,A)D = (V, A)について

∑v∈Vdeg⁡+(v)=∑v∈Vdeg⁡−(v)=∣A∣\sum_{v \in V} \deg^{+}(v) = \sum_{v \in V} \deg^{-}(v) = |A|

が成り立つ。

証明. 集合AAの要素の個数を、二通りに数えます。第一の数え方では、辺を始点によって分類します。始点がvvである辺の全体は互いに素な集合へAAを分割し、その要素の個数はdeg⁡+(v)\deg^{+}(v)です。和の法則(§D2.2 定理 2.1)により∣A∣=∑vdeg⁡+(v)|A| = \sum_{v} \deg^{+}(v)です。第二の数え方では、辺を終点によって分類します。同じ議論により∣A∣=∑vdeg⁡−(v)|A| = \sum_{v} \deg^{-}(v)です。▨

歩道と道の区別は、以降の証明で繰り返し使います。歩道は頂点の重複を許すので作りやすく、道は重複を許さないので扱いやすいという違いがあります。二つは、次の意味で行き来することができます。

補題 1.3 (歩道から道と閉路を取り出す). 有向グラフDDについて次が成り立つ。

  1. uuからvvへの有向歩道が存在すれば、uuからvvへの有向道が存在する。
  2. 長さが正の閉じた有向歩道が存在すれば、有向閉路が存在する。

証明. 1 を示します。uuからvvへの有向歩道は少なくとも一つ存在するので、そのなかで長さが最小のものv0=u,v1,…,vk=vv_0 = u, v_1, \dots, v_k = vをとります(長さは非負整数なので最小値が存在します)。頂点に重複がありvi=vjv_i = v_j(i<ji < j)となったとすると、列v0,…,vi,vj+1,…,vkv_0, \dots, v_i, v_{j+1}, \dots, v_kもまたuuからvvへの有向歩道であり、その長さはk−(j−i)<kk - (j - i) < kです。これは最小性に反します。よって頂点はすべて相異なり、この歩道は有向道です。

2 を示します。 長さが正の閉じた有向歩道のなかで長さが最小のものv0,v1,…,vk=v0v_0, v_1, \dots, v_k = v_0(k≥1k \ge 1)をとります。v0,…,vk−1v_0, \dots, v_{k-1}に重複がありvi=vjv_i = v_j(0≤i<j≤k−10 \le i < j \le k-1)となったとすると、vi,vi+1,…,vjv_i, v_{i+1}, \dots, v_jは長さj−i≥1j - i \ge 1の閉じた有向歩道です。j−i≤k−1<kj - i \le k-1 < kなので最小性に反します。よってv0,…,vk−1v_0, \dots, v_{k-1}はすべて相異なり、この歩道は有向閉路です。▨

2 閉路をもたない有向グラフの一列への並べ方

定義 2.1 (有向閉路をもたない有向グラフと位相順序). 有向グラフD=(V,A)D = (V, A)が有向閉路を一つももたないとき、DDを有向非巡回グラフという。

VVのすべての頂点をちょうど一度ずつ並べた列v1,v2,…,vnv_1, v_2, \dots, v_nがDDの位相順序であるとは、AAのすべての辺(vi,vj)(v_i, v_j)についてi<ji < jが成り立つことをいう。すなわち、どの辺も列の前から後ろへ向いている。

位相順序を作るときの出発点になるのは、入ってくる辺をもたない頂点です。

補題 2.2 (入次数が 0 の頂点の存在). 頂点を一つ以上もつ有向非巡回グラフには、入次数が00の頂点が存在する。

証明.DDの有向道のうち長さが最大のものを一つとります。有向道の長さは頂点の個数より小さいので上に有界であり、長さ00の有向道が存在するので、長さの最大値をとる有向道が存在します。それをu0,u1,…,uku_0, u_1, \dots, u_kとします。

u0u_0の入次数が00でないと仮定し、(w,u0)∈A(w, u_0) \in Aをとります。wwがu0,…,uku_0, \dots, u_kのどれとも一致しない場合、w,u0,u1,…,ukw, u_0, u_1, \dots, u_kは長さk+1k+1の有向道になり、最大性に反します。w=uiw = u_iとなるiiがある場合、u0,u1,…,ui,u0u_0, u_1, \dots, u_i, u_0は長さi+1≥1i+1 \ge 1の閉じた有向歩道です(i=0i = 0は始点と終点が一致する辺を意味し、そのような辺は考えないのでi≥1i \ge 1です)。補題 1.3の 2 により有向閉路が存在することになり、DDが有向非巡回グラフであることに反します。よってu0u_0の入次数は00です。▨

定理 2.3 (位相順序が存在するための必要十分条件). 有向グラフDDについて、DDの位相順序が存在することと、DDが有向非巡回グラフであることは同値である。

証明. 位相順序が存在すれば有向閉路をもたないことを示します。 位相順序v1,…,vnv_1, \dots, v_nをとり、有向閉路u0,u1,…,uk=u0u_0, u_1, \dots, u_k = u_0(k≥1k \ge 1)が存在すると仮定します。各utu_tが列の何番目かをp(t)p(t)と書くと、辺(ut,ut+1)(u_t, u_{t+1})について位相順序の定義からp(t)<p(t+1)p(t) < p(t+1)です。t=0t = 0からk−1k-1までつなぐとp(0)<p(k)p(0) < p(k)ですが、uk=u0u_k = u_0よりp(k)=p(0)p(k) = p(0)なので矛盾します。

有向閉路をもたなければ位相順序が存在することを示します。 頂点の個数nnについての累積帰納法(§D2.1 命題 1.2)で示します。n=0n = 0のときは空の列が位相順序です。

n≥1n \ge 1とし、頂点の個数がnnより少ないどの有向非巡回グラフにも位相順序が存在すると仮定します。補題 2.2により、入次数が00の頂点vvが存在します。vvとそれに接する辺をすべて取り除いた有向グラフをD−vD - vとします。D−vD - vの有向閉路はDDの有向閉路でもあるので、D−vD - vも有向非巡回グラフであり、頂点の個数はn−1n-1です。帰納法の仮定によりD−vD - vの位相順序v2,…,vnv_2, \dots, v_nが存在します。

列v,v2,…,vnv, v_2, \dots, v_nがDDの位相順序であることを確かめます。DDの辺(x,y)(x, y)をとります。y=vy = vである場合はvvの入次数が00であることに反するので起こりません。y≠vy \ne vかつx=vx = vの場合、vvは列の先頭なので順序は正しく保たれています。x≠vx \ne vかつy≠vy \ne vの場合、(x,y)(x, y)はD−vD - vの辺であり、v2,…,vnv_2, \dots, v_nがD−vD - vの位相順序であることから、xxはyyより前に現れます。以上より、すべての辺が前から後ろへ向いています。▨

注意 2.4 (位相順序は一つとは限らない).定理 2.3が主張するのは位相順序の存在であって、一意性ではない。頂点{a,b}\{a, b\}と辺を一本ももたない有向グラフでは、a,ba, bとb,ab, aの二つがともに位相順序である。一般に、到達可能性が定める半順序で比較不能な二頂点については、その一方を先に置く線形拡大も他方を先に置く線形拡大も存在する。ただし、比較不能な各対の前後を独立に指定できるわけではなく、全体として推移律を満たす全順序を選ぶ必要がある。この自由度が、次の節で述べる「半順序を全順序へ広げる」という見方に対応する。

3 位相順序を求める手続き

定理 2.3の証明は、入次数が00の頂点を取り除くという操作を繰り返しています。この操作をそのまま手続きにします。

定義 3.1 (入次数を減らしながら並べる手続き). 有向グラフD=(V,A)D = (V, A)を入力とする次の手続きを考える。各頂点wwについて整数c(w)c(w)を保持する。

  1. すべてのw∈Vw \in Vについてc(w)←deg⁡−(w)c(w) \leftarrow \deg^{-}(w)とする。LLを空の列、SSを{ w∈V:c(w)=0 }\{\, w \in V : c(w) = 0 \,\}を格納するキューまたはスタックとする。
  2. SSが空でない間、次を繰り返す。SSから頂点vvを一つ取り出してSSから除き、vvをLLの末尾へ加える。vvを始点とする各辺(v,w)(v, w)についてc(w)←c(w)−1c(w) \leftarrow c(w) - 1とし、その結果c(w)=0c(w) = 0になったならばwwをSSへ加える。
  3. LLの長さがnnならばLLを出力し、そうでなければ「有向閉路をもつ」と答える。

定理 3.2 (手続きの正当性、停止性、手数).定義 3.1の手続きは必ず停止する。DDが有向非巡回グラフであるときはDDの位相順序を出力し、そうでないときは「有向閉路をもつ」と答える。隣接リストによってDDを保持すると、手数はΘ(n+m)\Theta(n + m)である。

証明.R=V∖{ L に現れる頂点 }R = V \setminus \{\,L \text{ に現れる頂点}\,\}とおきます。

主張 3.2.1. 手順 2 の各回を始める時点で、次の三つが成り立ちます。

  1. LLは相異なる頂点の列であり、LLの頂点によるDDの誘導部分グラフの位相順序になっています。
  2. RRの頂点を始点としLLの頂点を終点とする辺は存在しません。
  3. すべてのw∈Rw \in Rについて、c(w)c(w)はRRの頂点を始点としwwを終点とする辺の本数に等しく、S={ w∈R:c(w)=0 }S = \{\, w \in R : c(w) = 0 \,\}です。

証明.LLは空、R=VR = Vなので主張 3.2.1 (1)と主張 3.2.1 (2)は空虚に成り立ち、主張 3.2.1 (3)は手順 1 の定め方そのものです。

三つが成り立っているとし、SSからvvを取り出します。主張 3.2.1 (3)よりc(v)=0c(v) = 0、すなわちRRの頂点からvvへの辺は存在しません。vvをLLの末尾へ移すと、新しいRRはR∖{v}R \setminus \{v\}です。

vvを終点とする辺の始点は、RRには無いのでLLの頂点であり、それらはvvより前に現れます。vvを始点とする辺の終点のうちLLにあるものは、主張 3.2.1 (2)により存在しません。よってLLにvvを加えた列も、その頂点による誘導部分グラフの位相順序であり、主張 3.2.1 (1)が保たれます。

新しいRRの頂点から新しいLLの頂点への辺を考えます。終点がvv以外のLLの頂点である辺は、もとの主張 3.2.1 (2)により存在しません。終点がvvである辺は、c(v)=0c(v) = 0によりRRの頂点を始点としないので、主張 3.2.1 (2)が保たれます。

vvがRRから抜けたので、w∈R∖{v}w \in R \setminus \{v\}に対して数えるべき辺の本数は、辺(v,w)(v, w)が存在する場合にちょうど11減ります。手順 2 はこの場合にだけc(w)c(w)を11減らしているので、ccは正しく保たれます。SSの更新も、c(w)c(w)が00になった頂点を加えるという形で主張 3.2.1 (3)を保ちます。▨

停止すること。 手順 2 の各回でLLの長さがちょうど11増え、∣R∣|R|がちょうど11減ります。∣R∣|R|は非負整数なので、繰り返しは高々nn回で終わります。

出力が正しいこと。 繰り返しを抜けた時点でS=∅S = \varnothingです。主張 3.2.1 (3)より、RRのすべての頂点wwについてc(w)≥1c(w) \ge 1、すなわちRRの頂点からwwへの辺が存在します。R≠∅R \ne \varnothingとすると、RRによる誘導部分グラフのすべての頂点の入次数が11以上になるので、補題 2.2の対偶により、この誘導部分グラフは有向閉路をもちます。それはDDの有向閉路でもあります。したがって、DDが有向非巡回グラフであればR=∅R = \varnothing、すなわちLLの長さはnnであり、主張 3.2.1 (1)によりLLはDD全体の位相順序です。逆にR≠∅R \ne \varnothingのときはDDが有向閉路をもつので、手順 3 の答えは正しくなっています。

手数。 手順 1 は各辺を一度ずつ調べて入次数を数えるのでΘ(n+m)\Theta(n + m)です。SSをキューまたはスタックで実装すれば、その末端での頂点の挿入と取出しはそれぞれΘ(1)\Theta(1)です。手順 2 では、各頂点がSSへ入るのはc(w)c(w)が00になった一度だけであり、各辺(v,w)(v, w)は始点vvがLLへ移るときに一度だけ調べられます。したがって繰り返し全体でΘ(n+m)\Theta(n + m)です。手順 3 はΘ(1)\Theta(1)です。▨

4 半順序を全順序へ広げる操作

有向非巡回グラフの到達可能性は、順序としての性質をもちます。

命題 4.1 (到達可能性が定める半順序).D=(V,A)D = (V, A)を有向非巡回グラフとし、u≤vu \le vを「vvがuuから到達可能である」と定めると、≤\leはVV上の半順序である。

証明. 反射律。 長さ00の有向道により、どの頂点も自分自身から到達可能です。

推移律。u≤vu \le vかつv≤wv \le wとすると、uuからvvへの有向道とvvからwwへの有向道が存在します。二つをつなぐとuuからwwへの有向歩道が得られるので、補題 1.3の 1 によりuuからwwへの有向道が存在します。よってu≤wu \le wです。

反対称律。u≤vu \le v、v≤uv \le u、u≠vu \ne vと仮定します。uuからvvへの有向道とvvからuuへの有向道をつなぐと、長さが正の閉じた有向歩道が得られます(u≠vu \ne vより、それぞれの長さは11以上です)。補題 1.3の 2 により有向閉路が存在することになり、DDが有向非巡回グラフであることに反します。よってu=vu = vです。▨

位相順序は、この半順序を全順序へ広げます。逆に、どの有限半順序集合も、この形で全順序へ広げることができます。

定理 4.2 (線形拡大の存在).(P,≤)(P, \le)を有限半順序集合とすると、PP上の全順序⪯\preceqで、a≤ba \le bならばつねにa⪯ba \preceq bとなるものが存在する。このような⪯\preceqを≤\leの線形拡大という。

証明. 有向グラフD=(P,A)D = (P, A)を、A={ (a,b):a≤b, a≠b }A = \{\, (a, b) : a \le b,\ a \ne b \,\}によって定めます。DDが有向閉路をもたないことを示します。有向閉路u0,u1,…,uk=u0u_0, u_1, \dots, u_k = u_0があるとすると、始点と終点が一致する辺を考えないのでk≥2k \ge 2です。辺の定め方からu0≤u1u_0 \le u_1かつu0≠u1u_0 \ne u_1であり、またu1≤u2≤⋯≤uk=u0u_1 \le u_2 \le \cdots \le u_k = u_0と≤\leの推移律からu1≤u0u_1 \le u_0です。反対称律によりu0=u1u_0 = u_1となり、u0≠u1u_0 \ne u_1に反します。よってDDは有向非巡回グラフです。

定理 2.3によりDDの位相順序v1,…,vnv_1, \dots, v_nが存在します。vi⪯vjv_i \preceq v_jをi≤ji \le jと定めると、⪯\preceqはPP上の全順序です。a≤ba \le bかつa≠ba \ne bならば(a,b)∈A(a, b) \in Aであり、位相順序の定義からaaはbbより前に現れるのでa⪯ba \preceq bです。a=ba = bのときはa⪯ba \preceq bが反射律から従います。▨

例 4.3 (約数の半順序を全順序へ広げる).P={1,2,3,4,6,12}P = \{1, 2, 3, 4, 6, 12\}に整除関係を入れた半順序集合(§D2.5 例 3.7)を考える。44と66は比較不能である。

1,2,3,4,6,121, 2, 3, 4, 6, 12という並べ方は線形拡大である。実際、11はすべての要素の前にあり、22は4,6,124, 6, 12の前に、33は6,126, 12の前に、44と66は1212の前にある。

1,3,2,6,4,121, 3, 2, 6, 4, 12も線形拡大である。11はすべての前、33は66と1212の前、22は6,4,126, 4, 12の前、66と44は1212の前にある。二つの線形拡大は44と66の前後を逆に定めており、比較不能な対の前後は線形拡大ごとに変わりうる。

一方1,2,4,3,12,61, 2, 4, 3, 12, 6は線形拡大ではない。66が1212より後ろにあるが6∣126 \mid 12なので、6⪯126 \preceq 12でなければならない。

5 強連結成分

向きを考えると、到達可能であることは対称ではありません。互いに到達可能であるという関係をとると、対称性が回復します。

定義 5.1 (強連結成分). 有向グラフD=(V,A)D = (V, A)の頂点u,vu, vについて、uuからvvへ到達可能であり、かつvvからuuへ到達可能であるときu∼vu \sim vと書く。∼\simによる同値類をDDの強連結成分という。

命題 5.2 (互いに到達可能であることは同値関係である).定義 5.1の関係∼\simはVV上の同値関係である。

証明. 反射律は長さ00の有向道から従います。対称律は、∼\simの定義がuuとvvについて対称であることから従います。推移律は、命題 4.1の推移律の証明と同じく、有向道をつないで補題 1.3の 1 を適用すれば得られます。▨

同値関係と分割の対応(§D2.5 命題 2.5)により、強連結成分は頂点集合を過不足なく分割します。成分を一つの頂点へ縮めると、有向閉路が消えます。

定理 5.3 (縮約した有向グラフは有向閉路をもたない).DDの強連結成分の全体を頂点集合とし、相異なる成分C≠C′C \ne C'について、CCのある頂点からC′C'のある頂点への辺がDDに存在するときC→C′C \to C'という辺を張って得られる有向グラフをDDの縮約という。DDの縮約は有向非巡回グラフである。

証明. 縮約に有向閉路C0,C1,…,Ck=C0C_0, C_1, \dots, C_k = C_0(k≥1k \ge 1)が存在すると仮定します。C0,…,Ck−1C_0, \dots, C_{k-1}は相異なる強連結成分です。CiC_iからCi+1C_{i+1}への辺があるので、CiC_iのある頂点からCi+1C_{i+1}のある頂点へ到達することができます。同じ成分の頂点どうしは互いに到達可能なので、CiC_iのどの頂点からもCi+1C_{i+1}のどの頂点へも到達可能です。これをi=0i = 0から順につなぐと、C0C_0のどの頂点からもC1C_1のどの頂点へも到達可能であり、C1C_1のどの頂点からもC2,…,Ck=C0C_2, \dots, C_k = C_0のどの頂点へも到達可能です。したがってC0C_0の頂点とC1C_1の頂点は互いに到達可能であり、C0=C1C_0 = C_1となります。k≥2k \ge 2ならばこれはC0C_0とC1C_1が相異なることに反します。k=1k = 1の場合は、縮約の辺が相異なる成分のあいだにだけ張られることに反します。▨

6 深さ優先探索による強連結成分への分解

強連結成分を求めるには、深さ優先探索を二度実行します。一度目で頂点に順序を付け、二度目でその順序に従って辺の向きを反転したグラフを探索します。

定義 6.1 (有向グラフ上の深さ優先探索). 有向グラフD=(V,A)D = (V, A)上の深さ優先探索とは、次の手続きをいう。大域的な時計を用意し、操作のたびに11進める。頂点uuを初めて訪問した時刻を行き掛け時刻d[u]d[u]、uuから出るすべての辺を調べ終えてuuから戻る時刻を帰り掛け時刻f[u]f[u]と書く。

uuを訪問したときの動作は、uuを訪問済みとし、uuを始点とする各辺(u,w)(u, w)を順に調べ、wwが未訪問であればwwを再帰的に訪問し、すべて調べ終えたらuuから戻る、というものである。この再帰でwwを初めて訪問したときの辺(u,w)(u, w)を集めたものを深さ優先探索の森といい、この森における先祖と子孫の関係を用いる。

VVのすべての頂点を、あらかじめ定めた順に見て、未訪問であればそこから訪問を開始する。すべての頂点はちょうど一度訪問され、ddとffの値は2n2n個の相異なる時刻をとる。

無向グラフの場合と同じく、時刻の区間には入れ子の構造があります。

補題 6.2 (時刻区間の括弧性). 相異なる頂点u,vu, vについて、区間[d[u],f[u]][d[u], f[u]]と[d[v],f[v]][d[v], f[v]]は、互いに素であるか、一方が他方に含まれるかのいずれかである。さらに、[d[v],f[v]]⊂[d[u],f[u]][d[v], f[v]] \subset [d[u], f[u]]であることと、vvが深さ優先探索の森においてuuの子孫であることは同値である。

証明.d[u]<d[v]d[u] < d[v]としてよい(そうでなければuuとvvを入れ替えます)。区間[d[u],f[u]][d[u], f[u]]は、uuの訪問が再帰の途中にある時間帯にあたります。d[v]<f[u]d[v] < f[u]ならば、vvはuuの訪問が終わる前に発見されているので、再帰が後入れ先出しの規律に従うことから、vvの訪問はuuから戻る前に終わりf[v]<f[u]f[v] < f[u]です。すなわち[d[v],f[v]]⊂[d[u],f[u]][d[v], f[v]] \subset [d[u], f[u]]です。d[v]>f[u]d[v] > f[u]ならばd[u]<f[u]<d[v]<f[v]d[u] < f[u] < d[v] < f[v]で二つの区間は互いに素です。時刻はすべて相異なるのでd[v]=f[u]d[v] = f[u]は起こりません。

包含と子孫関係が同値であることを示します。[d[v],f[v]]⊂[d[u],f[u]][d[v], f[v]] \subset [d[u], f[u]]ならば、vvはuuの訪問が再帰の途中にある間に発見されており、その間に発見される頂点は、再帰の入れ子の構造からすべてuuの子孫です。逆にvvがuuの子孫ならば、vvはuuから森の辺を順にたどってuuの訪問中に発見され、uuから戻る前に訪問を終えるので、d[u]<d[v]<f[v]<f[u]d[u] < d[v] < f[v] < f[u]です。▨

次の補題が、二度目の探索の正しさを支えます。

補題 6.3 (未訪問の頂点だけを通る道). 深さ優先探索において、頂点uuとvv(u≠vu \ne v)が次を満たすとする。uuからvvへの有向道u=w0,w1,…,wk=vu = w_0, w_1, \dots, w_k = vが存在し、時刻d[u]d[u]の直前においてw0,…,wkw_0, \dots, w_kがすべて未訪問である。このときvvは深さ優先探索の森においてuuの子孫であり、とくにf[v]<f[u]f[v] < f[u]である。

証明.wiw_iがuuの子孫でもuu自身でもないような最小のiiが存在すると仮定し、そのiiをとります。w0=uw_0 = uなのでi≥1i \ge 1であり、iiの最小性からwi−1w_{i-1}はuu自身かuuの子孫です。補題 6.2によりd[u]≤d[wi−1]<f[wi−1]≤f[u]d[u] \le d[w_{i-1}] < f[w_{i-1}] \le f[u]です。

辺(wi−1,wi)(w_{i-1}, w_i)は、wi−1w_{i-1}の訪問中、すなわち区間[d[wi−1],f[wi−1]][d[w_{i-1}], f[w_{i-1}]]に属するある時刻に調べられます。その時点でwiw_iが未訪問であれば、wiw_iはwi−1w_{i-1}の子として訪問され、uuの子孫になります。これはiiの取り方に反します。その時点でwiw_iが訪問済みであれば、wiw_iはその時刻より前に発見されているのでd[wi]<f[wi−1]≤f[u]d[w_i] < f[w_{i-1}] \le f[u]です。また仮定よりwiw_iは時刻d[u]d[u]の直前に未訪問なのでd[u]<d[wi]d[u] < d[w_i]です。よってd[u]<d[wi]<f[u]d[u] < d[w_i] < f[u]となり、補題 6.2により[d[wi],f[wi]]⊂[d[u],f[u]][d[w_i], f[w_i]] \subset [d[u], f[u]]、すなわちwiw_iはuuの子孫です。これもiiの取り方に反します。

したがってそのようなiiは存在せず、v=wkv = w_kはuu自身かuuの子孫です。u≠vu \ne vなのでvvはuuの子孫であり、補題 6.2によりf[v]<f[u]f[v] < f[u]です。▨

補題 6.4 (成分のあいだの辺と帰り掛け時刻).DD上で深さ優先探索を一度実行し、帰り掛け時刻ffを得たとする。CCとC′C'を相異なる強連結成分とし、CCのある頂点からC′C'のある頂点への辺が存在するとする。このとき

max⁡v∈Cf[v]>max⁡v∈C′f[v]\max_{v \in C} f[v] > \max_{v \in C'} f[v]

が成り立つ。

証明. まず、C′C'の頂点からCCの頂点への有向道は存在しません。存在すれば、CCからC′C'への辺とあわせてCCとC′C'の頂点が互いに到達可能になり、C=C′C = C'となるからです。

C∪C′C \cup C'の頂点のうち、探索が最初に訪問するものをxxとします。

x∈Cx \in Cの場合。 時刻d[x]d[x]の直前において、C∪C′C \cup C'の頂点はすべて未訪問です。v∈Cv \in Cに対しては、xxとvvが同じ強連結成分に属するのでxxからvvへの有向道があります。この道の上の頂点wwはxxから到達可能であり、またwwからvvへ、vvからxxへ到達可能なのでwwからxxへも到達可能です。よってw∼xw \sim xであり、道の頂点はすべてCCに属します。v∈C′v \in C'に対しては、xxからCCの中を通ってCCの頂点aaへ行き、辺(a,b)(a, b)(b∈C′b \in C')を通り、C′C'の中を通ってvvへ行く有向歩道があり、補題 1.3の 1 によって有向道が得られます。その道の頂点はC∪C′C \cup C'に含まれます。いずれの場合も道の頂点はd[x]d[x]の直前にすべて未訪問なので、補題 6.3によりf[v]<f[x]f[v] < f[x](v≠xv \ne xのとき)です。よってf[x]=max⁡v∈C∪C′f[v]f[x] = \max_{v \in C \cup C'} f[v]であり、とくにmax⁡v∈Cf[v]=f[x]>max⁡v∈C′f[v]\max_{v \in C} f[v] = f[x] > \max_{v \in C'} f[v]です。

x∈C′x \in C'の場合。 同じ議論により、C′C'のすべての頂点はxxの子孫またはxx自身であり、f[x]=max⁡v∈C′f[v]f[x] = \max_{v \in C'} f[v]です。一方、C′C'からCCへの有向道は存在しないので、xxからの訪問でCCの頂点が発見されることはありません。CCの頂点はd[x]d[x]の直前にすべて未訪問なので、xxの訪問が終わる時刻f[x]f[x]の時点でもすべて未訪問であり、その後に発見されます。したがってCCのすべての頂点vvについてd[v]>f[x]d[v] > f[x]、よってf[v]>f[x]f[v] > f[x]です。ゆえにmax⁡v∈Cf[v]>f[x]=max⁡v∈C′f[v]\max_{v \in C} f[v] > f[x] = \max_{v \in C'} f[v]です。▨

定義 6.5 (二度の深さ優先探索による分解). 有向グラフD=(V,A)D = (V, A)を入力とする次の手続きを考える。

  1. DD上で深さ優先探索を実行し、各頂点の帰り掛け時刻ffを得る。
  2. すべての辺の向きを反転した有向グラフDT=(V,{ (v,u):(u,v)∈A })D^{\mathsf{T}} = (V, \{\, (v, u) : (u, v) \in A \,\})を作る。
  3. 頂点をffの大きい順に並べ、その順に見て、未訪問であればその頂点からDTD^{\mathsf{T}}上の深さ優先探索を開始する。一回の開始で訪問される頂点の集合を、一つのまとまりとして出力する。

定理 6.6 (分解の正当性、停止性、手数).定義 6.5の手続きは停止し、手順 3 が出力する頂点の集合の族は、DDの強連結成分の全体に一致する。隣接リストによってDDを保持すると、手数はΘ(n+m)\Theta(n + m)である。

証明. まず、DDとDTD^{\mathsf{T}}の強連結成分は一致します。uuからvvへのDDの有向道は、逆にたどればvvからuuへのDTD^{\mathsf{T}}の有向道であり、その逆も成り立つので、互いに到達可能であるという関係はDDとDTD^{\mathsf{T}}で同じだからです。

主張 6.6.1.kk回目の開始の始点をxkx_kとし、xkx_kが属するDDの強連結成分をCkC_kとします。このとき、kk回目の開始で訪問される頂点の集合はちょうどCkC_kであり、kk回目の開始の直前に訪問済みである頂点の集合はC1∪⋯∪Ck−1C_1 \cup \cdots \cup C_{k-1}です。

証明.k=1k=1のとき、開始の直前に訪問済みである頂点の集合は空集合です。k>1k>1とし、11回目からk−1k-1回目まで主張が成り立つと仮定すると、kk回目の開始の直前に訪問済みである頂点の集合はC1∪⋯∪Ck−1C_1 \cup \cdots \cup C_{k-1}です。強連結成分はVVを分割するので、xkx_kが未訪問であることからCkC_kはC1,…,Ck−1C_1, \dots, C_{k-1}のいずれとも異なり、したがってCkC_kの頂点はすべて未訪問です。

CkC_kの頂点はすべて訪問されること。v∈Ckv \in C_kとすると、vvはDTD^{\mathsf{T}}においてxkx_kから到達可能であり、その有向道の頂点はすべてCkC_kに属するので未訪問です。よって深さ優先探索はvvを訪問します(補題 6.3)。

訪問される頂点がCkC_kを出ないこと。CkC_kに属さない頂点wwが訪問されたと仮定します。wwが属する強連結成分をC′C'とするとC′≠CkC' \ne C_kであり、wwは開始の直前に未訪問だったので、上と同じ理由でC′C'の頂点はすべて開始の直前に未訪問です。wwが訪問されたことから、DTD^{\mathsf{T}}においてxkx_kからwwへの有向道が存在します。これをDDの側で読むと、wwからxkx_kへの有向道です。この道が通る強連結成分を順に並べると、DDの縮約におけるC′C'からCkC_kへの辺の列が得られます(同じ成分の中を通る部分は縮約では動きません)。補題 6.4を各辺へ適用してつなぐと

max⁡v∈C′f[v]>max⁡v∈Ckf[v]\max_{v \in C'} f[v] > \max_{v \in C_k} f[v]

が得られます。ところが手順 3 はffの大きい順に未訪問の頂点を選ぶので、xkx_kは開始の直前に未訪問である頂点のうちffが最大のものです。CkC_kとC′C'の頂点はいずれも開始の直前に未訪問なので、max⁡v∈Ckf[v]=f[xk]≥max⁡v∈C′f[v]\max_{v \in C_k} f[v] = f[x_k] \ge \max_{v \in C'} f[v]でなければならず、矛盾します。

以上よりkk回目の開始で訪問される頂点の集合はちょうどCkC_kです。したがって、この開始後の訪問済み頂点の集合はC1∪⋯∪CkC_1\cup\cdots\cup C_kであり、次の開始の直前についての主張も従います。累積帰納法により、主張はすべての開始について成り立ちます。▨

主張 6.6.1により、手順 3 の各回が出力する集合は一つの強連結成分です。手順 3 はすべての頂点が訪問されるまで開始を繰り返すので、出力される集合の族は強連結成分の全体に一致します。

停止すること。 深さ優先探索では各頂点がちょうど一度訪問され、各辺がちょうど一度調べられるので、手順 1 と手順 3 はいずれも有限回の操作で終わります。手順 2 も辺の本数だけの操作です。

手数。 手順 1 と手順 3 の深さ優先探索は、隣接リストのもとでそれぞれΘ(n+m)\Theta(n + m)です。手順 2 は各辺を一度ずつ見て向きを入れ替えるのでΘ(n+m)\Theta(n + m)です。手順 3 の並べ替えは、帰り掛け時刻が11から2n2nまでの相異なる整数であることから、時刻の順に頂点を記録しておけば追加の手数なしに得られます。よって全体でΘ(n+m)\Theta(n + m)です。▨

例 6.7 (五つの頂点での実行例).V={1,2,3,4,5}V = \{1, 2, 3, 4, 5\}、A={(1,2),(2,3),(3,1),(3,4),(4,5),(5,4)}A = \{(1,2), (2,3), (3,1), (3,4), (4,5), (5,4)\}とする。

手順 1。 頂点11から訪問を始め、辺を添字の小さい順に調べるとすると、訪問は1→2→3→4→51 \to 2 \to 3 \to 4 \to 5と進む。55からは44への辺しかなく44は訪問済みなので55から戻り、以下順に戻る。時刻はd[1]=1d[1]=1,d[2]=2d[2]=2,d[3]=3d[3]=3,d[4]=4d[4]=4,d[5]=5d[5]=5,f[5]=6f[5]=6,f[4]=7f[4]=7,f[3]=8f[3]=8,f[2]=9f[2]=9,f[1]=10f[1]=10となる。

手順 2。DTD^{\mathsf{T}}の辺は(2,1),(3,2),(1,3),(4,3),(5,4),(4,5)(2,1), (3,2), (1,3), (4,3), (5,4), (4,5)である。

手順 3。ffの大きい順は1,2,3,4,51, 2, 3, 4, 5である。11からDTD^{\mathsf{T}}上の探索を始めると1→3→21 \to 3 \to 2と訪問し、22からは11への辺だけで11は訪問済みなので終わる。訪問された集合は{1,2,3}\{1, 2, 3\}である。次に未訪問でffが最大の頂点は44である。44からの探索は33(訪問済み)と55を見て、55からは44(訪問済み)を見て終わる。訪問された集合は{4,5}\{4, 5\}である。

得られた{1,2,3}\{1,2,3\}と{4,5}\{4,5\}は、実際にDDの強連結成分である。1→2→3→11 \to 2 \to 3 \to 1により1,2,31, 2, 3は互いに到達可能であり、4→5→44 \to 5 \to 4により4,54, 5は互いに到達可能である。一方44から11への有向道は存在しない(44と55を出る辺の終点は44と55だけである)ので、二つは別の成分である。

補題 6.4も確かめることができる。C={1,2,3}C = \{1,2,3\}からC′={4,5}C' = \{4,5\}への辺(3,4)(3,4)があり、max⁡v∈Cf[v]=10>7=max⁡v∈C′f[v]\max_{v \in C} f[v] = 10 > 7 = \max_{v \in C'} f[v]である。

注意 6.8 (成分が現れる順序).定理 6.6の証明が示すとおり、手順 3 は帰り掛け時刻の最大値が大きい成分から順に出力する。補題 6.4により、縮約においてC→C′C \to C'の辺があればCCのほうが先に出力される。したがって出力される順序は、DDの縮約の位相順序になっている(定理 5.3により縮約は有向非巡回グラフなので、位相順序という言い方が意味をもつ)。

参考文献

  1. Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, Cambridge, Massachusetts, 2022.
  2. Jon Kleinberg and Éva Tardos, Algorithm Design, Addison-Wesley, Boston, 2006.
  3. Reinhard Diestel, Graph Theory, 6th ed., Graduate Texts in Mathematics 173, Springer, Berlin, 2025.

前提記事