1 有向グラフにおける到達可能性
有向グラフ G=(V,A) において,頂点 u から頂点 v への有向路が存在するとき,v は u から到達可能であるといい,u⇝v と書く.
有向グラフ G の2頂点 u,v が相互到達可能であるとは,u⇝v かつ v⇝u が成り立つことをいう.G のすべての2頂点が相互到達可能であるとき,G を強連結(strongly connected)であるという.
V 上の関係「u と v は相互到達可能」は同値関係である.
反射性:長さ 0 の路により u⇝u.対称性:定義より明らか.推移性:u⇝v かつ v⇝w ならば路の連結で u⇝w.逆向きも同様. □
2 強連結成分とSCC縮約
上の同値関係による V の同値類を G の強連結成分(strongly connected component, SCC)という.
各 SCC を 1 つの頂点に縮約して得られるグラフ GSCC は DAG(有向非巡回グラフ)である.
GSCC に有向閉路 C1→C2→⋯→Ck→C1 が存在すると仮定する.Ci 内の任意の頂点 u と Cj 内の任意の頂点 v に対し,Ci から Cj への路と Cj から Ci への路が(SCC 内部の路を経由して)構成できる.よって u と v は相互到達可能であり,Ci と Cj は同じ SCC に属する.これは Ci=Cj に矛盾する. □
3 深さ優先探索(DFS)
有向グラフの構造解析に不可欠な手法が DFS(深さ優先探索)である.
Input:
有向グラフ G=(V,A) Output:
各頂点の発見時刻 disc[v],終了時刻 fin[v] for all v∈V
visited[v]←false
end for
time←0
for all v∈V
if ¬visited[v]
DFS-Visit(G,v)
end if
end for
procedure DFS-Visit G,u
visited[u]←true
time←time+1
disc[u]←time
for all (u,v)∈A
if ¬visited[v]
DFS-Visit(G,v)
end if
end for
time←time+1
fin[u]←time
end procedure
DFS の計算量はO(∣V∣+∣A∣)であり,帰りがけ時刻の降順がトポロジカルソートを与える.
4 Kosaraju のアルゴリズム
Kosaraju のアルゴリズムは,Gの逆グラフGR(すべての辺の向きを反転したもの)を利用して SCC をO(∣V∣+∣A∣)で求める.
G 上で DFS を行い,帰りがけ順(finish time の降順)に頂点を並べる.
GR 上で,上の順に未訪問の頂点から DFS を行う.1 回の DFS で訪問した頂点集合が 1 つの SCC である.
上のアルゴリズムで得られる各頂点集合は,G の強連結成分に一致する.
ステップ 1 で帰りがけ時刻が最大の頂点は,SCC 縮約 DAG においてソース(入次数 0)の SCC に属する.ステップ 2 で GR 上の DFS を行うと,この SCC 内の頂点のみが訪問される(GR 上で他の SCC への到達は SCC 縮約の向きが逆転しているため不可能).帰納的に,SCC 縮約の逆トポロジカル順に SCC が正しく分離される. □
5 Tarjan のアルゴリズム
Tarjan のアルゴリズムは DFS 1回で SCC を求める.各頂点vに DFS 発見時刻disc[v]と,vの DFS 部分木から後退辺を通じて到達できる頂点の最小発見時刻low[v]を管理する.disc[v]=low[v]となる頂点vが SCC のルートであり,その時点でスタック上のv以降の頂点が1つの SCC を構成する.
6 トポロジカルソート
DAG G=(V,A) のトポロジカルソートとは,V の全順序 v1,v2,…,vn であって,すべての弧 (vi,vj)∈A に対して i<j が成り立つものをいう.
有向グラフ G がトポロジカルソートを持つための必要十分条件は,G が DAG であることである.
(⇒):G に有向閉路 vi1→vi2→⋯→vik→vi1 が存在すれば i1<i2<⋯<ik<i1 となり矛盾.(⇐):DAG には入次数 0 の頂点が存在する(すべての頂点の入次数が正なら,任意の頂点から入辺を辿り続けて有向閉路が構成される).入次数 0 の頂点を列の先頭に置き,除去して残りのグラフ(これも DAG)に帰納法を適用する. □
7 半順序との対応
8 DAG 上の動的計画法
DAG 上では,トポロジカル順に処理することで多くの最適化問題が動的計画法で解ける.
各頂点 v に対して ℓ[v] を s から v への最長路の長さとする.トポロジカル順に ℓ[v]=(u,v)∈Amax(ℓ[u]+w(u,v))
を計算すれば O(∣V∣+∣A∣) で全頂点の最長路が求まる.これは負の重みがあっても正しく動作する(閉路がないため).
s から各頂点 v への経路の総数 c[v] も,トポロジカル順に c[v]=(u,v)∈A∑c[u]
と計算できる(c[s]=1,s から到達不能な v については c[v]=0).