位相的整列(topological sorting)とは、有向グラフの頂点をすべて 1 列に並べて、どの辺 $u\to v$ でも $u$ が $v$ より前にあるようにしたもののことで、位相的順序ともいい、有向閉路がないときに限って存在する。入次数 $0$ の頂点を取り除いて並べていく手順は、頂点と辺の個数の和に比例する手間で有向閉路の有無を判定し、選び方を変えればすべての位相的整列を作る。位相的整列は到達可能性の半順序の線形拡大にほかならず、それがただ 1 つであることは全頂点を通る有向の道があることと同値である。作業の順序付けや、有向非巡回グラフの最長の道の計算に使われる。
いくつかの作業の間に「この作業はあの作業の後でなければできない」という前後の制約があるとき、すべての制約を守って作業を 1 列に並べることを考える。作業を頂点、制約を辺 $u\to v$($u$ を $v$ より先に行う)とする有向グラフで言えば、すべての辺が前から後ろへ向かうように頂点を並べることである。この並べ方を 位相的整列 という。
位相的整列があることと、有向グラフが有向閉路をもたないことは同値であり、その証明と 深さ優先探索 による求め方は、有向グラフ と 深さ優先探索 の記事にある。この記事では、入次数が $0$ の頂点を取り除いていく手順が、有向閉路の有無を判定しつつ位相的整列を求め、しかもすべての位相的整列をこの手順で作れること(thm-tps-source-removal)を示す。さらに、位相的整列がただ 1 つであるための条件(thm-tps-unique)、個数の数え方、半順序の線形拡大との一致(prop-tps-linear-extension)、最長の道を求める計算への応用(prop-tps-longest-path)を扱う。
この記事の有向グラフ $G=(V,E)$ は、深さ優先探索 の記事と同じく、頂点が有限個で、ループと同じ向きの平行辺をもたないものとする。$n:=\lvert V\rvert$ を頂点の個数、$m:=\lvert E\rvert$ を辺の本数とし、$u$ から $v$ への辺を $u\to v$ と書く。$u\to v$ が辺であるとき、$v$ を $u$ の 行き先 という。頂点 $v$ に入る辺の本数を $v$ の 入次数 という。相異なる頂点 $v_0,\dots,v_{k-1}$($k\ge2$)で $v_0\to v_1\to\dots\to v_{k-1}\to v_0$ がすべて辺であるものを 有向閉路、有向閉路のない有向グラフを 有向非巡回グラフ(DAG)という。
有向グラフ $G=(V,E)$ の頂点をすべて 1 回ずつ並べた列 $v_1,v_2,\dots,v_n$ で、どの辺 $v_i\to v_j$ についても $i< j$ となるものを、$G$ の 位相的整列(topological sorting)または 位相的順序(topological order)という。
言い換えると、全単射 $\sigma\colon V\to\{1,\dots,n\}$ で、どの辺 $u\to v$ についても $\sigma(u)<\sigma(v)$ となるものである($\sigma(v)$ は $v$ が何番目にあるかを表す)。位相的整列を求める手順のことを位相的整列(トポロジカルソート)と呼ぶこともある。
位相的整列の存在については次が知られている。
位相的整列は、半分だけ決まった順序を、矛盾なく全部決める操作である。制約の辺は「この 2 つの順はこう」としか言わないので、制約のない 2 つの作業の順は自由に選べる。逆に、前から順に作業を選ぶときにいま選べるのは、まだ済んでいない作業からの制約を受けていない作業、すなわち残りのグラフの源点である。源点を 1 つ選んで取り除くと、それを待っていた作業の制約が 1 つ減る。これを繰り返すのが def-tps-source-removal であり、選び方の自由度が位相的整列の個数を決める。
頂点 $a,b,c,d,e,f$ と辺 $a\to b$、$a\to c$、$b\to d$、$c\to d$、$c\to e$、$d\to f$、$e\to f$ の有向グラフ $G$ を考える。位相的整列は
$$
a,b,c,d,e,f\qquad a,b,c,e,d,f\qquad a,c,b,d,e,f\qquad a,c,b,e,d,f\qquad a,c,e,b,d,f
$$
の 5 つである。$a$ は唯一の源点なので最初に来る。$a$ を除くと源点は $b,c$ の 2 つで、$b$ を選ぶと残りの並べ方は 2 通り($c$ の後に $d,e$ を好きな順に置き、最後に $f$)、$c$ を選ぶと 3 通り($f$ を最後に置き、$b\to d$ を守って $b,d,e$ を並べる)である(prop-tps-count)。
辺のない $n$ 頂点の有向グラフでは、頂点のどの並べ方も位相的整列で、$n!$ 個ある。道 $v_1\to v_2\to\dots\to v_n$ では、位相的整列は $v_1,\dots,v_n$ ただ 1 つである。有向閉路 $a\to b\to a$ には位相的整列がない。
位相的整列の個数は、Catalan 数のような組合せ論の数として現れることがある。
$n\ge1$ とし、頂点 $x_1,\dots,x_n,y_1,\dots,y_n$ と辺 $x_i\to x_{i+1}$、$y_i\to y_{i+1}$($1\le i\le n-1$)、$x_i\to y_i$($1\le i\le n$)からなる有向グラフを $Q_n$ とする。$Q_n$ の位相的整列の個数は Catalan 数 $C_n=\frac1{n+1}\binom{2n}n$ である。
位相的整列 $w_1,\dots,w_{2n}$ に、$w_k$ が $x$ のどれかなら $s_k:=+1$、$y$ のどれかなら $s_k:=-1$ とした列 $(s_1,\dots,s_{2n})$ を対応させる。辺 $x_i\to x_{i+1}$ により $x_1,\dots,x_n$ はこの順に現れ、$y_1,\dots,y_n$ も同様なので、位相的整列は列 $(s_k)$ から決まる($k$ 番目が $+1$ で、それまでに $+1$ が $i$ 個あれば $w_k=x_i$)。逆に $+1$ と $-1$ をちょうど $n$ 個ずつ並べた列から同じ規則で頂点の並べ方を作ると、辺 $x_i\to x_{i+1}$、$y_i\to y_{i+1}$ は守られ、辺 $x_i\to y_i$ が守られることは「$y_i$ が現れるまでに $+1$ が $i$ 個以上ある」ことと同じである。$y_i$ の位置までの部分和は($+1$ の個数)$-i$ なので、これがすべての $i$ で成り立つことは、$-1$ で終わるすべての部分和が $0$ 以上であることと同じであり、部分和は $+1$ の位置で増えるだけなので、すべての部分和が $0$ 以上であることと同じである。よって位相的整列は長さ $2n$ の Dyck 列と 1 対 1 に対応し(Catalan数 の記事の定義「Dyck 列と Catalan 数」)、その個数は同記事の定理「Catalan 数の閉じた式」により $\frac1{n+1}\binom{2n}n$ である。$\square$
$n=1,2,3,4$ では $1,2,5,14$ 個である。$Q_n$ は、2 本の鎖 $x_1<\dots< x_n$ と $y_1<\dots< y_n$ を $x_i< y_i$ でつないだ半順序集合のグラフであり、その位相的整列はこの半順序の線形拡大である(prop-tps-linear-extension)。
有向グラフ $G=(V,E)$ に対し、次の手順を考える。各頂点 $v$ に数 $c(v)$ を記録し、頂点の集合 $Z$ と出力の列を用意する。
ex-tps-six のグラフでは、最初は $Z=\{a\}$ である。$a$ を出力すると $c(b)=c(c)=0$ となり $Z=\{b,c\}$。$b$ を選ぶと $c(d)=1$、$Z=\{c\}$。$c$ を出力すると $Z=\{d,e\}$。$d$、$e$、$f$ の順に出力して、$a,b,c,d,e,f$ を得る。2 回目に $c$ を選べば別の位相的整列が得られる。
有向グラフ $G$ に def-tps-source-removal を行う。
ある時点までに出力された頂点の集合を $O$、残りを $U:=V\setminus O$ とする。手順を通じて次の 2 つが保たれることを示す。
(a) $U$ の各頂点 $w$ について、$c(w)$ は $U$ の頂点から $w$ に入る辺の本数に等しい。
(b) $Z$ は、$U$ の頂点で $c(w)=0$ となるものの全体に等しい。
手順 1 の直後は $O=\emptyset$ なので (a)(b) が成り立つ。手順 2 で $u\in Z$ を出力すると、$u$ は $U$ から $O$ へ移り、$u$ から出る辺の数だけ行き先の $c$ が減るので (a) が保たれる。このとき行き先 $w$ は $U$ に属する。$w\in O$ なら、$w$ が出力されたとき (b) により $c(w)=0$ だったが、そのとき $u\in U$ で (a) により $c(w)\ge1$ となって矛盾するからである。また、減らす前の $c(w)$ は辺 $u\to w$ を数えているので $1$ 以上であり、$c(w)=0$ になった頂点だけが新たに $Z$ に入るので (b) も保たれる。
1:(b) により $Z\subset U$ なので、出力される頂点はまだ出力されていない頂点で、各頂点は高々 1 回出力される。手順 2 を 1 回行うたびに $U$ が 1 つ減るので、手順は高々 $n$ 回の繰り返しで終わる。辺 $u\to w$ について、$w$ が出力される時点で (b) により $c(w)=0$ なので、(a) により $u\notin U$、すなわち $u$ はすでに出力されている。
2:すべての頂点が出力されれば、1 によりどの辺 $u\to w$ でも $u$ が $w$ より前にあるので、出力の列は位相的整列である。終了時に $U\ne\emptyset$ なら、$Z=\emptyset$ と (b) により $U$ のすべての頂点で $c(w)\ge1$ であり、(a) により、$U$ の頂点と $U$ の中の辺からなる有向グラフ $G[U]$ のすべての頂点の入次数は $1$ 以上である。有向グラフ の記事の補題「入次数が 0 の頂点の存在」により、$G[U]$ は有向非巡回グラフでなく、有向閉路をもつ。これは $G$ の有向閉路でもある。最後の主張は、前半と、有向閉路をもつグラフには位相的整列がないこと(有向閉路の頂点のうち最も後ろにあるものから出る閉路の辺が後ろから前へ向かう)から従う。
3:位相的整列 $v_1,\dots,v_n$ をとり、$k$ 番目の選択で $v_k$ を選べることを $k$ についての帰納法で示す。$v_1,\dots,v_{k-1}$ が出力された時点で $U=\{v_k,\dots,v_n\}$ である。$U$ の頂点 $v_j$ から $v_k$ に入る辺があれば、位相的整列の条件から $j< k$ となるが、$v_j\in U$ なら $j\ge k$ で、$j=k$ はループになるので、そのような辺はない。よって (a) により $c(v_k)=0$ で、(b) により $v_k\in Z$ であり、$v_k$ を選べる。
4:手順 1 で入次数を数えるには、各頂点の行き先の一覧を 1 回ずつ見ればよく、操作は $n+m$ に比例する。手順 2 では、各頂点は高々 1 回 $Z$ に入って高々 1 回取り出され、各辺 $u\to w$ について $c(w)$ を減らす操作は $u$ を出力するときの 1 回だけである。$\square$
2 により、この手順は有向閉路の有無の判定にもなっている。深さ優先探索による方法(深さ優先探索 の記事の定理「後退辺と有向閉路」)も同じく $n+m$ に比例する手間で位相的整列を求めるが、得られるのは終了時刻で決まる特定の並べ方である。源点を取り除く手順は、選び方を変えることですべての位相的整列を作れる(3)。たとえば $Z$ から毎回名前の最も小さい頂点を選べば、辞書式の順で最も小さい位相的整列が得られる。
有向非巡回グラフ $G$ の位相的整列の個数を $e(G)$ とする。頂点のないグラフでは $e=1$ とする。頂点が $1$ 個以上なら
$$
e(G)=\sum_{s\text{ は }G\text{ の源点}}e(G-s)
$$
である。ここで $G-s$ は $G$ から $s$ と $s$ を端点とする辺を除いた有向グラフである。さらに $1\le e(G)\le n!$ で、$e(G)=n!$ であることと $G$ に辺がないことは同値である。
位相的整列の最初の頂点は源点である(def-tps-main の後の段落)。最初が源点 $s$ である位相的整列 $s,v_2,\dots,v_n$ に $v_2,\dots,v_n$ を対応させる。$G-s$ の辺は $G$ の辺なので、これは $G-s$ の位相的整列である。逆に $G-s$ の位相的整列の先頭に $s$ を付けると、$s$ から出る辺は前から後ろへ向かい、$s$ に入る辺はないので、$G$ の位相的整列になる。この 2 つの対応は互いに逆なので、最初が $s$ の位相的整列は $e(G-s)$ 個あり、$s$ について足して漸化式を得る。
$G$ は有向非巡回グラフなので位相的整列があり(有向グラフ の記事の定理「非巡回性と位相的順序」)、$e(G)\ge1$ である。位相的整列は頂点の並べ方なので $e(G)\le n!$ である。辺がなければすべての並べ方が位相的整列である。辺 $u\to v$ があれば、$v$ を $u$ より前に置く並べ方は位相的整列でないので $e(G)< n!$ である。$\square$
$e(G)$ を求めるには、漸化式を部分グラフ(頂点の部分集合)ごとに使うと、$2^n$ 程度の部分集合について計算すれば済む。頂点が多いと部分集合の個数 $2^n$ が膨大になり、この方法は実用にならない。線形拡大の個数を数えることの難しさは、KT17 §6.4(p. 126)が問いとして掲げている。
有向非巡回グラフ $G$ と、その位相的整列 $v_1,\dots,v_n$ について、次は同値である。
1 ⇒ 2:ある $i$ で $v_i\to v_{i+1}$ が辺でないとする。$v_i$ と $v_{i+1}$ を入れ替えた列を考える。$v_{i+1}\to v_i$ は位相的整列の条件から辺でなく、$v_i\to v_{i+1}$ も辺でないので、この 2 頂点の間に辺はない。ほかの 2 頂点の前後関係は変わらないので、入れ替えた列も位相的整列で、元の列と異なる。これは 1 に反する。
2 ⇒ 3:$v_1\to v_2\to\dots\to v_n$ がすべての頂点を通る有向の道である。
3 ⇒ 1:すべての頂点を通る有向の道 $w_1\to\dots\to w_n$ があれば、どの位相的整列でも $w_i$ は $w_{i+1}$ より前にあるので、位相的整列は $w_1,\dots,w_n$ しかない。
1 ⇔ 4:thm-tps-source-removal の 2・3 により、位相的整列の全体は、手順のすべての選び方で得られる出力の列の全体に等しい。$Z$ がつねに高々 1 個なら、選び方は 1 通りしかなく、位相的整列はただ 1 つである。ある選び方の途中で $Z$ が相異なる 2 頂点 $a,b$ を含めば、そこで $a$ を選ぶか $b$ を選ぶかで、その位置の頂点が異なる 2 つの出力の列が得られ、どちらも位相的整列である($G$ は有向非巡回グラフなので、すべての頂点が出力される)。$\square$
一般の有向グラフで有向 Hamilton 道があるかどうかを判定する問題は難しいことが知られているが(Eri19 §12.11、p. 401。この記事では証明しない)、有向非巡回グラフでは、位相的整列を 1 つ求めて隣り合う 2 頂点が辺で結ばれているかを調べるだけで、$n+m$ に比例する手間で判定できる。
有向非巡回グラフ $G$ の頂点 $u,v$ について、$u$ から $v$ への有向の道(長さ $0$ の道も含める)があるとき $u\preceq v$ と書き、$v$ は $u$ から 到達可能 であるという。半順序 $\le$ に対し、$x\le y$ ならば $x\le^*y$ となる全順序 $\le^*$ を $\le$ の 線形拡大 という(全順序 の記事の定理「順序拡大定理」)。有限集合の全順序は、元を小さい順に並べた列と同じものである。
1:反射律は長さ $0$ の道による。$u\preceq v$、$v\preceq w$ なら、道をつないだ有向の歩道から $u$ から $w$ への道が得られる(同じ頂点を 2 回通れば、その間を除けばよい)ので推移律が成り立つ。位相的整列 $\sigma$ を 1 つとると(有向グラフ の記事の定理「非巡回性と位相的順序」)、道 $u=w_0\to w_1\to\dots\to w_k=v$ に沿って $\sigma(w_0)<\sigma(w_1)<\dots<\sigma(w_k)$ なので、$u\preceq v$ なら $\sigma(u)\le\sigma(v)$ で、等号は $k=0$ すなわち $u=v$ のときに限る。よって $u\preceq v$ かつ $v\preceq u$ なら $\sigma(u)=\sigma(v)$ で $u=v$ となり、反対称律が成り立つ。
今の議論は任意の位相的整列 $\sigma$ について「$u\preceq v$ なら $\sigma(u)\le\sigma(v)$」を示しているので、位相的整列の列は $\preceq$ の線形拡大の列である。逆に、並べ方 $\sigma$ が $\preceq$ の線形拡大の列なら、辺 $u\to v$ について $u\preceq v$ かつ $u\ne v$ なので $\sigma(u)<\sigma(v)$ であり、$\sigma$ は位相的整列である。
2:$G_P$ の辺 $x\to y$ では $x< y$ なので、有向閉路 $v_0\to\dots\to v_{k-1}\to v_0$ があれば推移律から $v_0< v_0$ となって矛盾する。よって $G_P$ は有向非巡回グラフである。道 $x\to\dots\to y$ があれば推移律で $x\le y$ であり、逆に $x\le y$ なら $x=y$(長さ $0$ の道)か辺 $x\to y$ があるので、到達可能性は $\le$ に一致する。最後の主張は 1 から従う。$\square$
1 から、到達可能性が同じ 2 つの有向非巡回グラフは同じ位相的整列をもつ。たとえば半順序集合の Hasse図($x< y$ で間に元のない組だけを辺にしたもの)の位相的整列も、$G_P$ と同じく線形拡大の列である(有限集合では $x< y$ の間に元を挟んでいくと有限回で止まり、Hasse 図の道が得られる)。2 と thm-tps-source-removal の 2 により、有限の半順序には必ず線形拡大があり、極小元を 1 つずつ取り出して並べることで求まる(全順序 の記事の注意「順序拡大定理について」)。線形拡大は位相的整列とも呼ばれる(KT17 §6.4、p. 125)。無限の半順序集合の線形拡大の存在には Zorn の補題を使う(同記事の定理「順序拡大定理」)。
辺に重みの付いた有向非巡回グラフで、重みの和が最大の有向の道を求める問題は、位相的整列の順に計算すれば解ける。作業 $v$ に所要時間があり、辺 $u\to v$ が「$u$ が終わってから $v$ を始める」ことを表すとき、全体を終えるのに最低限かかる時間は、所要時間を重みとした最長の道の重みであり、その道は クリティカルパス と呼ばれる。
有向非巡回グラフ $G$ の各辺 $u\to v$ に実数の重み $\ell(u,v)$ が与えられているとする。有向の道の重みを、道に含まれる辺の重みの和(長さ $0$ の道では $0$)とする。位相的整列 $v_1,\dots,v_n$ の順に
$$
L(v_j):=\max\Bigl(\{0\}\cup\{L(v_i)+\ell(v_i,v_j)\mid v_i\to v_j\text{ は辺}\}\Bigr)
$$
と定めると、$L(v_j)$ は $v_j$ で終わる有向の道の重みの最大値に等しい。各頂点の入る辺の一覧が与えられていれば、計算の操作の回数は $n+m$ に比例する。
辺 $v_i\to v_j$ では $i< j$ なので、$L(v_j)$ を計算する時点で右辺の $L(v_i)$ はすでに決まっている。$v_j$ で終わる道の重みの最大値を $L^*(v_j)$ と書き、$j$ についての帰納法で $L(v_j)=L^*(v_j)$ を示す。$v_j$ で終わる道は、長さ $0$ の道 $v_j$(重み $0$)か、ある辺 $v_i\to v_j$($i< j$)を最後にもつ道である。後者の道から最後の辺を除くと $v_i$ で終わる道で、その重みは帰納法の仮定により $L(v_i)$ 以下なので、元の道の重みは $L(v_i)+\ell(v_i,v_j)$ 以下である。よって $L^*(v_j)\le L(v_j)$ である。逆に、$v_i$ で終わる道で重みが $L(v_i)$ のものに辺 $v_i\to v_j$ を付け加えると、$v_j$ で終わる有向の歩道で重み $L(v_i)+\ell(v_i,v_j)$ のものが得られる。$G$ は有向非巡回グラフなので、この歩道は同じ頂点を 2 回通らず(2 回通れば、その間が有向閉路を含む)、道である。よって $L(v_j)\le L^*(v_j)$ である。各辺は 1 回ずつ使われるので、操作の回数は $n+m$ に比例する。$\square$
重み付きの有向非巡回グラフの最長の道を深さ優先探索とこの種の漸化式で求める方法は Eri19 §6.4(pp. 235–236)にある。同書は、一般の有向グラフでは最長の道を求める問題が NP 困難であることにも触れている(p. 235。この記事では証明しない)。有向閉路があると、漸化式の右辺が自分自身に依存して計算の順が決まらない。
| 外す条件 | 反例 | 成り立たなくなること |
|---|---|---|
| 有向閉路がない | 辺 $a\to b$、$b\to a$ | 位相的整列がある、手順がすべての頂点を出力する |
| 取り出す頂点の入次数が $0$ | ex-tps-six で最初に $b$ を取り出す | 出力の列が位相的整列である |
| 隣り合う頂点がすべて辺で結ばれる | 辺 $a\to b$、$a\to c$ | 位相的整列がただ 1 つ |
| 有向非巡回であること(最長の道) | 辺 $a\to b$、$b\to a$、重み $1$ | 漸化式で最長の道の重みが決まる |
| 道の長さ $0$ を許すこと(反射律) | 到達可能性を長さ $1$ 以上の道に限る | $\preceq$ が半順序である |
1 行目:$a,b$ のどちらを前にしても一方の辺が後ろから前へ向かう。手順では $c(a)=c(b)=1$ で $Z$ は最初から空であり、何も出力されない。
2 行目:$b$ を最初に置くと、辺 $a\to b$ が後ろから前へ向かう。
3 行目:$a$ の後の $b,c$ は辺で結ばれず、$a,b,c$ と $a,c,b$ の 2 つの位相的整列がある。手順では $a$ を出力した後 $Z=\{b,c\}$ となる。
4 行目:$L(a)$ の計算に $L(b)$ が、$L(b)$ の計算に $L(a)$ が要る。歩道 $a\to b\to a\to b\to\cdots$ の重みはいくらでも大きくなるが、同じ頂点を通らない道に限れば最大の重みは $1$ である。
5 行目:長さ $1$ 以上の道に限った関係は反射律を満たさない。これは狭義の半順序で、半順序 の記事の命題「狭義半順序との一対一対応」により $\preceq$ と同じ情報をもつ。
位相的整列は、依存関係のあるものを処理する順を決める場面で広く使われる。プログラムの部品の組み立ての順、表計算のセルの再計算の順、講義の履修の順などである。動的計画法で部分問題を解く順も、部分問題の依存関係のグラフの位相的整列の逆順である(Eri19 §6.4、p. 234)。
Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する