1 有向グラフ
定義 1.1 (有向グラフと有向道). 有向グラフ とは、有限集合V V V と、V V V の相異なる二つの要素の順序対からなる集合A ⊆ V × V A \subseteq V \times V A ⊆ V × V の組D = ( V , A ) D = (V, A) D = ( V , A ) をいう。V V V の要素を頂点 、A A A の要素を辺 といい、辺( u , v ) (u, v) ( u , v ) をu → v u \to v u → v とも書いて、u u u をその始点 、v v v を終点 という。始点と終点が一致する辺は考えない。
頂点v v v について、v v v を始点とする辺の本数を出次数 deg + ( v ) \deg^{+}(v) deg + ( v ) 、v v v を終点とする辺の本数を入次数 deg − ( v ) \deg^{-}(v) deg − ( v ) という。
頂点の列v 0 , v 1 , … , v k v_0, v_1, \dots, v_k v 0 , v 1 , … , v k (k ≥ 0 k \ge 0 k ≥ 0 )で、i = 0 , … , k − 1 i = 0, \dots, k-1 i = 0 , … , k − 1 について( v i , v i + 1 ) ∈ A (v_i, v_{i+1}) \in A ( v i , v i + 1 ) ∈ A を満たすものを、v 0 v_0 v 0 からv k v_k v k への有向歩道 といい、k k k をその長さ という。頂点がすべて相異なる有向歩道を有向道 という。v 0 = v k v_0 = v_k v 0 = v k かつk ≥ 1 k \ge 1 k ≥ 1 である有向歩道を閉じた有向歩道 といい、そのうちv 0 , v 1 , … , v k − 1 v_0, v_1, \dots, v_{k-1} v 0 , v 1 , … , v k − 1 がすべて相異なるものを有向閉路 という。u u u からv v v への有向道が存在するとき、v v v はu u u から到達可能 であるという。長さ0 0 0 の有向道により、どの頂点も自分自身から到達可能である。
命題 1.2 (出次数と入次数の総和). 有向グラフD = ( V , A ) D = (V, A) D = ( V , A ) について
∑ v ∈ V deg + ( v ) = ∑ v ∈ V deg − ( v ) = ∣ A ∣ \sum_{v \in V} \deg^{+}(v) = \sum_{v \in V} \deg^{-}(v) = |A| v ∈ V ∑ deg + ( v ) = v ∈ V ∑ deg − ( v ) = ∣ A ∣ が成り立つ。
証明. 集合A A A の要素の個数を、二通りに数えます。第一の数え方では、辺を始点によって分類します。始点がv v v である辺の全体は互いに素な集合へA A A を分割し、その要素の個数はdeg + ( v ) \deg^{+}(v) deg + ( v ) です。和の法則(§D2.2 定理 2.1 )により∣ A ∣ = ∑ v deg + ( v ) |A| = \sum_{v} \deg^{+}(v) ∣ A ∣ = ∑ v deg + ( v ) です。第二の数え方では、辺を終点によって分類します。同じ議論により∣ A ∣ = ∑ v deg − ( v ) |A| = \sum_{v} \deg^{-}(v) ∣ A ∣ = ∑ v deg − ( v ) です。▨
歩道と道の区別は、以降の証明で繰り返し使います。歩道は頂点の重複を許すので作りやすく、道は重複を許さないので扱いやすいという違いがあります。二つは、次の意味で行き来することができます。
補題 1.3 (歩道から道と閉路を取り出す). 有向グラフD D D について次が成り立つ。
u u u からv v v への有向歩道が存在すれば、u u u からv v v への有向道が存在する。
長さが正の閉じた有向歩道が存在すれば、有向閉路が存在する。
証明. 1 を示します。 u u u からv v v への有向歩道は少なくとも一つ存在するので、そのなかで長さが最小のものv 0 = u , v 1 , … , v k = v v_0 = u, v_1, \dots, v_k = v v 0 = u , v 1 , … , v k = v をとります(長さは非負整数なので最小値が存在します)。頂点に重複がありv i = v j v_i = v_j v i = v j (i < j i < j i < j )となったとすると、列v 0 , … , v i , v j + 1 , … , v k v_0, \dots, v_i, v_{j+1}, \dots, v_k v 0 , … , v i , v j + 1 , … , v k もまたu u u からv v v への有向歩道であり、その長さはk − ( j − i ) < k k - (j - i) < k k − ( j − i ) < k です。これは最小性に反します。よって頂点はすべて相異なり、この歩道は有向道です。
2 を示します。 長さが正の閉じた有向歩道のなかで長さが最小のものv 0 , v 1 , … , v k = v 0 v_0, v_1, \dots, v_k = v_0 v 0 , v 1 , … , v k = v 0 (k ≥ 1 k \ge 1 k ≥ 1 )をとります。v 0 , … , v k − 1 v_0, \dots, v_{k-1} v 0 , … , v k − 1 に重複がありv i = v j v_i = v_j v i = v j (0 ≤ i < j ≤ k − 1 0 \le i < j \le k-1 0 ≤ i < j ≤ k − 1 )となったとすると、v i , v i + 1 , … , v j v_i, v_{i+1}, \dots, v_j v i , v i + 1 , … , v j は長さj − i ≥ 1 j - i \ge 1 j − i ≥ 1 の閉じた有向歩道です。j − i ≤ k − 1 < k j - i \le k-1 < k j − i ≤ k − 1 < k なので最小性に反します。よってv 0 , … , v k − 1 v_0, \dots, v_{k-1} v 0 , … , v k − 1 はすべて相異なり、この歩道は有向閉路です。▨
2 閉路をもたない有向グラフの一列への並べ方
定義 2.1 (有向閉路をもたない有向グラフと位相順序). 有向グラフD = ( V , A ) D = (V, A) D = ( V , A ) が有向閉路を一つももたないとき、D D D を有向非巡回グラフ という。
V V V のすべての頂点をちょうど一度ずつ並べた列v 1 , v 2 , … , v n v_1, v_2, \dots, v_n v 1 , v 2 , … , v n がD D D の位相順序 であるとは、A A A のすべての辺( v i , v j ) (v_i, v_j) ( v i , v j ) についてi < j i < j i < j が成り立つことをいう。すなわち、どの辺も列の前から後ろへ向いている。
位相順序を作るときの出発点になるのは、入ってくる辺をもたない頂点です。
補題 2.2 (入次数が 0 の頂点の存在). 頂点を一つ以上もつ有向非巡回グラフには、入次数が0 0 0 の頂点が存在する。
証明. D D D の有向道のうち長さが最大のものを一つとります。有向道の長さは頂点の個数より小さいので上に有界であり、長さ0 0 0 の有向道が存在するので、長さの最大値をとる有向道が存在します。それをu 0 , u 1 , … , u k u_0, u_1, \dots, u_k u 0 , u 1 , … , u k とします。
u 0 u_0 u 0 の入次数が0 0 0 でないと仮定し、( w , u 0 ) ∈ A (w, u_0) \in A ( w , u 0 ) ∈ A をとります。w w w がu 0 , … , u k u_0, \dots, u_k u 0 , … , u k のどれとも一致しない場合、w , u 0 , u 1 , … , u k w, u_0, u_1, \dots, u_k w , u 0 , u 1 , … , u k は長さk + 1 k+1 k + 1 の有向道になり、最大性に反します。w = u i w = u_i w = u i となるi i i がある場合、u 0 , u 1 , … , u i , u 0 u_0, u_1, \dots, u_i, u_0 u 0 , u 1 , … , u i , u 0 は長さi + 1 ≥ 1 i+1 \ge 1 i + 1 ≥ 1 の閉じた有向歩道です(i = 0 i = 0 i = 0 は始点と終点が一致する辺を意味し、そのような辺は考えないのでi ≥ 1 i \ge 1 i ≥ 1 です)。補題 1.3 の 2 により有向閉路が存在することになり、D D D が有向非巡回グラフであることに反します。よってu 0 u_0 u 0 の入次数は0 0 0 です。▨
定理 2.3 (位相順序が存在するための必要十分条件). 有向グラフD D D について、D D D の位相順序が存在することと、D D D が有向非巡回グラフであることは同値である。
証明. 位相順序が存在すれば有向閉路をもたないことを示します。 位相順序v 1 , … , v n v_1, \dots, v_n v 1 , … , v n をとり、有向閉路u 0 , u 1 , … , u k = u 0 u_0, u_1, \dots, u_k = u_0 u 0 , u 1 , … , u k = u 0 (k ≥ 1 k \ge 1 k ≥ 1 )が存在すると仮定します。各u t u_t u t が列の何番目かをp ( t ) p(t) p ( t ) と書くと、辺( u t , u t + 1 ) (u_t, u_{t+1}) ( u t , u t + 1 ) について位相順序の定義からp ( t ) < p ( t + 1 ) p(t) < p(t+1) p ( t ) < p ( t + 1 ) です。t = 0 t = 0 t = 0 からk − 1 k-1 k − 1 までつなぐとp ( 0 ) < p ( k ) p(0) < p(k) p ( 0 ) < p ( k ) ですが、u k = u 0 u_k = u_0 u k = u 0 よりp ( k ) = p ( 0 ) p(k) = p(0) p ( k ) = p ( 0 ) なので矛盾します。
有向閉路をもたなければ位相順序が存在することを示します。 頂点の個数n n n についての累積帰納法(§D2.1 命題 1.2 )で示します。n = 0 n = 0 n = 0 のときは空の列が位相順序です。
n ≥ 1 n \ge 1 n ≥ 1 とし、頂点の個数がn n n より少ないどの有向非巡回グラフにも位相順序が存在すると仮定します。補題 2.2 により、入次数が0 0 0 の頂点v v v が存在します。v v v とそれに接する辺をすべて取り除いた有向グラフをD − v D - v D − v とします。D − v D - v D − v の有向閉路はD D D の有向閉路でもあるので、D − v D - v D − v も有向非巡回グラフであり、頂点の個数はn − 1 n-1 n − 1 です。帰納法の仮定によりD − v D - v D − v の位相順序v 2 , … , v n v_2, \dots, v_n v 2 , … , v n が存在します。
列v , v 2 , … , v n v, v_2, \dots, v_n v , v 2 , … , v n がD D D の位相順序であることを確かめます。D D D の辺( x , y ) (x, y) ( x , y ) をとります。y = v y = v y = v である場合はv v v の入次数が0 0 0 であることに反するので起こりません。y ≠ v y \ne v y = v かつx = v x = v x = v の場合、v v v は列の先頭なので順序は正しく保たれています。x ≠ v x \ne v x = v かつy ≠ v y \ne v y = v の場合、( x , y ) (x, y) ( x , y ) はD − v D - v D − v の辺であり、v 2 , … , v n v_2, \dots, v_n v 2 , … , v n がD − v D - v D − v の位相順序であることから、x x x はy y y より前に現れます。以上より、すべての辺が前から後ろへ向いています。▨
3 位相順序を求める手続き
定理 2.3 の証明は、入次数が0 0 0 の頂点を取り除くという操作を繰り返しています。この操作をそのまま手続きにします。
定義 3.1 (入次数を減らしながら並べる手続き). 有向グラフD = ( V , A ) D = (V, A) D = ( V , A ) を入力とする次の手続きを考える。各頂点w w w について整数c ( w ) c(w) c ( w ) を保持する。
すべてのw ∈ V w \in V w ∈ V についてc ( w ) ← deg − ( w ) c(w) \leftarrow \deg^{-}(w) c ( w ) ← deg − ( w ) とする。L L L を空の列、S S S を{ w ∈ V : c ( w ) = 0 } \{\, w \in V : c(w) = 0 \,\} { w ∈ V : c ( w ) = 0 } を格納するキューまたはスタックとする。
S S S が空でない間、次を繰り返す。S S S から頂点v v v を一つ取り出してS S S から除き、v v v をL L L の末尾へ加える。v v v を始点とする各辺( v , w ) (v, w) ( v , w ) についてc ( w ) ← c ( w ) − 1 c(w) \leftarrow c(w) - 1 c ( w ) ← c ( w ) − 1 とし、その結果c ( w ) = 0 c(w) = 0 c ( w ) = 0 になったならばw w w をS S S へ加える。
L L L の長さがn n n ならばL L L を出力し、そうでなければ「有向閉路をもつ」と答える。
定理 3.2 (手続きの正当性、停止性、手数). 定義 3.1 の手続きは必ず停止する。D D D が有向非巡回グラフであるときはD D D の位相順序を出力し、そうでないときは「有向閉路をもつ」と答える。隣接リストによってD D D を保持すると、手数はΘ ( n + m ) \Theta(n + m) Θ ( n + m ) である。
証明. R = V ∖ { L に現れる頂点 } R = V \setminus \{\,L \text{ に現れる頂点}\,\} R = V ∖ { L に現れる頂点 } とおきます。
主張 3.2.1. 手順 2 の各回を始める時点で、次の三つが成り立ちます。
L L L は相異なる頂点の列であり、L L L の頂点によるD D D の誘導部分グラフの位相順序になっています。
R R R の頂点を始点としL L L の頂点を終点とする辺は存在しません。
すべてのw ∈ R w \in R w ∈ R について、c ( w ) c(w) c ( w ) はR R R の頂点を始点としw w w を終点とする辺の本数に等しく、S = { w ∈ R : c ( w ) = 0 } S = \{\, w \in R : c(w) = 0 \,\} S = { w ∈ R : c ( w ) = 0 } です。
証明. L L L は空、R = V R = V R = V なので主張 3.2.1 (1) と主張 3.2.1 (2) は空虚に成り立ち、主張 3.2.1 (3) は手順 1 の定め方そのものです。
三つが成り立っているとし、S S S からv v v を取り出します。主張 3.2.1 (3) よりc ( v ) = 0 c(v) = 0 c ( v ) = 0 、すなわちR R R の頂点からv v v への辺は存在しません。v v v をL L L の末尾へ移すと、新しいR R R はR ∖ { v } R \setminus \{v\} R ∖ { v } です。
v v v を終点とする辺の始点は、R R R には無いのでL L L の頂点であり、それらはv v v より前に現れます。v v v を始点とする辺の終点のうちL L L にあるものは、主張 3.2.1 (2) により存在しません。よってL L L にv v v を加えた列も、その頂点による誘導部分グラフの位相順序であり、主張 3.2.1 (1) が保たれます。
新しいR R R の頂点から新しいL L L の頂点への辺を考えます。終点がv v v 以外のL L L の頂点である辺は、もとの主張 3.2.1 (2) により存在しません。終点がv v v である辺は、c ( v ) = 0 c(v) = 0 c ( v ) = 0 によりR R R の頂点を始点としないので、主張 3.2.1 (2) が保たれます。
v v v がR R R から抜けたので、w ∈ R ∖ { v } w \in R \setminus \{v\} w ∈ R ∖ { v } に対して数えるべき辺の本数は、辺( v , w ) (v, w) ( v , w ) が存在する場合にちょうど1 1 1 減ります。手順 2 はこの場合にだけc ( w ) c(w) c ( w ) を1 1 1 減らしているので、c c c は正しく保たれます。S S S の更新も、c ( w ) c(w) c ( w ) が0 0 0 になった頂点を加えるという形で主張 3.2.1 (3) を保ちます。▨
停止すること。 手順 2 の各回でL L L の長さがちょうど1 1 1 増え、∣ R ∣ |R| ∣ R ∣ がちょうど1 1 1 減ります。∣ R ∣ |R| ∣ R ∣ は非負整数なので、繰り返しは高々n n n 回で終わります。
出力が正しいこと。 繰り返しを抜けた時点でS = ∅ S = \varnothing S = ∅ です。主張 3.2.1 (3) より、R R R のすべての頂点w w w についてc ( w ) ≥ 1 c(w) \ge 1 c ( w ) ≥ 1 、すなわちR R R の頂点からw w w への辺が存在します。R ≠ ∅ R \ne \varnothing R = ∅ とすると、R R R による誘導部分グラフのすべての頂点の入次数が1 1 1 以上になるので、補題 2.2 の対偶により、この誘導部分グラフは有向閉路をもちます。それはD D D の有向閉路でもあります。したがって、D D D が有向非巡回グラフであればR = ∅ R = \varnothing R = ∅ 、すなわちL L L の長さはn n n であり、主張 3.2.1 (1) によりL L L はD D D 全体の位相順序です。逆にR ≠ ∅ R \ne \varnothing R = ∅ のときはD D D が有向閉路をもつので、手順 3 の答えは正しくなっています。
手数。 手順 1 は各辺を一度ずつ調べて入次数を数えるのでΘ ( n + m ) \Theta(n + m) Θ ( n + m ) です。S S S をキューまたはスタックで実装すれば、その末端での頂点の挿入と取出しはそれぞれΘ ( 1 ) \Theta(1) Θ ( 1 ) です。手順 2 では、各頂点がS S S へ入るのはc ( w ) c(w) c ( w ) が0 0 0 になった一度だけであり、各辺( v , w ) (v, w) ( v , w ) は始点v v v がL L L へ移るときに一度だけ調べられます。したがって繰り返し全体でΘ ( n + m ) \Theta(n + m) Θ ( n + m ) です。手順 3 はΘ ( 1 ) \Theta(1) Θ ( 1 ) です。▨
4 半順序を全順序へ広げる操作
有向非巡回グラフの到達可能性は、順序としての性質をもちます。
命題 4.1 (到達可能性が定める半順序). D = ( V , A ) D = (V, A) D = ( V , A ) を有向非巡回グラフとし、u ≤ v u \le v u ≤ v を「v v v がu u u から到達可能である」と定めると、≤ \le ≤ はV V V 上の半順序である。
証明. 反射律。 長さ0 0 0 の有向道により、どの頂点も自分自身から到達可能です。
推移律。 u ≤ v u \le v u ≤ v かつv ≤ w v \le w v ≤ w とすると、u u u からv v v への有向道とv v v からw w w への有向道が存在します。二つをつなぐとu u u からw w w への有向歩道が得られるので、補題 1.3 の 1 によりu u u からw w w への有向道が存在します。よってu ≤ w u \le w u ≤ w です。
反対称律。 u ≤ v u \le v u ≤ v 、v ≤ u v \le u v ≤ u 、u ≠ v u \ne v u = v と仮定します。u u u からv v v への有向道とv v v からu u u への有向道をつなぐと、長さが正の閉じた有向歩道が得られます(u ≠ v u \ne v u = v より、それぞれの長さは1 1 1 以上です)。補題 1.3 の 2 により有向閉路が存在することになり、D D D が有向非巡回グラフであることに反します。よってu = v u = v u = v です。▨
位相順序は、この半順序を全順序へ広げます。逆に、どの有限半順序集合も、この形で全順序へ広げることができます。
定理 4.2 (線形拡大の存在). ( P , ≤ ) (P, \le) ( P , ≤ ) を有限半順序集合とすると、P P P 上の全順序⪯ \preceq ⪯ で、a ≤ b a \le b a ≤ b ならばつねにa ⪯ b a \preceq b a ⪯ b となるものが存在する。このような⪯ \preceq ⪯ を≤ \le ≤ の線形拡大 という。
証明. 有向グラフD = ( P , A ) D = (P, A) D = ( P , A ) を、A = { ( a , b ) : a ≤ b , a ≠ b } A = \{\, (a, b) : a \le b,\ a \ne b \,\} A = { ( a , b ) : a ≤ b , a = b } によって定めます。D D D が有向閉路をもたないことを示します。有向閉路u 0 , u 1 , … , u k = u 0 u_0, u_1, \dots, u_k = u_0 u 0 , u 1 , … , u k = u 0 があるとすると、始点と終点が一致する辺を考えないのでk ≥ 2 k \ge 2 k ≥ 2 です。辺の定め方からu 0 ≤ u 1 u_0 \le u_1 u 0 ≤ u 1 かつu 0 ≠ u 1 u_0 \ne u_1 u 0 = u 1 であり、またu 1 ≤ u 2 ≤ ⋯ ≤ u k = u 0 u_1 \le u_2 \le \cdots \le u_k = u_0 u 1 ≤ u 2 ≤ ⋯ ≤ u k = u 0 と≤ \le ≤ の推移律からu 1 ≤ u 0 u_1 \le u_0 u 1 ≤ u 0 です。反対称律によりu 0 = u 1 u_0 = u_1 u 0 = u 1 となり、u 0 ≠ u 1 u_0 \ne u_1 u 0 = u 1 に反します。よってD D D は有向非巡回グラフです。
定理 2.3 によりD D D の位相順序v 1 , … , v n v_1, \dots, v_n v 1 , … , v n が存在します。v i ⪯ v j v_i \preceq v_j v i ⪯ v j をi ≤ j i \le j i ≤ j と定めると、⪯ \preceq ⪯ はP P P 上の全順序です。a ≤ b a \le b a ≤ b かつa ≠ b a \ne b a = b ならば( a , b ) ∈ A (a, b) \in A ( a , b ) ∈ A であり、位相順序の定義からa a a はb b b より前に現れるのでa ⪯ b a \preceq b a ⪯ b です。a = b a = b a = b のときはa ⪯ b a \preceq b a ⪯ b が反射律から従います。▨
例 4.3 (約数の半順序を全順序へ広げる). P = { 1 , 2 , 3 , 4 , 6 , 12 } P = \{1, 2, 3, 4, 6, 12\} P = { 1 , 2 , 3 , 4 , 6 , 12 } に整除関係を入れた半順序集合(§D2.5 例 3.7 )を考える。4 4 4 と6 6 6 は比較不能である。
1 , 2 , 3 , 4 , 6 , 12 1, 2, 3, 4, 6, 12 1 , 2 , 3 , 4 , 6 , 12 という並べ方は線形拡大である。実際、1 1 1 はすべての要素の前にあり、2 2 2 は4 , 6 , 12 4, 6, 12 4 , 6 , 12 の前に、3 3 3 は6 , 12 6, 12 6 , 12 の前に、4 4 4 と6 6 6 は12 12 12 の前にある。
1 , 3 , 2 , 6 , 4 , 12 1, 3, 2, 6, 4, 12 1 , 3 , 2 , 6 , 4 , 12 も線形拡大である。1 1 1 はすべての前、3 3 3 は6 6 6 と12 12 12 の前、2 2 2 は6 , 4 , 12 6, 4, 12 6 , 4 , 12 の前、6 6 6 と4 4 4 は12 12 12 の前にある。二つの線形拡大は4 4 4 と6 6 6 の前後を逆に定めており、比較不能な対の前後は線形拡大ごとに変わりうる。
一方1 , 2 , 4 , 3 , 12 , 6 1, 2, 4, 3, 12, 6 1 , 2 , 4 , 3 , 12 , 6 は線形拡大ではない。6 6 6 が12 12 12 より後ろにあるが6 ∣ 12 6 \mid 12 6 ∣ 12 なので、6 ⪯ 12 6 \preceq 12 6 ⪯ 12 でなければならない。
5 強連結成分
向きを考えると、到達可能であることは対称ではありません。互いに到達可能であるという関係をとると、対称性が回復します。
定義 5.1 (強連結成分). 有向グラフD = ( V , A ) D = (V, A) D = ( V , A ) の頂点u , v u, v u , v について、u u u からv v v へ到達可能であり、かつv v v からu u u へ到達可能であるときu ∼ v u \sim v u ∼ v と書く。∼ \sim ∼ による同値類をD D D の強連結成分 という。
命題 5.2 (互いに到達可能であることは同値関係である). 定義 5.1 の関係∼ \sim ∼ はV V V 上の同値関係である。
証明. 反射律は長さ0 0 0 の有向道から従います。対称律は、∼ \sim ∼ の定義がu u u とv v v について対称であることから従います。推移律は、命題 4.1 の推移律の証明と同じく、有向道をつないで補題 1.3 の 1 を適用すれば得られます。▨
同値関係と分割の対応(§D2.5 命題 2.5 )により、強連結成分は頂点集合を過不足なく分割します。成分を一つの頂点へ縮めると、有向閉路が消えます。
定理 5.3 (縮約した有向グラフは有向閉路をもたない). D D D の強連結成分の全体を頂点集合とし、相異なる成分C ≠ C ′ C \ne C' C = C ′ について、C C C のある頂点からC ′ C' C ′ のある頂点への辺がD D D に存在するときC → C ′ C \to C' C → C ′ という辺を張って得られる有向グラフをD D D の縮約 という。D D D の縮約は有向非巡回グラフである。
証明. 縮約に有向閉路C 0 , C 1 , … , C k = C 0 C_0, C_1, \dots, C_k = C_0 C 0 , C 1 , … , C k = C 0 (k ≥ 1 k \ge 1 k ≥ 1 )が存在すると仮定します。C 0 , … , C k − 1 C_0, \dots, C_{k-1} C 0 , … , C k − 1 は相異なる強連結成分です。C i C_i C i からC i + 1 C_{i+1} C i + 1 への辺があるので、C i C_i C i のある頂点からC i + 1 C_{i+1} C i + 1 のある頂点へ到達することができます。同じ成分の頂点どうしは互いに到達可能なので、C i C_i C i のどの頂点からもC i + 1 C_{i+1} C i + 1 のどの頂点へも到達可能です。これをi = 0 i = 0 i = 0 から順につなぐと、C 0 C_0 C 0 のどの頂点からもC 1 C_1 C 1 のどの頂点へも到達可能であり、C 1 C_1 C 1 のどの頂点からもC 2 , … , C k = C 0 C_2, \dots, C_k = C_0 C 2 , … , C k = C 0 のどの頂点へも到達可能です。したがってC 0 C_0 C 0 の頂点とC 1 C_1 C 1 の頂点は互いに到達可能であり、C 0 = C 1 C_0 = C_1 C 0 = C 1 となります。k ≥ 2 k \ge 2 k ≥ 2 ならばこれはC 0 C_0 C 0 とC 1 C_1 C 1 が相異なることに反します。k = 1 k = 1 k = 1 の場合は、縮約の辺が相異なる成分のあいだにだけ張られることに反します。▨
6 深さ優先探索による強連結成分への分解
強連結成分を求めるには、深さ優先探索を二度実行します。一度目で頂点に順序を付け、二度目でその順序に従って辺の向きを反転したグラフを探索します。
定義 6.1 (有向グラフ上の深さ優先探索). 有向グラフD = ( V , A ) D = (V, A) D = ( V , A ) 上の深さ優先探索 とは、次の手続きをいう。大域的な時計を用意し、操作のたびに1 1 1 進める。頂点u u u を初めて訪問した時刻を行き掛け時刻 d [ u ] d[u] d [ u ] 、u u u から出るすべての辺を調べ終えてu u u から戻る時刻を帰り掛け時刻 f [ u ] f[u] f [ u ] と書く。
u u u を訪問したときの動作は、u u u を訪問済みとし、u u u を始点とする各辺( u , w ) (u, w) ( u , w ) を順に調べ、w w w が未訪問であればw w w を再帰的に訪問し、すべて調べ終えたらu u u から戻る、というものである。この再帰でw w w を初めて訪問したときの辺( u , w ) (u, w) ( u , w ) を集めたものを深さ優先探索の森 といい、この森における先祖と子孫の関係を用いる。
V V V のすべての頂点を、あらかじめ定めた順に見て、未訪問であればそこから訪問を開始する。すべての頂点はちょうど一度訪問され、d d d とf f f の値は2 n 2n 2 n 個の相異なる時刻をとる。
無向グラフの場合と同じく、時刻の区間には入れ子の構造があります。
補題 6.2 (時刻区間の括弧性). 相異なる頂点u , v u, v u , v について、区間[ d [ u ] , f [ u ] ] [d[u], f[u]] [ d [ u ] , f [ u ]] と[ d [ v ] , f [ v ] ] [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]] [ d [ v ] , f [ v ]] ⊂ [ d [ u ] , f [ u ]] であることと、v v v が深さ優先探索の森においてu u u の子孫であることは同値である。
証明. d [ u ] < d [ v ] d[u] < d[v] d [ u ] < d [ v ] としてよい(そうでなければu u u とv v v を入れ替えます)。区間[ d [ u ] , f [ u ] ] [d[u], f[u]] [ d [ u ] , f [ u ]] は、u u u の訪問が再帰の途中にある時間帯にあたります。d [ v ] < f [ u ] d[v] < f[u] d [ v ] < f [ u ] ならば、v v v はu u u の訪問が終わる前に発見されているので、再帰が後入れ先出しの規律に従うことから、v v v の訪問はu u u から戻る前に終わりf [ v ] < f [ u ] 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 [ v ]] ⊂ [ d [ u ] , f [ u ]] です。d [ v ] > 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 [ u ] < f [ u ] < d [ v ] < f [ v ] で二つの区間は互いに素です。時刻はすべて相異なるのでd [ v ] = f [ u ] 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]] [ d [ v ] , f [ v ]] ⊂ [ d [ u ] , f [ u ]] ならば、v v v はu u u の訪問が再帰の途中にある間に発見されており、その間に発見される頂点は、再帰の入れ子の構造からすべてu u u の子孫です。逆にv v v がu u u の子孫ならば、v v v はu u u から森の辺を順にたどってu u u の訪問中に発見され、u u u から戻る前に訪問を終えるので、d [ u ] < d [ v ] < f [ v ] < f [ u ] d[u] < d[v] < f[v] < f[u] d [ u ] < d [ v ] < f [ v ] < f [ u ] です。▨
次の補題が、二度目の探索の正しさを支えます。
補題 6.3 (未訪問の頂点だけを通る道). 深さ優先探索において、頂点u u u とv v v (u ≠ v u \ne v u = v )が次を満たすとする。u u u からv v v への有向道u = w 0 , w 1 , … , w k = v u = w_0, w_1, \dots, w_k = v u = w 0 , w 1 , … , w k = v が存在し、時刻d [ u ] d[u] d [ u ] の直前においてw 0 , … , w k w_0, \dots, w_k w 0 , … , w k がすべて未訪問である。このときv v v は深さ優先探索の森においてu u u の子孫であり、とくにf [ v ] < f [ u ] f[v] < f[u] f [ v ] < f [ u ] である。
証明. w i w_i w i がu u u の子孫でもu u u 自身でもないような最小のi i i が存在すると仮定し、そのi i i をとります。w 0 = u w_0 = u w 0 = u なのでi ≥ 1 i \ge 1 i ≥ 1 であり、i i i の最小性からw i − 1 w_{i-1} w i − 1 はu u u 自身かu u u の子孫です。補題 6.2 によりd [ u ] ≤ d [ w i − 1 ] < f [ w i − 1 ] ≤ f [ u ] d[u] \le d[w_{i-1}] < f[w_{i-1}] \le f[u] d [ u ] ≤ d [ w i − 1 ] < f [ w i − 1 ] ≤ f [ u ] です。
辺( w i − 1 , w i ) (w_{i-1}, w_i) ( w i − 1 , w i ) は、w i − 1 w_{i-1} w i − 1 の訪問中、すなわち区間[ d [ w i − 1 ] , f [ w i − 1 ] ] [d[w_{i-1}], f[w_{i-1}]] [ d [ w i − 1 ] , f [ w i − 1 ]] に属するある時刻に調べられます。その時点でw i w_i w i が未訪問であれば、w i w_i w i はw i − 1 w_{i-1} w i − 1 の子として訪問され、u u u の子孫になります。これはi i i の取り方に反します。その時点でw i w_i w i が訪問済みであれば、w i w_i w i はその時刻より前に発見されているのでd [ w i ] < f [ w i − 1 ] ≤ f [ u ] d[w_i] < f[w_{i-1}] \le f[u] d [ w i ] < f [ w i − 1 ] ≤ f [ u ] です。また仮定よりw i w_i w i は時刻d [ u ] d[u] d [ u ] の直前に未訪問なのでd [ u ] < d [ w i ] d[u] < d[w_i] d [ u ] < d [ w i ] です。よってd [ u ] < d [ w i ] < f [ u ] d[u] < d[w_i] < f[u] d [ u ] < d [ w i ] < f [ u ] となり、補題 6.2 により[ d [ w i ] , f [ w i ] ] ⊂ [ d [ u ] , f [ u ] ] [d[w_i], f[w_i]] \subset [d[u], f[u]] [ d [ w i ] , f [ w i ]] ⊂ [ d [ u ] , f [ u ]] 、すなわちw i w_i w i はu u u の子孫です。これもi i i の取り方に反します。
したがってそのようなi i i は存在せず、v = w k v = w_k v = w k はu u u 自身かu u u の子孫です。u ≠ v u \ne v u = v なのでv v v はu u u の子孫であり、補題 6.2 によりf [ v ] < f [ u ] f[v] < f[u] f [ v ] < f [ u ] です。▨
補題 6.4 (成分のあいだの辺と帰り掛け時刻). D D D 上で深さ優先探索を一度実行し、帰り掛け時刻f f f を得たとする。C C C とC ′ C' C ′ を相異なる強連結成分とし、C C C のある頂点からC ′ C' C ′ のある頂点への辺が存在するとする。このとき
max v ∈ C f [ v ] > max v ∈ C ′ f [ v ] \max_{v \in C} f[v] > \max_{v \in C'} f[v] v ∈ C max f [ v ] > v ∈ C ′ max f [ v ] が成り立つ。
証明. まず、C ′ C' C ′ の頂点からC C C の頂点への有向道は存在しません。存在すれば、C C C からC ′ C' C ′ への辺とあわせてC C C とC ′ C' C ′ の頂点が互いに到達可能になり、C = C ′ C = C' C = C ′ となるからです。
C ∪ C ′ C \cup C' C ∪ C ′ の頂点のうち、探索が最初に訪問するものをx x x とします。
x ∈ C x \in C x ∈ C の場合。 時刻d [ x ] d[x] d [ x ] の直前において、C ∪ C ′ C \cup C' C ∪ C ′ の頂点はすべて未訪問です。v ∈ C v \in C v ∈ C に対しては、x x x とv v v が同じ強連結成分に属するのでx x x からv v v への有向道があります。この道の上の頂点w w w はx x x から到達可能であり、またw w w からv v v へ、v v v からx x x へ到達可能なのでw w w からx x x へも到達可能です。よってw ∼ x w \sim x w ∼ x であり、道の頂点はすべてC C C に属します。v ∈ C ′ v \in C' v ∈ C ′ に対しては、x x x からC C C の中を通ってC C C の頂点a a a へ行き、辺( a , b ) (a, b) ( a , b ) (b ∈ C ′ b \in C' b ∈ C ′ )を通り、C ′ C' C ′ の中を通ってv v v へ行く有向歩道があり、補題 1.3 の 1 によって有向道が得られます。その道の頂点はC ∪ C ′ C \cup C' C ∪ C ′ に含まれます。いずれの場合も道の頂点はd [ x ] d[x] d [ x ] の直前にすべて未訪問なので、補題 6.3 によりf [ v ] < f [ x ] f[v] < f[x] f [ v ] < f [ x ] (v ≠ x v \ne x v = x のとき)です。よってf [ x ] = max v ∈ C ∪ C ′ f [ v ] f[x] = \max_{v \in C \cup C'} f[v] f [ x ] = max v ∈ C ∪ C ′ f [ v ] であり、とくにmax v ∈ C f [ v ] = f [ x ] > max v ∈ C ′ f [ v ] \max_{v \in C} f[v] = f[x] > \max_{v \in C'} f[v] max v ∈ C f [ v ] = f [ x ] > max v ∈ C ′ f [ v ] です。
x ∈ C ′ x \in C' x ∈ C ′ の場合。 同じ議論により、C ′ C' C ′ のすべての頂点はx x x の子孫またはx x x 自身であり、f [ x ] = max v ∈ C ′ f [ v ] f[x] = \max_{v \in C'} f[v] f [ x ] = max v ∈ C ′ f [ v ] です。一方、C ′ C' C ′ からC C C への有向道は存在しないので、x x x からの訪問でC C C の頂点が発見されることはありません。C C C の頂点はd [ x ] d[x] d [ x ] の直前にすべて未訪問なので、x x x の訪問が終わる時刻f [ x ] f[x] f [ x ] の時点でもすべて未訪問であり、その後に発見されます。したがってC C C のすべての頂点v v v についてd [ v ] > f [ x ] d[v] > f[x] d [ v ] > f [ x ] 、よってf [ v ] > f [ x ] f[v] > f[x] f [ v ] > f [ x ] です。ゆえにmax v ∈ C f [ v ] > f [ x ] = max v ∈ C ′ f [ v ] \max_{v \in C} f[v] > f[x] = \max_{v \in C'} f[v] max v ∈ C f [ v ] > f [ x ] = max v ∈ C ′ f [ v ] です。▨
定義 6.5 (二度の深さ優先探索による分解). 有向グラフD = ( V , A ) D = (V, A) D = ( V , A ) を入力とする次の手続きを考える。
D D D 上で深さ優先探索を実行し、各頂点の帰り掛け時刻f f f を得る。
すべての辺の向きを反転した有向グラフD T = ( V , { ( v , u ) : ( u , v ) ∈ A } ) D^{\mathsf{T}} = (V, \{\, (v, u) : (u, v) \in A \,\}) D T = ( V , { ( v , u ) : ( u , v ) ∈ A }) を作る。
頂点をf f f の大きい順に並べ、その順に見て、未訪問であればその頂点からD T D^{\mathsf{T}} D T 上の深さ優先探索を開始する。一回の開始で訪問される頂点の集合を、一つのまとまりとして出力する。
定理 6.6 (分解の正当性、停止性、手数). 定義 6.5 の手続きは停止し、手順 3 が出力する頂点の集合の族は、D D D の強連結成分の全体に一致する。隣接リストによってD D D を保持すると、手数はΘ ( n + m ) \Theta(n + m) Θ ( n + m ) である。
証明. まず、D D D とD T D^{\mathsf{T}} D T の強連結成分は一致します。u u u からv v v へのD D D の有向道は、逆にたどればv v v からu u u へのD T D^{\mathsf{T}} D T の有向道であり、その逆も成り立つので、互いに到達可能であるという関係はD D D とD T D^{\mathsf{T}} D T で同じだからです。
主張 6.6.1. k k k 回目の開始の始点をx k x_k x k とし、x k x_k x k が属するD D D の強連結成分をC k C_k C k とします。このとき、k k k 回目の開始で訪問される頂点の集合はちょうどC k C_k C k であり、k k k 回目の開始の直前に訪問済みである頂点の集合はC 1 ∪ ⋯ ∪ C k − 1 C_1 \cup \cdots \cup C_{k-1} C 1 ∪ ⋯ ∪ C k − 1 です。
証明. k = 1 k=1 k = 1 のとき、開始の直前に訪問済みである頂点の集合は空集合です。k > 1 k>1 k > 1 とし、1 1 1 回目からk − 1 k-1 k − 1 回目まで主張が成り立つと仮定すると、k k k 回目の開始の直前に訪問済みである頂点の集合はC 1 ∪ ⋯ ∪ C k − 1 C_1 \cup \cdots \cup C_{k-1} C 1 ∪ ⋯ ∪ C k − 1 です。強連結成分はV V V を分割するので、x k x_k x k が未訪問であることからC k C_k C k はC 1 , … , C k − 1 C_1, \dots, C_{k-1} C 1 , … , C k − 1 のいずれとも異なり、したがってC k C_k C k の頂点はすべて未訪問です。
C k C_k C k の頂点はすべて訪問されること。v ∈ C k v \in C_k v ∈ C k とすると、v v v はD T D^{\mathsf{T}} D T においてx k x_k x k から到達可能であり、その有向道の頂点はすべてC k C_k C k に属するので未訪問です。よって深さ優先探索はv v v を訪問します(補題 6.3 )。
訪問される頂点がC k C_k C k を出ないこと。 C k C_k C k に属さない頂点w w w が訪問されたと仮定します。w w w が属する強連結成分をC ′ C' C ′ とするとC ′ ≠ C k C' \ne C_k C ′ = C k であり、w w w は開始の直前に未訪問だったので、上と同じ理由でC ′ C' C ′ の頂点はすべて開始の直前に未訪問です。w w w が訪問されたことから、D T D^{\mathsf{T}} D T においてx k x_k x k からw w w への有向道が存在します。これをD D D の側で読むと、w w w からx k x_k x k への有向道です。この道が通る強連結成分を順に並べると、D D D の縮約におけるC ′ C' C ′ からC k C_k C k への辺の列が得られます(同じ成分の中を通る部分は縮約では動きません)。補題 6.4 を各辺へ適用してつなぐと
max v ∈ C ′ f [ v ] > max v ∈ C k f [ v ] \max_{v \in C'} f[v] > \max_{v \in C_k} f[v] v ∈ C ′ max f [ v ] > v ∈ C k max f [ v ] が得られます。ところが手順 3 はf f f の大きい順に未訪問の頂点を選ぶので、x k x_k x k は開始の直前に未訪問である頂点のうちf f f が最大のものです。C k C_k C k とC ′ C' C ′ の頂点はいずれも開始の直前に未訪問なので、max v ∈ C k f [ v ] = f [ x k ] ≥ max v ∈ C ′ f [ v ] \max_{v \in C_k} f[v] = f[x_k] \ge \max_{v \in C'} f[v] max v ∈ C k f [ v ] = f [ x k ] ≥ max v ∈ C ′ f [ v ] でなければならず、矛盾します。
以上よりk k k 回目の開始で訪問される頂点の集合はちょうどC k C_k C k です。したがって、この開始後の訪問済み頂点の集合はC 1 ∪ ⋯ ∪ C k C_1\cup\cdots\cup C_k C 1 ∪ ⋯ ∪ C k であり、次の開始の直前についての主張も従います。累積帰納法により、主張はすべての開始について成り立ちます。▨
主張 6.6.1 により、手順 3 の各回が出力する集合は一つの強連結成分です。手順 3 はすべての頂点が訪問されるまで開始を繰り返すので、出力される集合の族は強連結成分の全体に一致します。
停止すること。 深さ優先探索では各頂点がちょうど一度訪問され、各辺がちょうど一度調べられるので、手順 1 と手順 3 はいずれも有限回の操作で終わります。手順 2 も辺の本数だけの操作です。
手数。 手順 1 と手順 3 の深さ優先探索は、隣接リストのもとでそれぞれΘ ( n + m ) \Theta(n + m) Θ ( n + m ) です。手順 2 は各辺を一度ずつ見て向きを入れ替えるのでΘ ( n + m ) \Theta(n + m) Θ ( n + m ) です。手順 3 の並べ替えは、帰り掛け時刻が1 1 1 から2 n 2n 2 n までの相異なる整数であることから、時刻の順に頂点を記録しておけば追加の手数なしに得られます。よって全体でΘ ( n + m ) \Theta(n + m) Θ ( n + m ) です。▨
例 6.7 (五つの頂点での実行例). V = { 1 , 2 , 3 , 4 , 5 } 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)\} A = {( 1 , 2 ) , ( 2 , 3 ) , ( 3 , 1 ) , ( 3 , 4 ) , ( 4 , 5 ) , ( 5 , 4 )} とする。
手順 1。 頂点1 1 1 から訪問を始め、辺を添字の小さい順に調べるとすると、訪問は1 → 2 → 3 → 4 → 5 1 \to 2 \to 3 \to 4 \to 5 1 → 2 → 3 → 4 → 5 と進む。5 5 5 からは4 4 4 への辺しかなく4 4 4 は訪問済みなので5 5 5 から戻り、以下順に戻る。時刻はd [ 1 ] = 1 d[1]=1 d [ 1 ] = 1 ,d [ 2 ] = 2 d[2]=2 d [ 2 ] = 2 ,d [ 3 ] = 3 d[3]=3 d [ 3 ] = 3 ,d [ 4 ] = 4 d[4]=4 d [ 4 ] = 4 ,d [ 5 ] = 5 d[5]=5 d [ 5 ] = 5 ,f [ 5 ] = 6 f[5]=6 f [ 5 ] = 6 ,f [ 4 ] = 7 f[4]=7 f [ 4 ] = 7 ,f [ 3 ] = 8 f[3]=8 f [ 3 ] = 8 ,f [ 2 ] = 9 f[2]=9 f [ 2 ] = 9 ,f [ 1 ] = 10 f[1]=10 f [ 1 ] = 10 となる。
手順 2。 D T D^{\mathsf{T}} D 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) ( 2 , 1 ) , ( 3 , 2 ) , ( 1 , 3 ) , ( 4 , 3 ) , ( 5 , 4 ) , ( 4 , 5 ) である。
手順 3。 f f f の大きい順は1 , 2 , 3 , 4 , 5 1, 2, 3, 4, 5 1 , 2 , 3 , 4 , 5 である。1 1 1 からD T D^{\mathsf{T}} D T 上の探索を始めると1 → 3 → 2 1 \to 3 \to 2 1 → 3 → 2 と訪問し、2 2 2 からは1 1 1 への辺だけで1 1 1 は訪問済みなので終わる。訪問された集合は{ 1 , 2 , 3 } \{1, 2, 3\} { 1 , 2 , 3 } である。次に未訪問でf f f が最大の頂点は4 4 4 である。4 4 4 からの探索は3 3 3 (訪問済み)と5 5 5 を見て、5 5 5 からは4 4 4 (訪問済み)を見て終わる。訪問された集合は{ 4 , 5 } \{4, 5\} { 4 , 5 } である。
得られた{ 1 , 2 , 3 } \{1,2,3\} { 1 , 2 , 3 } と{ 4 , 5 } \{4,5\} { 4 , 5 } は、実際にD D D の強連結成分である。1 → 2 → 3 → 1 1 \to 2 \to 3 \to 1 1 → 2 → 3 → 1 により1 , 2 , 3 1, 2, 3 1 , 2 , 3 は互いに到達可能であり、4 → 5 → 4 4 \to 5 \to 4 4 → 5 → 4 により4 , 5 4, 5 4 , 5 は互いに到達可能である。一方4 4 4 から1 1 1 への有向道は存在しない(4 4 4 と5 5 5 を出る辺の終点は4 4 4 と5 5 5 だけである)ので、二つは別の成分である。
補題 6.4 も確かめることができる。C = { 1 , 2 , 3 } C = \{1,2,3\} C = { 1 , 2 , 3 } からC ′ = { 4 , 5 } C' = \{4,5\} C ′ = { 4 , 5 } への辺( 3 , 4 ) (3,4) ( 3 , 4 ) があり、max v ∈ C f [ v ] = 10 > 7 = max v ∈ C ′ f [ v ] \max_{v \in C} f[v] = 10 > 7 = \max_{v \in C'} f[v] max v ∈ C f [ v ] = 10 > 7 = max v ∈ C ′ f [ v ] である。
7 つまずいたら
歩道と道を書き分ける。 有向道は頂点の重複を許しません(定義 1.1 )。二つの道をつないで得られるのは歩道であって道とは限らないので、道が必要な場面では補題 1.3 を経由します。
入次数が0 0 0 の頂点の存在は、有向閉路がないことに依存する。 補題 2.2 は有向非巡回グラフについての主張です。有向閉路をもつグラフでは、すべての頂点の入次数が1 1 1 以上になることがあります。定義 3.1 の手続きが途中で止まるのは、まさにこの場合です。
位相順序の一意性を仮定しない。 比較不能な頂点の前後は自由に決めることができます(注意 2.4 )。「位相順序を求めよ」という問いの答えは一つとは限りません。
強連結成分は、到達可能性ではなく相互到達可能性で定める。 到達可能性だけでは対称律が成り立たず、同値関係になりません(命題 5.2 )。
二度目の探索で向きを反転する理由を落とさない。 向きを反転しないと、一度目に得た帰り掛け時刻の順序が補題 6.4 の形で効かず、成分の外へ探索が広がります。反転した側でf f f の大きい順に開始することが、証明の要点です。