§D2.10探索・最短路・全域木

最終更新

グラフのアルゴリズムは、探索が生み出す構造(層・木)と、反復のあいだ保たれる不変条件によって正当化される。 本記事では、隣接行列・隣接リストによる表現から出発し、幅優先探索が最短距離を、緩和法とダイクストラ法が重み付き最短路を正しく計算することを不変条件で証明し、最後にグラフ不変量と最小全域木のカット性質を扱う。

本記事を通じて、グラフG=(V,E)G=(V,E)は特に断らない限り有限(∣V∣=n|V|=n、∣E∣=m|E|=m)とし、頂点・辺・次数・歩道・道・閉路・連結成分は§D2.7 定義 1.1・§D2.7 定義 2.1・§D2.7 定義 2.3の定義に従う。重み付き最短路の節だけは、同節の冒頭で有向グラフと無向グラフに共通の規約を定める。

1 グラフの表現と歩道の数え上げ

定義 1.1 (隣接リストと隣接行列).V={1,…,n}V=\{1,\dots,n\}とする。GGの隣接リスト表現とは、各頂点iiに対しその隣接頂点の並びAdj[i]\mathrm{Adj}[i]を格納する構造をいう。隣接行列表現とは、

Aij={1{i,j}∈E (有向グラフでは (i,j)∈E)0それ以外A_{ij}=\begin{cases}1 & \{i,j\}\in E\ (\text{有向グラフでは }(i,j)\in E)\\[2pt] 0 & \text{それ以外}\end{cases}

で定まるn×nn\times n行列AAをいう(多重辺を許すときはAijA_{ij}をiiからjjへの辺の本数とする)。両表現の資源量は次のとおりである。

  • 隣接リスト:領域Θ(n+m)\Theta(n+m)。頂点iiの全隣接頂点の走査はΘ(deg⁡i)\Theta(\deg i)、特定の辺{i,j}\{i,j\}の存在判定はO(deg⁡i)O(\deg i)。
  • 隣接行列:領域Θ(n2)\Theta(n^2)。特定の辺の存在判定はO(1)O(1)、頂点iiの全隣接頂点の走査はΘ(n)\Theta(n)。

疎なグラフ(m=o(n2)m=o(n^2))では隣接リストが、密なグラフや辺の即時判定を要する場面では隣接行列が有利である。

無向単純グラフの隣接行列は対称(A=A⊤A=A^{\top})で対角成分は00である。この行列の冪は、歩道の数え上げという組合せ的な意味をもつ。

命題 1.2 (隣接行列の冪と歩道数).AAをGGの隣接行列とする。任意の整数k≥0k\ge 0と頂点i,ji,jに対し、(Ak)ij(A^k)_{ij}はiiからjjへの長さkkの歩道の総数に等しい。

証明.kkに関する帰納法による。k=0k=0のときA0=IA^0=Iで(I)ij=δij(I)_{ij}=\delta_{ij}であり、長さ00の歩道は「頂点iiにとどまる」1本がi=ji=jのときにのみ存在するから、主張は成り立つ。

k−1k-1で成り立つと仮定する(k≥1k\ge 1)。行列の積の定義により

(Ak)ij=∑ℓ=1n(Ak−1)iℓ Aℓj.(A^k)_{ij}=\sum_{\ell=1}^{n}(A^{k-1})_{i\ell}\,A_{\ell j}.

iiからjjへの長さkkの歩道は、最後の頂点の直前の頂点ℓ\ellを選ぶことで、「iiからℓ\ellへの長さk−1k-1の歩道」と「辺{ℓ,j}\{\ell,j\}」に一意に分解される。逆にこの二つを与えれば長さkkの歩道が一意に定まる。帰納法の仮定より前者の本数は(Ak−1)iℓ(A^{k-1})_{i\ell}、後者を付け足せる本数はAℓjA_{\ell j}(辺の本数)であるから、積(Ak−1)iℓAℓj(A^{k-1})_{i\ell}A_{\ell j}が「ℓ\ellを経由する長さkkの歩道」の本数を与える。ℓ\ellについて足し合わせれば総数を得る。▨

注意 1.3 (対角化との接続).AAは実対称なので直交行列で対角化でき(§D3.12 定義 1.1)、§D3.13 例 2.1によりAk=PΛkP−1A^k=P\Lambda^k P^{-1}を通じて歩道数の閉形式や漸近挙動が固有値から読める。特に閉じた歩道の総数tr⁡(Ak)=∑i(Ak)ii=∑rλr k\operatorname{tr}(A^k)=\sum_i(A^k)_{ii}=\sum_r\lambda_r^{\,k}は固有値のkk乗和に一致する。

2 幅優先探索と最短距離

以下、重みを付けない有限グラフを考える。始点ssから頂点vvへの距離d(s,v)d(s,v)を、ss–vv歩道に現れる辺の本数の最小値と定め、ssからvvに到達できないときはd(s,v)=∞d(s,v)=\inftyとする(辺数最小の歩道は道にとれるので、道に限定しても同じ値である)。

定義 2.1 (幅優先探索(BFS)). 始点ssからの幅優先探索とは、次の手続きである。距離見積りdist[⋅]\mathrm{dist}[\cdot]をdist[s]=0\mathrm{dist}[s]=0、他は∞\inftyに初期化し、ssを訪問済みとして FIFO キューQQに入れる。QQが空でない間、先頭の頂点uuを取り出し、その各隣接頂点vvのうち未訪問のものについて

dist[v]:=dist[u]+1,parent[v]:=u\mathrm{dist}[v]:=\mathrm{dist}[u]+1,\qquad \mathrm{parent}[v]:=u

と定め、vvを訪問済みにしてQQの末尾に加える。訪問済みになった各v (≠s)v\ (\ne s)について辺{parent[v],v}\{\mathrm{parent}[v],v\}を集めたものを BFS 木という。

BFS の正しさは、キューが「距離のそろった頂点」を層ごとに保持するという不変条件に帰着する。

補題 2.2 (キューの単調性). BFS の実行中、キューに頂点w1,…,wrw_1,\dots,w_rが先頭から末尾の順に並んでいるとき、

dist[w1]≤dist[w2]≤⋯≤dist[wr]≤dist[w1]+1\mathrm{dist}[w_1]\le \mathrm{dist}[w_2]\le\cdots\le \mathrm{dist}[w_r]\le \mathrm{dist}[w_1]+1

が常に成り立つ。

証明. キューへの操作回数に関する帰納法で示す。初期状態はキューが[s][s]の 1 要素で、dist[s]=0\mathrm{dist}[s]=0ゆえ自明に成り立つ。ある時点で不変条件が成り立つとして、次の操作後も保たれることをいう。

BFS の 1 反復は「先頭u=w1u=w_1を取り出し、続いてuuの未訪問隣接頂点vvをいくつか末尾に加える」からなる。取り出し後のキューは[w2,…,wr][w_2,\dots,w_r]で、加える各vvはdist[v]=dist[u]+1=dist[w1]+1\mathrm{dist}[v]=\mathrm{dist}[u]+1=\mathrm{dist}[w_1]+1をもつ。よって操作後のキュー[w2,…,wr,v,… ][w_2,\dots,w_r,v,\dots]について、

  • 単調非減少性:仮定よりdist[w2]≤⋯≤dist[wr]≤dist[w1]+1=dist[v]\mathrm{dist}[w_2]\le\cdots\le\mathrm{dist}[w_r]\le\mathrm{dist}[w_1]+1=\mathrm{dist}[v]であり、加えたvvたちは互いに等しいから、全体で非減少である。
  • 差の上界:残った先頭はw2w_2(存在すれば)でdist[w2]≥dist[w1]\mathrm{dist}[w_2]\ge\mathrm{dist}[w_1]、末尾はdist[w1]+1\mathrm{dist}[w_1]+1ゆえ、末尾と先頭の差は≤1\le 1。w2w_2が存在せず新しいvvだけになる場合は全要素が等しく、やはり成り立つ。

以上より不変条件は保たれる。▨

補題 2.2から直ちに、頂点はdist\mathrm{dist}値の非減少順に取り出され、dist\mathrm{dist}値の割り当ても時間について非減少である。これを用いて主定理を示す。

定理 2.3 (BFS は最短距離を計算する). 有限グラフに対し、始点ssからの BFS は終了時にすべての頂点vvについてdist[v]=d(s,v)\mathrm{dist}[v]=d(s,v)を満たす(到達不能なら両辺∞\infty)。

証明. まず (a) 訪問済みの各vvについてdist[v]\mathrm{dist}[v]は実在するss–vv歩道の長さである、を反復回数の帰納法で示す。ssは長さ00の歩道に対応する。dist[v]\mathrm{dist}[v]がdist[u]+1\mathrm{dist}[u]+1と定められるとき、uuは既に訪問済みで(帰納法の仮定より)長さdist[u]\mathrm{dist}[u]のss–uu歩道をもつから、辺{u,v}\{u,v\}を継ぎ足せば長さdist[u]+1\mathrm{dist}[u]+1のss–vv歩道を得る。ゆえに訪問済みvvではdist[v]≥d(s,v)\mathrm{dist}[v]\ge d(s,v)である。

次に (b)d(s,v)=k<∞d(s,v)=k<\inftyなるvvは訪問されdist[v]=k\mathrm{dist}[v]=kとなる、をkkに関する帰納法で示す。k=0k=0はv=sv=sでdist[s]=0\mathrm{dist}[s]=0ゆえ成り立つ。k≥1k\ge 1とし、距離k−1k-1以下の全頂点で主張が成り立つと仮定する。d(s,v)=kd(s,v)=kとし、長さkkの最短ss–vv道のvvの直前の頂点をuuとすると、その道のss–uu部分は長さk−1k-1の歩道であり、d(s,u)≤k−1d(s,u)\le k-1。一方d(s,u)≥k−1d(s,u)\ge k-1でもある(もしd(s,u)≤k−2d(s,u)\le k-2なら、その最短歩道に辺{u,v}\{u,v\}を足してd(s,v)≤k−1d(s,v)\le k-1となり矛盾)。ゆえにd(s,u)=k−1d(s,u)=k-1。帰納法の仮定よりuuは訪問されdist[u]=k−1\mathrm{dist}[u]=k-1、したがってuuはキューに入れられ、いつか取り出されて隣接頂点vvが調べられる。その時点でvvが未訪問ならdist[v]:=dist[u]+1=k\mathrm{dist}[v]:=\mathrm{dist}[u]+1=kと定まる。既に訪問済みなら、vvはそれ以前に取り出された頂点u′u'によってdist[v]=dist[u′]+1\mathrm{dist}[v]=\mathrm{dist}[u']+1と定められている。u′u'はuuより先に取り出されたので、取り出し順の単調性よりdist[u′]≤dist[u]=k−1\mathrm{dist}[u']\le\mathrm{dist}[u]=k-1、ゆえにdist[v]≤k\mathrm{dist}[v]\le k。いずれの場合も (a) のdist[v]≥d(s,v)=k\mathrm{dist}[v]\ge d(s,v)=kと合わせてdist[v]=k\mathrm{dist}[v]=kを得る。

最後に、到達不能なvvは決して訪問されない(訪問はssの成分内の辺に沿ってのみ伝播し、(a) により訪問済みならss–vv歩道が存在する)からdist[v]=∞=d(s,v)\mathrm{dist}[v]=\infty=d(s,v)。(a)(b) を合わせて、すべてのvvでdist[v]=d(s,v)\mathrm{dist}[v]=d(s,v)である。▨

隣接リストで実装すると、各頂点は一度だけキューに入り、各辺は端点から定数回調べられるので、BFS はO(n+m)O(n+m)時間で走る。

3 深さ優先探索と辺の分類

定義 3.1 (深さ優先探索(DFS)). 始点ssからの深さ優先探索とは、ssを訪問し、ssの未訪問隣接頂点vvがあれば直ちにvvへ再帰的に潜り、戻ってから次の隣接頂点を試す手続きである(スタック、または再帰呼び出しで実現する)。大域時計を用い、頂点uuを初めて訪問した時刻を行き掛け時刻d[u]\mathrm{d}[u]、uuの探索を終えて戻る時刻を帰り掛け時刻f[u]\mathrm{f}[u]とする。未訪問頂点vvをuuから初めて訪問したときの辺{u,v}\{u,v\}を集めたものを DFS 木(全体では DFS 森)という。

再帰のスタック規律から、時刻区間には次の入れ子構造がある。

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

証明.d[u]<d[v]\mathrm{d}[u]<\mathrm{d}[v]としてよい(対称)。区間[d[u],f[u]][\mathrm{d}[u],\mathrm{f}[u]]はuuの探索がスタック上にある時間帯に対応する。d[v]<f[u]\mathrm{d}[v]<\mathrm{f}[u]ならばvvはuuの探索がスタック上にある間に発見されたので、LIFO 規律によりDFS(v)\mathrm{DFS}(v)はDFS(u)\mathrm{DFS}(u)が戻る前に完了しf[v]<f[u]\mathrm{f}[v]<\mathrm{f}[u]、よって[d[v],f[v]]⊂[d[u],f[u]][\mathrm{d}[v],\mathrm{f}[v]]\subset[\mathrm{d}[u],\mathrm{f}[u]]。逆にd[v]>f[u]\mathrm{d}[v]>\mathrm{f}[u]ならばd[u]<f[u]<d[v]<f[v]\mathrm{d}[u]<\mathrm{f}[u]<\mathrm{d}[v]<\mathrm{f}[v]で二区間は互いに素である。d[v]=f[u]\mathrm{d}[v]=\mathrm{f}[u]は時計が相異なる値をとるので起こらない。したがって二区間は「一方が他方を含む」か「互いに素」かのいずれかに限る。

包含と子孫関係の同値を示す。[d[v],f[v]]⊂[d[u],f[u]][\mathrm{d}[v],\mathrm{f}[v]]\subset[\mathrm{d}[u],\mathrm{f}[u]](u≠vu\ne v)なら、上の議論のとおりvvはuuの探索がスタック上にある間に発見されており、この間に発見される頂点は再帰の入れ子構造からすべてuuの子孫である。逆にvvがuuの子孫なら、vvはuuから木辺の列をたどってDFS(u)\mathrm{DFS}(u)の実行中に発見・完了するのでd[u]<d[v]\mathrm{d}[u]<\mathrm{d}[v]かつf[v]<f[u]\mathrm{f}[v]<\mathrm{f}[u]、すなわち区間は真に含まれる。▨

命題 3.3 (無向グラフの DFS における非木辺は後退辺). 無向グラフの DFS では、DFS 木に属さない各辺{u,v}\{u,v\}は必ず後退辺である。すなわち一方の端点が DFS 木でもう一方の(真の)先祖になっている。したがってGGが閉路をもつことと、DFS が後退辺(親への辺を除く)に出会うことは同値であり、DFS は閉路検出に使える。

証明. 辺{u,v}\{u,v\}をとり、d[u]<d[v]\mathrm{d}[u]<\mathrm{d}[v]とする(対称なので一般性を失わない)。DFS(u)\mathrm{DFS}(u)は戻る前にuuの全隣接頂点を走査するので、辺{u,v}\{u,v\}はuu側から時刻区間[d[u],f[u]][\mathrm{d}[u],\mathrm{f}[u]]内のある時点で調べられる。その時点でvvが未訪問であれば、vvはuuの子として発見され{u,v}\{u,v\}は木辺になる。vvが既に訪問済みであれば、vvはuuの発見後(d[v]>d[u]\mathrm{d}[v]>\mathrm{d}[u])かつDFS(u)\mathrm{DFS}(u)が戻る前(調べた時刻≤f[u]\le\mathrm{f}[u])に発見されているのでd[u]<d[v]<f[u]\mathrm{d}[u]<\mathrm{d}[v]<\mathrm{f}[u]、補題 3.2よりvvはuuの子孫である。ゆえに{u,v}\{u,v\}はuu(先祖)とvv(子孫)を結ぶ後退辺である。木辺でも後退辺でもない辺(横断辺・前進辺)は生じない。

閉路検出について。DFS 森は森だから辺数はn−cn-c(ccは成分数)で、GGが閉路をもつのはm>n−cm>n-c、すなわち非木辺が存在するとき、かつそのときに限る(§D2.7 定理 3.6)。非木辺はいま示したとおり後退辺であり、後退辺{u,v}\{u,v\}(vvがuuの真の先祖)があれば木のvvからuuへの道にこの辺を足して閉路が得られる。逆に閉路があれば非木辺すなわち後退辺が存在する。無向グラフでは子から親へ戻る木辺自身がもう一度調べられるが、これは後退辺に数えない。▨

系 3.4 (探索の反復による連結成分の列挙). 未訪問の頂点から探索(BFS または DFS)を繰り返し起動すると、各起動はその始点の連結成分をちょうど発見し、全体でGGの連結成分が隣接リスト上Θ(n+m)\Theta(n+m)時間で列挙される。

証明. 始点ssからの一度の探索が発見する頂点全体は、ssから到達可能な頂点の集合に一致する(探索は辺に沿ってのみ伝播し、到達可能な頂点はすべて発見される)。§D2.7 命題 2.4により到達可能性は同値関係で、その同値類が連結成分だから、この集合はssを含む連結成分そのものである。探索終了後、まだ未訪問の頂点があればそれは別の成分に属するので、そこから起動すれば次の成分が得られる。各頂点は一度だけ発見され、隣接リストでは各辺{u,v}\{u,v\}は両端点から一度ずつ計 2 回調べられるので、総計算量はΘ(n+m)\Theta(n+m)である。▨

命題 3.5. 有限無向グラフG=(V,E)G=(V,E)に対し、各頂点を「未着色」、色00、色11のいずれかで管理する。未着色の頂点rrを選ぶたびにrrを色00にし、rrから BFS または DFS を行う。辺{u,v}\{u,v\}を走査したとき、vvが未着色ならvvをuuと反対の色にして探索へ加え、vvが着色済みでuuと同色なら「二部グラフでない」と出力して停止する。すべての連結成分を衝突なく走査し終えたら、色00の頂点集合X0X_0と色11の頂点集合X1X_1を出力する。

この手続きはO(∣V∣+∣E∣)O(|V|+|E|)時間で停止し、衝突なく停止することとGGが二部グラフであることは同値である。衝突がなければV=X0⊔X1V=X_0\sqcup X_1は二部分割であり、衝突があればGGは奇数長の閉路をもつ(§D2.7 定理 5.3)。

証明. 一つの連結成分の探索中、着色済み頂点の集合と各頂点の色を状態とする。次の不変条件を用いる。対象成分が二部分割A⊔BA\sqcup Bをもつなら、必要に応じてA,BA,Bを入れ替えて根rrをAAに置いたとき、着色済みの各頂点はAAに属するなら色00、BBに属するなら色11である。

根を色00にした直後には不変条件が成り立つ。辺{u,v}\{u,v\}を通じて未着色のvvを着色する段階では、二部分割の定義によりuuとvvは反対側に属するので、uuと反対の色を与えた後にも不変条件が保たれる。着色済みの頂点へ至る辺を走査するだけなら状態は変わらない。したがって、GGが二部グラフなら同色の両端をもつ辺には出会わず、この手続きが誤って拒否することはない。

反対に、すべての辺を衝突なく走査し終えたとする。各頂点はいずれか一方の色をもち、走査済みの各辺の両端は異なる色なので、X0X_0とX1X_1はそれぞれ独立集合であり、V=X0⊔X1V=X_0\sqcup X_1は二部分割である。途中で同色の両端をもつ辺に出会った場合にGGが二部であると仮定すると、上の不変条件によりその両端は二部分割の反対側に属し、異なる色をもつはずなので矛盾する。よってこの場合はGGが二部グラフでなく、§D2.7 定理 5.3により奇数長の閉路をもつ。

各頂点は一度だけ着色され、隣接リストでは各辺を両端から高々一度ずつ調べる。初期化と未着色の根の選択も全頂点を通じて行えるので、総時間はO(∣V∣+∣E∣)O(|V|+|E|)であり、手続きは有限回で停止する。▨

4 重み付き最短路:最適部分構造と緩和

この節と次のダイクストラ法の節では、有限有向グラフと有限無向グラフの双方を扱う。有向グラフではE→:=EE^{\to}:=Eとし、無向グラフでは各辺{u,v}∈E\{u,v\}\in Eを相反する二つの向き(u,v),(v,u)(u,v),(v,u)で通れるものとして

E→:={(u,v),(v,u):{u,v}∈E}E^{\to}:=\{(u,v),(v,u):\{u,v\}\in E\}

とおく。非負重みw ⁣:E→→R≥0w\colon E^{\to}\to\mathbb{R}_{\ge 0}を付け、無向グラフではw(u,v)=w(v,u)w(u,v)=w(v,u)と仮定する。以下の(u,v)(u,v)はE→E^{\to}の辺を表す。ss–vv有向歩道の重みを辺重みの総和とし、距離d(s,v)d(s,v)をそのような歩道の重みの最小値(到達不能なら∞\infty)と定める。非負重みでは、歩道から有向閉路を除いても重みは増えないので、最小値は有向道で達成される。

補題 4.1 (最短路の最適部分構造と三角不等式). 上の意味での非負重み有向グラフまたは無向グラフにおいて、次が成り立つ。

  1. (最適部分構造)p=(v0,v1,…,vk)p=(v_0,v_1,\dots,v_k)が最短v0v_0–vkv_k道ならば、任意の0≤i≤j≤k0\le i\le j\le kに対し部分道(vi,…,vj)(v_i,\dots,v_j)は最短viv_i–vjv_j道である。
  2. (三角不等式) 任意の辺(u,v)(u,v)(重みw(u,v)w(u,v))に対しd(s,v)≤d(s,u)+w(u,v)d(s,v)\le d(s,u)+w(u,v)。

証明. 1.ppの重みはw(p)=w(v0..vi)+w(vi..vj)+w(vj..vk)w(p)=w(v_0..v_i)+w(v_i..v_j)+w(v_j..v_k)と分解される。もしviv_i–vjv_j間により重みの小さい道qqがあれば、ppの中間部分をqqに置き換えてv0v_0–vkv_k歩道が得られ、その重みはw(p)w(p)より小さい。非負重みゆえこの歩道は同じか小さい重みの道を含み、w(p)=d(v0,vk)w(p)=d(v_0,v_k)の最小性に反する。ゆえに(vi,…,vj)(v_i,\dots,v_j)は最短である。

2.uuが到達不能なら右辺は∞\inftyで自明。uuが到達可能なら、最短ss–uu道(重みd(s,u)d(s,u))に辺(u,v)(u,v)を継ぎ足すと重みd(s,u)+w(u,v)d(s,u)+w(u,v)のss–vv歩道になり、d(s,v)d(s,v)はその最小値以下だからd(s,v)≤d(s,u)+w(u,v)d(s,v)\le d(s,u)+w(u,v)。▨

最短路アルゴリズムの共通部品は緩和である。各頂点に見積りd[v]d[v]を持ち、d[s]=0d[s]=0、他を∞\inftyに初期化する。辺(u,v)(u,v)の緩和とは、d[u]+w(u,v)<d[v]d[u]+w(u,v)<d[v]ならばd[v]:=d[u]+w(u,v)d[v]:=d[u]+w(u,v)(およびparent[v]:=u\mathrm{parent}[v]:=u)と更新する操作である。

命題 4.2 (緩和の不変条件). 上の初期化から始めて任意の順序で緩和を行うとき、各頂点vvについて次が常に成り立つ。

  1. d[v]d[v]は∞\inftyであるか、実在するss–vv歩道の重みである。
  2. d[v]≥d(s,v)d[v]\ge d(s,v)(過小評価しない)。
  3. d[v]d[v]は単調非増加である。

証明. 3 は緩和が値を下げるか保つだけなので明らか。1 を緩和回数の帰納法で示す。初期状態ではd[s]=0d[s]=0が長さ00の歩道の重み、他は∞\infty。緩和でd[v]d[v]がd[u]+w(u,v)d[u]+w(u,v)に更新されるとき、帰納法の仮定よりd[u]d[u]は実在するss–uu歩道の重みだから、辺(u,v)(u,v)を足せば重みd[u]+w(u,v)d[u]+w(u,v)のss–vv歩道になる。2:1 よりd[v]d[v]は∞\inftyか実在歩道の重みであり、非負重みでは任意のss–vv歩道の重みは(それが含む道の重み以上ゆえ)d(s,v)d(s,v)以上だからd[v]≥d(s,v)d[v]\ge d(s,v)。▨

命題 4.2の 2・3 から、いったんd[v]=d(s,v)d[v]=d(s,v)に達すればそれ以上下がらず、値は確定する。残る問題は「どの順序で緩和すれば確定するか」である。

5 ダイクストラ法

定理 5.1 (ダイクストラ法の正当性). 上の意味での非負重み有向グラフまたは無向グラフにおいて、次のダイクストラ法は各頂点vvのd[v]=d(s,v)d[v]=d(s,v)を正しく計算する。確定集合SSを空に、d[⋅]d[\cdot]を上記のとおり初期化する。SSに属さない頂点のうちd[⋅]d[\cdot]が最小のものuuを選んでSSに加え、uuから出る各辺(u,v)(u,v)を緩和する。これを全頂点がSSに入るまで繰り返す。頂点uuがSSに加えられる時点でd[u]=d(s,u)d[u]=d(s,u)が成り立つ。

証明. 不変条件「SSに加えられる各頂点uuについて、その時点でd[u]=d(s,u)d[u]=d(s,u)」を、SSに加える操作の回数に関する帰納法で示す。最初に加えるのはdd最小のss(d[s]=0=d(s,s)d[s]=0=d(s,s))で成り立つ。

ある時点でSSが不変条件を満たしているとし、次に選ばれる頂点u=arg⁡min⁡v∉Sd[v]u=\arg\min_{v\notin S}d[v]を考える。命題 4.22 よりd[u]≥d(s,u)d[u]\ge d(s,u)は既に成り立つので、d[u]≤d(s,u)d[u]\le d(s,u)を示せばよい。d(s,u)=∞d(s,u)=\inftyならd[u]=∞d[u]=\inftyで等号ゆえ、以下d(s,u)<∞d(s,u)<\inftyとする。最短ss–uu道PPをとる。s∈Ss\in Sかつu∉Su\notin Sだから、PPはSSから外へ出る。PP上でSSに属さない最初の頂点をyy、その直前の頂点をxxとする(x∈Sx\in S)。

xxがSSに加えられたとき辺(x,y)(x,y)は緩和されているので、その後d[y]≤d[x]+w(x,y)d[y]\le d[x]+w(x,y)。帰納法の仮定よりxxが加えられた時点でd[x]=d(s,x)d[x]=d(s,x)、かつ以後d[x]d[x]は下がらないが命題 4.22 でd(s,x)d(s,x)未満にはならないのでd[x]=d(s,x)d[x]=d(s,x)のままである。またPPのss–yy部分は最短(補題 4.11)でd(s,y)=d(s,x)+w(x,y)d(s,y)=d(s,x)+w(x,y)。よって

d[y]≤d[x]+w(x,y)=d(s,x)+w(x,y)=d(s,y).d[y]\le d[x]+w(x,y)=d(s,x)+w(x,y)=d(s,y).

命題 4.22 のd[y]≥d(s,y)d[y]\ge d(s,y)と合わせd[y]=d(s,y)d[y]=d(s,y)。さらにyyは最短路PP上でuuより手前(または一致)にあり、非負重みゆえd(s,y)≤d(s,u)d(s,y)\le d(s,u)。したがって

d[y]=d(s,y)≤d(s,u)≤d[u].d[y]=d(s,y)\le d(s,u)\le d[u].

ところがuuはSSの外でdd最小として選ばれ、yyもSSの外にあるからd[u]≤d[y]d[u]\le d[y]。両者を合わせるとd[u]=d[y]=d(s,u)d[u]=d[y]=d(s,u)、すなわちd[u]≤d(s,u)d[u]\le d(s,u)を得る。ゆえにd[u]=d(s,u)d[u]=d(s,u)で不変条件が保たれる。

各頂点は一度SSに加えられ、そのときdd値がd(s,⋅)d(s,\cdot)に確定し以後不変。全頂点がSSに入った終了時、すべてのvvでd[v]=d(s,v)d[v]=d(s,v)である。▨

命題 5.2 (配列実装したダイクストラ法の手数).定理 5.1の入力を、各有向辺(u,v)(u,v)の終点と重みをAdj[u]\mathrm{Adj}[u]に格納する隣接リストで与えるとします。無向辺は両方向の二つの項として格納します。距離見積りと確定状態を長さnnの配列に持ち、各反復の最小値選択では未確定の全頂点を線形走査し、一つの辺の緩和をO(1)O(1)時間で行うものとします。

この実装では、最小値選択は高々nn回で各回に高々nn頂点を調べ、隣接リストの項は全実行を通じて有向グラフならmm回、無向グラフなら2m2m回調べます。したがって実行時間はO(n2+m)O(n^2+m)、入力の隣接リストを除く補助領域はO(n)O(n)です。

証明. 距離見積りと確定状態の初期化にはO(n)O(n)時間を要します。各頂点は高々一度だけ確定されるので反復は高々nn回であり、各反復の線形走査にはO(n)O(n)時間を要します。したがって最小値選択の総時間はO(n2)O(n^2)です。

頂点uuが確定されたときだけAdj[u]\mathrm{Adj}[u]を一度走査するため、各隣接リストの項は全実行を通じて一度だけ調べられます。有向グラフの項数はmm、無向グラフの項数は2m2mであり、一つの項に対する加算・比較・必要な代入はO(1)O(1)時間です。したがって緩和の総時間はO(m)O(m)です。以上を合わせて実行時間はO(n2+m)O(n^2+m)となります。距離見積り、親、確定状態の各配列はいずれも長さnnなので、入力を除く補助領域はO(n)O(n)です。▨

注意 5.3 (非負性が本質的である). 上の証明で「yyがuuより手前ゆえd(s,y)≤d(s,u)d(s,y)\le d(s,u)」は非負重みに依存する。負辺があると、いったん確定した頂点の距離が後から短くなりうるため、確定の不変条件が壊れる。負辺を含む最短路にはベルマン–フォード法など別の手法を要する。

例 5.4 (ダイクストラ法の実行例(数値検算)). 頂点{s,1,2,3,4}\{s,1,2,3,4\}、有向辺と重みを

s ⁣→ ⁣1 (2), s ⁣→ ⁣2 (5), 1 ⁣→ ⁣2 (1), 1 ⁣→ ⁣3 (4), 2 ⁣→ ⁣3 (2), 2 ⁣→ ⁣4 (7), 3 ⁣→ ⁣4 (1)s\!\to\!1\,(2),\ s\!\to\!2\,(5),\ 1\!\to\!2\,(1),\ 1\!\to\!3\,(4),\ 2\!\to\!3\,(2),\ 2\!\to\!4\,(7),\ 3\!\to\!4\,(1)

とする。ダイクストラ法を走らせると次のように確定していく(かっこ内は確定時のdd値)。

  • ssを確定(0)(0)。緩和でd[1]=2, d[2]=5d[1]=2,\ d[2]=5。
  • SS外で最小の11を確定(2)(2)。緩和でd[2]=min⁡(5,2+1)=3d[2]=\min(5,2+1)=3、d[3]=2+4=6d[3]=2+4=6。
  • 次に最小の22を確定(3)(3)。緩和でd[3]=min⁡(6,3+2)=5d[3]=\min(6,3+2)=5、d[4]=3+7=10d[4]=3+7=10。
  • 次に33を確定(5)(5)。緩和でd[4]=min⁡(10,5+1)=6d[4]=\min(10,5+1)=6。
  • 最後に44を確定(6)(6)。

確定順はs(0),1(2),2(3),3(5),4(6)s(0),1(2),2(3),3(5),4(6)でdd値は非減少である。最終結果d=(0,2,3,5,6)d=(0,2,3,5,6)は手計算とも一致する:d(s,2)=min⁡(5, 2+1)=3d(s,2)=\min(5,\,2{+}1)=3、d(s,3)d(s,3)はs ⁣→ ⁣1 ⁣→ ⁣2 ⁣→ ⁣3=2+1+2=5s\!\to\!1\!\to\!2\!\to\!3=2{+}1{+}2=5、d(s,4)d(s,4)はs ⁣→ ⁣1 ⁣→ ⁣2 ⁣→ ⁣3 ⁣→ ⁣4=6s\!\to\!1\!\to\!2\!\to\!3\!\to\!4=6(対してs ⁣→ ⁣2 ⁣→ ⁣4=3+7=10s\!\to\!2\!\to\!4=3{+}7=10は劣る)。

6 グラフ不変量

定義 6.1 (グラフ同型とグラフ不変量). 二つのグラフG=(V,E)G=(V,E),H=(W,F)H=(W,F)が同型(G≅HG\cong H)であるとは、全単射φ ⁣:V→W\varphi\colon V\to Wで

{u,v}∈E  ⟺  {φ(u),φ(v)}∈F\{u,v\}\in E\iff\{\varphi(u),\varphi(v)\}\in F

を満たすものが存在することをいう。グラフに数(または多重集合など)を割り当てる量ϕ\phiがグラフ不変量であるとは、G≅H⇒ϕ(G)=ϕ(H)G\cong H\Rightarrow \phi(G)=\phi(H)を満たすことをいう。頂点数、辺数、連結成分数、内周(最短閉路長)、次数列(次数を並べた多重集合)、彩色数などは不変量である。逆向きϕ(G)=ϕ(H)⇒G≅H\phi(G)=\phi(H)\Rightarrow G\cong Hまで満たす不変量を完全不変量という。

不変量は同型判定の道具である。二つのグラフである不変量の値が異なれば、それだけで非同型と結論できる。しかし単一の不変量で同型を保証できる(完全である)とは限らない。

例 6.2 (次数列は不変量だが完全ではない). 次数列が不変量であることは、同型φ\varphiが頂点vvとその像φ(v)\varphi(v)の次数を保つ(隣接を保つ全単射だからdeg⁡v=deg⁡φ(v)\deg v=\deg\varphi(v))ことによる。しかし完全ではない。66頂点の閉路C6C_6と、二つの三角形の非交和C3⊔C3C_3\sqcup C_3を比べると、いずれも全頂点の次数が22で、次数列は同じ多重集合(2,2,2,2,2,2)(2,2,2,2,2,2)である。ところがC6C_6は連結(成分数11、内周66)でC3⊔C3C_3\sqcup C_3は非連結(成分数22、内周33)だから、成分数という別の不変量が両者を区別し、C6≇C3⊔C3C_6\not\cong C_3\sqcup C_3である。よって同じ次数列をもつ非同型グラフが存在し、次数列は完全不変量ではない。

7 最小全域木とカット性質

連結グラフG=(V,E)G=(V,E)に非負とは限らない実重みw ⁣:E→Rw\colon E\to\mathbb{R}を与える。GGの全域木(§D2.7 命題 3.9により存在する)のうち辺重みの総和が最小のものを最小全域木(MST)という。全域木は有限個なので最小のものは存在する。VVの分割(S,V∖S)(S,V\setminus S)(∅≠S⊊V\emptyset\ne S\subsetneq V)をカット、片方の端点がSS、他方がV∖SV\setminus Sにある辺をこのカットの横断辺という。

定理 7.1 (カット性質). 任意のカット(S,V∖S)(S,V\setminus S)に対し、その横断辺のうち重み最小のものeeは、ある最小全域木に属する。さらに全辺の重みが相異なるならば、eeはすべての最小全域木に属する。

証明.TTを一つの最小全域木とする。e={u,v}∈Te=\{u,v\}\in Tならそのまま結論を得る。e∉Te\notin Tとする。木TTに辺eeを加えると、TT内のuu–vv道PP(§D2.7 定理 3.6により一意)とeeからなる閉路CCがちょうど一つでき、他に閉路はできない。eeはカット(S,V∖S)(S,V\setminus S)を横断するので、閉路CCはSSとV∖SV\setminus Sの間を必ず偶数回渡り、ee以外に少なくとも一つ横断辺e′∈Pe'\in P(e′≠ee'\ne e)をもつ。

いまT′=(T∖{e′})∪{e}T'=(T\setminus\{e'\})\cup\{e\}を考える。e′e'は閉路CC上の辺なので、これを除いてもCCの残りの道で連結性は保たれ、T′T'はn−1n-1本の辺をもつ連結グラフ、すなわち全域木である(§D2.7 定理 3.6)。その重みは

w(T′)=w(T)−w(e′)+w(e)≤w(T)w(T')=w(T)-w(e')+w(e)\le w(T)

で、最後の不等号はeeが横断辺のうち重み最小ゆえw(e)≤w(e′)w(e)\le w(e')による。TTは最小だからw(T′)≥w(T)w(T')\ge w(T)でもあり、w(T′)=w(T)w(T')=w(T)。よってT′T'も最小全域木で、これはeeを含む。ゆえにeeはある最小全域木に属する。

全辺の重みが相異なる場合、e′≠ee'\ne eならw(e)<w(e′)w(e)<w(e')で上の不等号は狭義となりw(T′)<w(T)w(T')<w(T)。これはTTの最小性に反するので、実は最初からe∈Te\in Tでなければならない。TTは任意の最小全域木だったから、eeはすべての最小全域木に属する。▨

系 7.2 (貪欲法(クラスカル法・プリム法)の正当性).G=(V,E)G=(V,E)を連結グラフ、w ⁣:E→Rw\colon E\to\mathbb{R}を辺の重みとする。このとき、プリム法とクラスカル法はいずれもGGの最小全域木を出力する。

証明. プリム法は、一つの頂点から始め、現在の木の頂点集合SSとV∖SV\setminus Sのカットで最小重みの横断辺を繰り返し採用する。クラスカル法は、辺を重みの非減少順に調べ、現在の採用辺に加えても閉路を作らない辺を採用する。いずれについても、採用済み辺の集合をFFと書く。

主張 7.2.1. プリム法ではFFはSSを頂点集合とする木であり、クラスカル法ではFFは森である。さらに、いずれの方法でも、初期状態および各辺を採用した直後にFFのすべての辺を同時に含む最小全域木TTが存在する。

証明. 初期状態ではF=∅F=\varnothingである。プリム法ではSSは最初の一頂点だけからなり、FFはSS上の木である。クラスカル法ではFFは空の森である。GGは連結で全域木をもち、全域木は有限個だから最小全域木が存在し、これはFFを含む。

プリム法で不変量が成り立っているとし、次に採用する辺をe={u,v}e=\{u,v\}とする。u∈Su\in S、v∉Sv\notin Sとしてよい。FFはSS上の木だから、F∪{e}F\cup\{e\}はS∪{v}S\cup\{v\}上の木である。不変量の最小全域木TTがeeを含めば、TTはそのままF∪{e}F\cup\{e\}を含む。e∉Te\notin Tならば、TTにeeを加えてできる閉路は、SSとV∖SV\setminus Sの間をee以外にもう一度横断する辺e′e'を含む。FFの全辺は両端点がSSにあるのでe′∉Fe'\notin Fである。プリム法はこのカットの最小重み辺eeを選ぶからw(e)≤w(e′)w(e)\le w(e')であり、

T′=(T∖{e′})∪{e}T'=(T\setminus\{e'\})\cup\{e\}

はF∪{e}F\cup\{e\}を含む全域木でw(T′)≤w(T)w(T')\le w(T)を満たす。TTの最小性からT′T'も最小全域木である。したがって不変量は保たれる。

クラスカル法で不変量が成り立っているとし、辺e={u,v}e=\{u,v\}を採用するとする。採用条件よりu,vu,vは森FFの異なる連結成分に属するので、F∪{e}F\cup\{e\}は森である。不変量の最小全域木TTがeeを含めば、そのまま結論を得る。e∉Te\notin Tならば、TT内のuuからvvへの道は、uuを含むFFの連結成分SSとV∖SV\setminus Sの間を横断する辺e′e'を含む。このe′e'はFFの異なる連結成分を結ぶのでe′∉Fe'\notin Fである。またe′e'がeeより前に調べられていたなら、その時点でも両端点は異なる連結成分に属していたのでe′e'は採用されたはずであり、e′∉Fe'\notin Fに反する。したがってe′e'はeeより前には調べられておらず、辺を重みの非減少順に調べることからw(e)≤w(e′)w(e)\le w(e')である。よって

T′=(T∖{e′})∪{e}T'=(T\setminus\{e'\})\cup\{e\}

はF∪{e}F\cup\{e\}を含む全域木であり、w(T′)≤w(T)w(T')\le w(T)とTTの最小性から最小全域木である。したがってクラスカル法でも不変量は保たれる。▨

プリム法では、S≠VS\ne Vである限り連結性によりカット(S,V∖S)(S,V\setminus S)の横断辺が存在し、各反復でSSの頂点が一つ増える。したがって有限回でS=VS=Vとなり、FFは全域木になる。クラスカル法では、全辺を調べ終えたときFFが非連結なら、GGの連結性によりFFの異なる二成分を結ぶ辺が存在する。その辺は調べた時点で閉路を作らず採用されるはずだから矛盾する。したがって終了時のFFは連結な森、すなわち全域木である。

どちらの方法でも主張 7.2.1により終了時のFFを含む最小全域木TTが存在する。FFとTTは同じ頂点集合上の全域木で、ともに∣V∣−1|V|-1本の辺をもつからF=TF=Tである。よって出力FFは最小全域木である。▨

命題 7.3 (成分ラベル配列を用いたクラスカル法の手数).系 7.2のクラスカル法の入力を、両端点と重みを持つmm本の辺の配列で与えるとします。辺は最悪時間O ⁣(mlog⁡(m+1))O\!\left(m\log(m+1)\right)の比較整列(たとえば§D2.9 定義 2.4)で重みの非減少順に並べます。各頂点の現在の連結成分を長さnnのラベル配列で管理し、辺の両端のラベルが異なるときだけ辺を採用します。辺を採用したときは全頂点を一度走査し、二成分の一方のラベルを他方のラベルへ置き換えます。

この実装では、整列後に辺を高々mm回調べてラベルを比較し、採用する高々n−1n-1本の辺についてそれぞれ高々nn個のラベルを調べます。したがって実行時間はO ⁣(mlog⁡(m+1)+n2)O\!\left(m\log(m+1)+n^2\right)です。

証明. 採用した比較整列にはO ⁣(mlog⁡(m+1))O\!\left(m\log(m+1)\right)時間を要します。整列後の走査では各辺を一度だけ調べ、両端のラベルの比較にはO(1)O(1)時間を要するので、この部分はO(m)O(m)です。

採用条件により、クラスカル法は現在の森の異なる二成分を結ぶ辺だけを採用します。辺を採用するたびに成分数が一つ減るので、採用回数は高々n−1n-1回です。一回の併合では長さnnのラベル配列を一度走査するため、併合の総時間はO(n2)O(n^2)です。ラベルの置換後には同じ連結成分の頂点が同じラベルをもち、異なる成分の頂点が異なるラベルをもつので、次の辺の採否は両端のラベル比較だけで正しく判定できます。以上を合わせて実行時間はO ⁣(mlog⁡(m+1)+n2)O\!\left(m\log(m+1)+n^2\right)です。▨

注意 7.4 (緩和・不変量の一般論への接続). BFS・ダイクストラ法・カット性質の証明はいずれも「初期化で成り立ち、各反復で保たれる不変条件が終了時に目的の事後条件を導く」という同じ骨格をもつ。この論法はループ不変条件による正当性証明として一般化され、停止性(各反復で狭義に減少する整礎な変量の存在)と合わせてアルゴリズムの正当性の標準的枠組みになる。また最短路の緩和とカット性質の「交換論法」は、後続の最大フロー・最小カットや線形計画の双対性とも通底する主題である。これらは離散最適化・計算量の項で正当性と計算量の観点から扱う。

前提記事