重み付きグラフの最短経路

同義語:Dijkstra法(高校数学)shortest paths in weighted graphs

概要

重み付きグラフの最短経路(shortest paths in weighted graphs)とは、辺に長さのついたグラフで、1 つの頂点 $s$ から各頂点への道の長さの最小値(距離)と、その長さの道を求める問題である。辺の長さがすべて $0$ 以上の連結なグラフでは、Dijkstra 法(まだ確定していない頂点のうち暫定値が最小のものを確定し、その頂点から出る辺で暫定値を小さく書き換えることをくり返す方法)で確定した値は距離に等しく、直前の頂点をたどると最短の道が得られる。証明は、最短の道の途中までも最短であることと、確定する順についての帰納法による。長さが負の辺があると、確定した値が距離より大きくなることや、いくらでも短い道があって距離が定まらないことがある。

$$\newcommand{C}[0]{\mathbb{C}} \newcommand{div}[0]{\mathbin{÷}} \newcommand{N}[0]{\mathbb{N}} \newcommand{Q}[0]{\mathbb{Q}} \newcommand{R}[0]{\mathbb{R}} \newcommand{Z}[0]{\mathbb{Z}} $$

前提知識: 一筆書きとグラフ, 数学的帰納法と整列性

高校での出発点:地図の上でいちばん短い道を探す

4 つの町 $P$、$Q$、$R$、$S$ が道路で結ばれていて、道路の長さ(km)が分かっているとする。$P$ から $S$ へ行くいちばん短い道はどれだろうか。
町を頂点、道路を辺とし、辺に長さを書きこむと、一筆書きとグラフ で使ったグラフの図になる(図 1)。辺の長さは、道路の長さでも、かかる時間でも、運賃でもよい。

4 つの町の地図で、道を全部書き出す

道路は $P$–$Q$ が $5$、$P$–$R$ が $2$、$R$–$Q$ が $2$、$Q$–$S$ が $1$、$R$–$S$ が $6$ とする。同じ町を 2 度通らない $P$ から $S$ への道は、次の 4 本である。

道長さ
$P\to Q\to S$$5+1=6$
$P\to R\to S$$2+6=8$
$P\to R\to Q\to S$$2+2+1=5$
$P\to Q\to R\to S$$5+2+6=13$

いちばん短いのは $P\to R\to Q\to S$ で、長さは $5$ である。通る道路の本数は $3$ 本で、$2$ 本の道 $P\to Q\to S$ より多い。本数の少ない道がいつも短いとは限らない。
同じようにして、$P$ から $Q$ へのいちばん短い道は $P\to R\to Q$(長さ $2+2=4$。直接の道路 $P\to Q$ は $5$)、$P$ から $R$ へは直接の道路 $P\to R$(長さ $2$)である。

4 つの町の地図。赤い道 P→R→Q→S が P から S へのいちばん短い道で、長さは 5 4 つの町の地図。赤い道 P→R→Q→S が P から S へのいちばん短い道で、長さは 5
町が 4 つなら道を全部書き出せる。しかし町が増えると、道の数は急に増える。どの 2 つの町も道路で結ばれた 6 つの町では、ある町から別の町への、同じ町を 2 度通らない道は $65$ 本ある(rem-spp-cost)。この記事で答える問いは次の 3 つである。

  1. 道を全部書き出さずに、いちばん短い道を求める方法はあるか。→ def-spp-dijkstra
  2. その方法の答えが本当にいちばん短いと、どうして言えるか。→ thm-spp-main
  3. 辺の長さに条件は要るか。→ ex-spp-cx-negative、ex-spp-cx-cycle
    高校の計算この記事の言葉大学の言葉
    地図に道路の長さを書きこむ重み付きグラフ辺に重みのついたグラフ
    いちばん短い道の長さ距離 $d(s,v)$最短路の長さ
    近い町から順に長さを決めていくDijkstra 法貪欲法の一種
    「途中までもいちばん短い」最短の道の部分も最短最適性の原理
    似た名前の問題が 2 つあるので、先に区別しておく。最短経路の数え上げと鏡像原理 は、格子の上の最短の道が 何本あるか を数える問題で、どの道も長さが同じである。この記事は、長さの違う道の中から 長さの最小値 を求める問題である。Steiner木 の最小全域木は、すべての町を結ぶ道路網の 長さの合計 を最小にする問題で、1 つの町から各町への道の長さとは別のものを最小にする(ex-spp-cx-mst)。

言葉の準備:重み付きグラフと距離

重み付きグラフ・道・距離

有限個の頂点と、異なる 2 頂点を結ぶ辺からなるグラフで、どの 2 頂点の間にも辺は多くとも 1 本であるものを考える。各辺 $uv$ に実数 $w(uv)$ が決まっているとき、このグラフを 重み付きグラフ といい、$w(uv)$ を辺 $uv$ の 長さ という。
頂点の列 $v_0,v_1,\dots,v_k$ で、どの $i=1,\dots,k$ についても $v_{i-1}$ と $v_i$ が辺で結ばれているものを、$v_0$ から $v_k$ への 道 といい、$v_0\to v_1\to\dots\to v_k$ と書く。同じ頂点を 2 度以上通ってもよい。$k=0$ のとき(頂点 $v_0$ だけの列)も道とみなす。道の 長さ を、通る辺の長さの和
$$ w(v_0v_1)+w(v_1v_2)+\dots+w(v_{k-1}v_k) $$
で定める($k=0$ の道の長さは $0$)。同じ頂点を 2 度通らない道を 単純な道 という。
グラフが 連結 であるとは、どの 2 頂点についても一方から他方への道があることをいう。2 頂点 $s$、$v$ について、$s$ から $v$ への道の長さの最小値を、$s$ から $v$ への 距離 といい、$d(s,v)$ と書く。長さが $d(s,v)$ に等しい道を、$s$ から $v$ への 最短の道 という。

道は「同じ頂点を 2 度通ってもよい」としたので、道の数は一般に無限にある。無限にあるものの長さに最小値があるかどうかは、すぐには分からない。辺の長さが $0$ 以上なら最小値があることを、次の補題で示す(辺の長さが負のときに最小値がない例は ex-spp-cx-cycle)。

距離を読む
  1. ex-spp-start の地図では $d(P,S)=5$、$d(P,Q)=4$、$d(P,R)=2$、$d(P,P)=0$ である。
  2. 道 $P\to R\to Q\to R\to S$ は $R$ を 2 度通る道で、長さは $2+2+2+6=12$ である。途中の回り道 $R\to Q\to R$(長さ $4$)を除くと単純な道 $P\to R\to S$(長さ $8$)になり、短くなる。
回り道を除いても長くならない

辺の長さがすべて $0$ 以上の重み付きグラフで、$s$ から $v$ への道があれば、$s$ から $v$ への単純な道で、長さがもとの道以下のものがある。とくに、グラフが連結なら、どの $v$ についても距離 $d(s,v)$ が定まり、それは単純な道の長さの最小値に等しい。

段 1(回り道を 1 つ除く).道 $v_0\to v_1\to\dots\to v_k$ が同じ頂点を 2 度通るとする。つまり $i< j$ で $v_i=v_j$ となるものがある。このとき、$v_i$ から $v_j$ までの部分を除いた列
$$ v_0\to\dots\to v_i\to v_{j+1}\to\dots\to v_k $$
も道である($j< k$ なら、$v_i=v_j$ と $v_{j+1}$ は辺で結ばれているから。$j=k$ なら、列は $v_0\to\dots\to v_i$ で、終点は $v_i=v_k$ のまま変わらない)。除いた部分の長さは $w(v_iv_{i+1})+\dots+w(v_{j-1}v_j)$ で、辺の長さが $0$ 以上なのでこの和は $0$ 以上である。よって新しい道の長さは、もとの長さ以下である。
段 2(くり返す).段 1 を行うたびに、列の頂点の数は $j-i\ge1$ 個以上減る。頂点の数は $0$ 以上の整数なので、段 1 は有限回しか行えない。段 1 を行えなくなったとき、道は同じ頂点を 2 度通らない、つまり単純な道である。長さは途中で増えないので、もとの道の長さ以下である。
段 3(最小値がある).単純な道は頂点を 2 度通らないので、頂点の数を $n$ とすると、並べ方は有限通りしかない。よって $s$ から $v$ への単純な道は有限個で、その長さには最小値 $m$ がある(連結なので $s$ から $v$ への道があり、段 2 から単純な道も少なくとも 1 本ある)。どの道の長さも、段 2 で作った単純な道の長さ以上、つまり $m$ 以上である。$m$ は単純な道の長さとして実際にとる値なので、$m$ はすべての道の長さの最小値で、$d(s,v)=m$ である。

以下、この記事では、グラフは連結で、出発点の頂点 $s$ を 1 つ決めて考える。$d(s,s)=0$ である(長さ $0$ の道 $s$ があり、長さは $0$ 未満にならないから)。
次の 2 つの補題は、Dijkstra 法の正しさの証明で使う。

最短の道の途中までも最短

$s=u_0\to u_1\to\dots\to u_k=v$ が $s$ から $v$ への最短の道なら、どの $j$($0\le j\le k$)についても、途中までの道 $u_0\to u_1\to\dots\to u_j$ は $s$ から $u_j$ への最短の道である。とくに $j\ge1$ なら
$$ d(s,u_j)=d(s,u_{j-1})+w(u_{j-1}u_j) $$
である。

途中までの道 $u_0\to\dots\to u_j$ の長さを $a$、残りの道 $u_j\to\dots\to u_k$ の長さを $b$ とすると、最短の道の長さは $d(s,v)=a+b$ である。
背理法で示す。$s$ から $u_j$ への道で、長さが $a$ より小さい $a'$ のものがあったとする。その道の後ろに残りの道 $u_j\to\dots\to u_k$ をつなぐと、$s$ から $v$ への道になり(つなぎ目は同じ頂点 $u_j$)、長さは $a'+b< a+b=d(s,v)$ である。これは $d(s,v)$ が道の長さの最小値であることに反する。よって途中までの道は最短の道で、$d(s,u_j)=a$ である。
$j\ge1$ のとき、$u_0\to\dots\to u_{j-1}$ も(同じ理由で)最短の道なので、その長さは $d(s,u_{j-1})$ である。$u_0\to\dots\to u_j$ の長さはそれに $w(u_{j-1}u_j)$ を足したものなので、$d(s,u_j)=d(s,u_{j-1})+w(u_{j-1}u_j)$ である。

この補題では、辺の長さが $0$ 以上であることを使っていない。

辺を 1 本足す

辺 $uv$ があれば、$d(s,v)\le d(s,u)+w(uv)$ である。

$s$ から $u$ への最短の道の後ろに辺 $uv$ をつなぐと、$s$ から $v$ への道になる。その長さは $d(s,u)+w(uv)$ である。$d(s,v)$ は道の長さの最小値なので、この長さ以下である。

補題を地図で確かめる

ex-spp-start の地図で、最短の道 $P\to R\to Q\to S$(長さ $5$)の途中までの道 $P\to R\to Q$ の長さは $4$ で、$d(P,Q)=4$ に等しい(lem-spp-sub)。
辺 $PQ$ について lem-spp-tri を当てると、$d(P,Q)\le d(P,P)+w(PQ)=0+5=5$ で、実際 $d(P,Q)=4\le5$ である。等号になるとは限らない。辺 $RQ$ では $d(P,Q)\le d(P,R)+w(RQ)=2+2=4$ で、等号である。

Dijkstra 法:近い頂点から順に距離を決める

ex-spp-start で、$P$ から $R$ への距離が $2$ だとすぐ分かったのは、次の理由による。$P$ からどこへ行くにも、最初に $P$ から出る道路を 1 本通る。その長さは $5$ か $2$ で、どちらも $2$ 以上である。その後に長さ $0$ 以上の道路を何本足しても、$2$ より短くはならない。この考えをくり返すと、近い頂点から順に距離を決めていける。

Dijkstra 法

辺の長さがすべて $0$ 以上の連結な重み付きグラフと、出発点 $s$ をとる。各頂点 $v$ に 暫定値 $D(v)$($\infty$ でもよい)と 直前の頂点 $p(v)$ を記録しながら、頂点を 1 つずつ 確定 していく。
準備.$D(s)=0$ とし、$s$ 以外の頂点 $v$ では $D(v)=\infty$ とする。どの頂点もまだ確定していない。
手順 1.まだ確定していない頂点の中で、暫定値 $D(u)$ が最小の頂点 $u$ を 1 つ選び、$u$ を確定する(最小の頂点が 2 つ以上あれば、どれを選んでもよい)。
手順 2.$u$ と辺で結ばれた、まだ確定していない各頂点 $v$ について、$D(u)+w(uv)< D(v)$ なら、$D(v)$ を $D(u)+w(uv)$ に置き換え、$p(v)=u$ と記録する。そうでなければ何もしない。
手順 3.まだ確定していない頂点が残っていれば手順 1 にもどる。残っていなければ終わる。

手順 2 は「$u$ を経由して $v$ へ行く道のほうが、今まで見つけた道より短いか」を調べる操作である。$\infty$ は、まだ道が見つかっていないという印で、どの実数よりも大きいとして比べる。手順 1〜3 を 1 回行うたびに確定した頂点が 1 つ増えるので、頂点が $n$ 個なら $n$ 回で終わる。

4 つの町の地図で Dijkstra 法を動かす

ex-spp-start の地図で、$s=P$ とする。準備で $D(P)=0$、$D(Q)=D(R)=D(S)=\infty$ である。
1 回目.未確定で最小は $D(P)=0$ なので $P$ を確定する。$P$ と結ばれた $Q$、$R$ を調べる。$0+5<\infty$ なので $D(Q)=5$、$p(Q)=P$。$0+2<\infty$ なので $D(R)=2$、$p(R)=P$。
2 回目.未確定の $Q$、$R$、$S$ の暫定値は $5$、$2$、$\infty$ で、最小は $D(R)=2$ なので $R$ を確定する。$R$ と結ばれた未確定の $Q$、$S$ を調べる。$2+2=4<5$ なので $D(Q)=4$、$p(Q)=R$。$2+6=8<\infty$ なので $D(S)=8$、$p(S)=R$。
3 回目.未確定の $Q$、$S$ の暫定値は $4$、$8$ で、$Q$ を確定する。$Q$ と結ばれた未確定の $S$ を調べる。$4+1=5<8$ なので $D(S)=5$、$p(S)=Q$。
4 回目.$S$ を確定する($D(S)=5$)。
確定した値は $D(P)=0$、$D(R)=2$、$D(Q)=4$、$D(S)=5$ で、ex-spp-dist (1) の距離と一致する。$S$ から直前の頂点をたどると $S\leftarrow Q\leftarrow R\leftarrow P$ で、最短の道 $P\to R\to Q\to S$ が得られる。

6 つの頂点のグラフで Dijkstra 法を動かす

頂点 $A$〜$F$ と、辺の長さ $AB=4$、$AC=2$、$BC=1$、$BD=5$、$CD=8$、$CE=10$、$DE=2$、$DF=6$、$EF=3$ のグラフ(図 2)で、$s=A$ とする。各回で確定する頂点と、その回の手順 2 を行った後の暫定値を表にする(確定した頂点の欄は、確定した値を太字にし、以後は空ける)。

回確定する頂点$A$$B$$C$$D$$E$$F$
準備なし$0$$\infty$$\infty$$\infty$$\infty$$\infty$
1$A$$\boldsymbol{0}$$4$$2$$\infty$$\infty$$\infty$
2$C$$3$$\boldsymbol{2}$$10$$12$$\infty$
3$B$$\boldsymbol{3}$$8$$12$$\infty$
4$D$$\boldsymbol{8}$$10$$14$
5$E$$\boldsymbol{10}$$13$
6$F$$\boldsymbol{13}$

表の各回の書き換えは次のとおりである。

2 回目から 5 回目の書き換えを開く

2 回目:$C$ を確定し、$B$ は $2+1=3<4$ で $3$ に、$D$ は $2+8=10$ に、$E$ は $2+10=12$ になる。

3 回目:$B$ を確定し、$D$ は $3+5=8<10$ で $8$ になる。

4 回目:$D$ を確定し、$E$ は $8+2=10<12$ で $10$ に、$F$ は $8+6=14$ になる。

5 回目:$E$ を確定し、$F$ は $10+3=13<14$ で $13$ になる。


直前の頂点は $p(C)=A$、$p(B)=C$、$p(D)=B$、$p(E)=D$、$p(F)=E$ である。$F$ からたどると $F\leftarrow E\leftarrow D\leftarrow B\leftarrow C\leftarrow A$ で、道
$$ A\xrightarrow{\ 2\ }C\xrightarrow{\ 1\ }B\xrightarrow{\ 5\ }D\xrightarrow{\ 2\ }E\xrightarrow{\ 3\ }F,\qquad \underbrace{2+1+5+2+3}_{\text{辺の長さの和}}=13 $$
が得られる。

6 つの頂点の重み付きグラフ。数字は辺の長さ 6 つの頂点の重み付きグラフ。数字は辺の長さ
Dijkstra 法で得た A からの距離と、直前の頂点をたどってできる赤い辺の木 Dijkstra 法で得た A からの距離と、直前の頂点をたどってできる赤い辺の木

図 3 の赤い辺は、各頂点 $v$ と直前の頂点 $p(v)$ を結ぶ 5 本の辺である。どの頂点からも赤い辺を $A$ までたどれて、たどった道が $A$ からの最短の道になっている(thm-spp-main (2))。5 本の辺は閉じた道をつくらない。このような辺の集まりを、$A$ を根とする 最短の道の木 という。

主定理:Dijkstra 法は正しい

Dijkstra 法の正しさ

辺の長さがすべて $0$ 以上の連結な重み付きグラフで、出発点 $s$ から Dijkstra 法(def-spp-dijkstra)を行う。
(1) 頂点 $u$ を確定したときの暫定値 $D(u)$ は、$s$ から $u$ への距離 $d(s,u)$ に等しい。
(2) $u\ne s$ なら、$u$ から直前の頂点を $u,\ p(u),\ p(p(u)),\ \dots$ とたどると有限回で $s$ に着き、その逆順の道は $s$ から $u$ への最短の道である。

証明の方針:段 1 で「暫定値は、実際にある道の長さ」であることを示す。これで $D(u)\ge d(s,u)$ が分かる。段 2 で、確定する順に帰納法を使い、確定するときには $D(u)\le d(s,u)$ であることを示す。辺の長さが $0$ 以上であることは段 2 の 1 か所で使う。

段 1(暫定値は実際の道の長さ).Dijkstra 法のどの時点でも、次の (a)(b) が成り立つことを示す。
(a) 確定した頂点の暫定値は、その後変わらない。
(b) $v\ne s$ で $D(v)<\infty$ なら、$p(v)$ は $v$ より前に確定した頂点で、$D(v)=D(p(v))+w(p(v)\,v)$ である。
(a) は、手順 2 で書き換えるのが未確定の頂点の暫定値だけであることから分かる。(b) について:$D(v)$ が $\infty$ でなくなるのは手順 2 で書き換えたときだけで、そのとき $u$ を確定したばかりで、$D(v)=D(u)+w(uv)$、$p(v)=u$ と記録する。$u$ は確定しているので、(a) より $D(u)$ はその後変わらない。$D(v)$ がさらに書き換えられれば、そのときの新しい $u$ で同じことが言える。よって (b) がいつも成り立つ。
さて、$v\ne s$ で $D(v)<\infty$ とする。(b) を $v$、$p(v)$、$p(p(v))$、… とくり返し当てる。$p(v)$ が確定したのは、$p(v)$ の暫定値が最後に書き換えられた後である。その書き換えのとき $p(p(v))$ はすでに確定していたので、$p(p(v))$ は $p(v)$ より前に確定した頂点である。このように、たどるたびに「確定した時点」が前にさかのぼる。確定した頂点は有限個なので、この列は有限回で止まる。止まるのは直前の頂点が記録されていない頂点、つまり暫定値を一度も書き換えられていない確定した頂点で、それは暫定値が $\infty$ でない頂点のうち $s$ だけである。こうして
$$ v=x_0,\quad x_1=p(x_0),\quad x_2=p(x_1),\quad \dots,\quad x_m=s $$
が得られる。(b) より $D(x_{i-1})=D(x_i)+w(x_ix_{i-1})$ なので、これを $i=1,\dots,m$ について足すと、$D(s)=0$ より
$$ D(v)=w(x_mx_{m-1})+\dots+w(x_2x_1)+w(x_1x_0) $$
である。右辺は道 $s=x_m\to x_{m-1}\to\dots\to x_0=v$ の長さである。距離は道の長さの最小値なので、
$$ D(v)\ge d(s,v)\qquad\text{(暫定値が } \infty \text{ でない頂点すべてについて)} $$
が成り立つ。$v=s$ でも $D(s)=0=d(s,s)$ である。
段 2(確定するときは距離以下).確定する順番についての帰納法で、「確定したときの暫定値は距離に等しい」ことを示す。
最初に確定するのは $s$ である(準備の直後、暫定値が $\infty$ でないのは $D(s)=0$ だけだから)。$D(s)=0=d(s,s)$ なので成り立つ。
$u\ne s$ を確定する回を考え、それより前に確定した頂点 $x$ ではすべて $D(x)=d(s,x)$ が成り立っているとする。lem-spp-simple より、$s$ から $u$ への最短の道
$$ s=u_0\to u_1\to\dots\to u_k=u $$
がある。$u_0=s$ は確定しており、$u_k=u$ はまだ確定していない。そこで、この道の上で初めて現れる未確定の頂点を $u_j$ とする($1\le j\le k$)。その 1 つ前の $u_{j-1}$ は確定している。
帰納法の仮定より $D(u_{j-1})=d(s,u_{j-1})$ である。$u_{j-1}$ を確定した回の手順 2 で、未確定だった $u_j$ を調べたので、その直後に $D(u_j)\le D(u_{j-1})+w(u_{j-1}u_j)$ となった。暫定値は手順 2 で小さくなるだけなので、今も
$$ D(u_j)\le d(s,u_{j-1})+w(u_{j-1}u_j)=d(s,u_j) $$
である。等号は lem-spp-sub による(最短の道の途中まで)。さらに、同じ補題から $d(s,u_j)$ は最短の道の $u_j$ までの部分の長さで、
$$ d(s,u)=d(s,u_j)+\underbrace{w(u_ju_{j+1})+\dots+w(u_{k-1}u_k)}_{\text{残りの辺の長さの和。}\ 0\ \text{以上}}\ \ge\ d(s,u_j) $$
である。辺の長さが $0$ 以上であることを使ったのはここである。
手順 1 で $u$ を選んだのは、$u$ の暫定値が未確定の頂点の中で最小だからで、$u_j$ も未確定なので $D(u)\le D(u_j)$ である。以上をつなぐと
$$ D(u)\le D(u_j)\le d(s,u_j)\le d(s,u) $$
となる。段 1 より $D(u)\ge d(s,u)$ なので、$D(u)=d(s,u)$ である。これで (1) が示された。
段 3((2) の証明).$u\ne s$ を確定したとき、段 2 より $D(u)=d(s,u)<\infty$ である。段 1 より、$u$ から直前の頂点をたどると有限回で $s$ に着き、その逆順の道の長さは $D(u)=d(s,u)$ である。よってこの道は最短の道である。

段 2 の $u_j$ が $u$ 自身($j=k$)のこともある。そのときは、残りの辺がなく、$d(s,u_j)=d(s,u)$ である。どちらの場合も同じ不等式の列で証明が通る。

総当たりで確かめる

ex-spp-run のグラフで、$A$ から $F$ への単純な道は $13$ 本ある。短い順に 3 本は
$$ A\to C\to B\to D\to E\to F\ (13),\qquad A\to B\to D\to E\to F\ (14),\qquad A\to C\to B\to D\to F\ (14) $$
で、最小は $13$ である。lem-spp-simple より距離は単純な道の長さの最小値なので、$d(A,F)=13$ で、ex-spp-run の確定した値と一致する。

A から F への 13 本の単純な道と長さを開く

$ACBDEF$ $13$、$ABDEF$ $14$、$ACBDF$ $14$、$ABDF$ $15$、$ACDEF$ $15$、$ACEF$ $15$、$ACDF$ $16$、$ABCDEF$ $18$、$ABCEF$ $18$、$ABCDF$ $19$、$ACEDF$ $20$、$ABCEDF$ $23$、$ABDCEF$ $30$。ほかの頂点でも、単純な道を全部書き出した最小値は $d(A,B)=3$(5 本)、$d(A,C)=2$(5 本)、$d(A,D)=8$(8 本)、$d(A,E)=10$(11 本)で、確定した値と一致する。


最短の道 $A\to C\to B\to D\to E\to F$ の途中までの道 $A\to C\to B\to D$ の長さは $2+1+5=8$ で、$d(A,D)=8$ に等しい(lem-spp-sub)。

一方通行の道路

地図に一方通行の道路があるときは、辺に向きをつける。$u$ から $v$ へだけ通れる辺を $u\to v$ と書き、長さを $w(u\to v)$ とする。向きのついた辺をもつグラフを 有向グラフ という。

一方通行でも同じことが成り立つ

有向グラフでは、道 $v_0\to v_1\to\dots\to v_k$ は、各 $i$ について辺 $v_{i-1}\to v_i$ があるものとし、距離 $d(s,v)$ は $s$ から $v$ への道の長さの最小値とする。「連結」の代わりに「$s$ からどの頂点へも道がある」と仮定する。Dijkstra 法の手順 2 では、$u$ から出る辺 $u\to v$ の先の未確定の頂点 $v$ だけを調べる。
lem-spp-simple、lem-spp-sub、lem-spp-tri(辺 $u\to v$ について $d(s,v)\le d(s,u)+w(u\to v)$)、thm-spp-main の証明は、辺 $uv$ を辺 $u\to v$ と読みかえるだけでそのまま通る。どの証明でも、道は辺の向きのとおりにたどり、道をつなぐときも向きのとおりにつないでいるからである。

例と反例

thm-spp-main の仮定と Dijkstra 法の手順のうち、どれを外すと何が崩れるかを表にする。

外す条件反例成り立たなくなること
辺の長さが $0$ 以上一方通行 $A\to B$ が $2$、$A\to C$ が $3$、$C\to B$ が $-2$(ex-spp-cx-negative)確定した値が距離に等しいこと($B$ を $2$ と確定するが、距離は $1$)
辺の長さが $0$ 以上向きのない辺で長さが負のもの $1$ 本、または一方通行で長さの和が負の閉じた道(ex-spp-cx-cycle)距離が定まること(いくらでも短い道がある)
手順 1 で暫定値が最小の頂点を確定する暫定値が最小でない頂点を先に確定する(ex-spp-cx-order)確定した値が距離に等しいこと
反例:負の長さの辺があると確定が早すぎる

一方通行の辺 $A\to B$(長さ $2$)、$A\to C$(長さ $3$)、$C\to B$(長さ $-2$)の有向グラフ(図 4)で、$s=A$ として Dijkstra 法を行う。
1 回目.$A$ を確定し、$D(B)=2$、$D(C)=3$ とする。
2 回目.未確定で最小は $D(B)=2$ なので、$B$ を確定する。$B$ から出る辺はない。
3 回目.$C$ を確定する($D(C)=3$)。$C$ から出る辺 $C\to B$ の先の $B$ はすでに確定しているので、調べない。
確定した値は $D(B)=2$ である。ところが道 $A\to C\to B$ の長さは $3+(-2)=1$ で、$d(A,B)=1<2$ である。
thm-spp-main の証明で崩れるのは段 2 の $d(s,u)\ge d(s,u_j)$ である。$B$ への最短の道 $A\to C\to B$ で初めて現れる未確定の頂点は $u_j=C$ で、$d(A,B)=d(A,C)+(-2)=1<3=d(A,C)$ となり、残りの辺の長さの和が負になる。

一方通行の 3 本の辺。赤い辺 C→B の長さが負で、A→C→B の長さ 1 が A→B の長さ 2 より短い 一方通行の 3 本の辺。赤い辺 C→B の長さが負で、A→C→B の長さ 1 が A→B の長さ 2 より短い

反例:いくらでも短い道がある
  1. 一方通行でない辺でも、長さが負なら困る。ex-spp-start の地図で、辺 $PR$ の長さだけを $-1$ に変える。道 $P\to R\to P\to R$ の長さは $-3$、$P\to R\to P\to R\to P\to R$ の長さは $-5$ で、$P$ と $R$ の間を 1 往復するたびに長さが $2$ ずつ減る。$P$ から $R$ への道の長さには最小値がなく、$d(P,R)$ は定まらない。lem-spp-simple の段 1 で、除いた回り道 $R\to P\to R$ の長さが $-2<0$ となり、回り道を除くと長くなってしまう。
  2. 一方通行の辺 $A\to B$(長さ $1$)、$B\to C$(長さ $1$)、$C\to B$(長さ $-3$)の有向グラフでは、閉じた道 $B\to C\to B$ の長さが $1+(-3)=-2$ である。$A\to B$ の後にこの閉じた道を $m$ 回まわると、長さは $1-2m$ で、いくらでも小さくなる。$d(A,B)$ も $d(A,C)$ も定まらない。
反例:最小でない頂点を先に確定する

ex-spp-run4 の 2 回目で、未確定の暫定値は $D(Q)=5$、$D(R)=2$、$D(S)=\infty$ だった。ここで最小の $R$ ではなく、「$P$ から直接行ける頂点」という理由で $Q$ を先に確定すると、$Q$ の値は $5$ で確定してしまう。実際の距離は $d(P,Q)=4$(道 $P\to R\to Q$)である。$R$ を確定した後で $R\to Q$ の辺を調べても、$Q$ はもう確定しているので書き換えられない。

3 つの「最短」の違い

最短の道に関係する問題を、同じ観点で並べる。

最短の道の本数最短の道の長さ(この記事)最小全域木
求めるもの最短の道が何本あるか1 つの頂点から各頂点への距離すべての頂点を結ぶ木の辺の長さの合計の最小
辺の長さすべて同じ(格子の 1 目盛り)$0$ 以上でさまざまさまざま
主な道具二項係数・鏡像原理Dijkstra 法短い辺から選ぶ方法
記事最短経路の数え上げと鏡像原理この記事Steiner木
最短の道の木と最小全域木は違う

3 頂点 $A$、$B$、$C$ で、辺の長さが $AB=2$、$AC=2$、$BC=1$ のグラフを考える。
$A$ を出発点とする最短の道の木は、辺 $AB$ と $AC$ で、$d(A,B)=d(A,C)=2$ である(図 5)。辺の長さの合計は $2+2=4$ である。
3 頂点を結ぶ木は 2 本の辺からなり、選び方は $\{AB,AC\}$(合計 $4$)、$\{AB,BC\}$(合計 $3$)、$\{AC,BC\}$(合計 $3$)の 3 通りである。長さの合計が最小の木(最小全域木)の 1 つは $\{AB,BC\}$ で、合計は $3$ である(図 6)。この木の上で $A$ から $C$ へ行くと $A\to B\to C$ の長さ $3$ で、距離 $d(A,C)=2$ より長い。

A を出発点とする最短の道の木。赤い 2 本の辺の合計は 4 A を出発点とする最短の道の木。赤い 2 本の辺の合計は 4
長さの合計が最小の木の 1 つ。赤い 2 本の辺の合計は 3 長さの合計が最小の木の 1 つ。赤い 2 本の辺の合計は 3

1 つの頂点からの距離を短くすることと、道路網全体の長さを短くすることは、別の目標である。

大学数学で見る

手間を数える

総当たりと Dijkstra 法の手間

どの 2 頂点も辺で結ばれた $n$ 頂点のグラフで、$s$ から $t$ への単純な道を数える。途中に通る頂点が $k$ 個の道は、残りの $n-2$ 個の頂点から $k$ 個を選んで並べる数だけあるので
$$ \sum_{k=0}^{n-2}\frac{(n-2)!}{(n-2-k)!} $$
本ある。$n=4$ で $1+2+2=5$ 本、$n=6$ で $1+4+12+24+24=65$ 本、$n=10$ で $109601$ 本、$n=20$ では約 $1.7\times10^{16}$ 本になる。
Dijkstra 法は、1 回ごとに未確定の頂点($n$ 個以下)から最小のものを探し、$u$ と結ばれた頂点($n-1$ 個以下)を調べる。1 回の比較・計算はおよそ $2n$ 回以下で、$n$ 回くり返すので、全体でおよそ $2n^2$ 回以下である。$n=20$ なら $800$ 回ほどで済む。KT17 の節 4.3 も、辺の長さが $0$ 以上の $n$ 頂点の有向グラフで、最短の道を $n^2$ に比例する手間で求められることを述べている。

距離は不等式の組の最大の解

lem-spp-tri は、関数 $v\mapsto d(s,v)$ が、どの辺でも「$1$ 本の辺で進むと、値の増え方は辺の長さ以下」という不等式を満たすことを言っている。逆に、この不等式を満たす関数の中で、距離がいちばん大きい。

距離は不等式を満たす最大の関数

辺の長さが $0$ 以上の連結な重み付きグラフで、各頂点 $v$ に実数 $q(v)$ を対応させる。$q(s)=0$ で、どの辺 $uv$ についても
$$ q(v)\le q(u)+w(uv),\qquad q(u)\le q(v)+w(uv) $$
が成り立つなら、どの頂点 $v$ についても $q(v)\le d(s,v)$ である。関数 $q(v)=d(s,v)$ 自身はこの条件を満たす。

要点:最短の道に沿って不等式を足し合わせると、途中の項が打ち消し合う。

詳しい証明を開く

$s$ から $v$ への最短の道 $s=u_0\to u_1\to\dots\to u_k=v$ をとる(lem-spp-simple)。各 $i$ について、仮定の不等式から $q(u_i)-q(u_{i-1})\le w(u_{i-1}u_i)$ である。これを $i=1,\dots,k$ について足すと、左辺は途中の項が打ち消し合って $$q(u_k)-q(u_0)\le w(u_0u_1)+\dots+w(u_{k-1}u_k)=d(s,v)$$ となる。$q(u_0)=q(s)=0$ なので $q(v)\le d(s,v)$ である。

$q(v)=d(s,v)$ とすると、$q(s)=d(s,s)=0$ で、2 つの不等式はどちらも lem-spp-tri(辺 $uv$ と辺 $vu$ に当てたもの)である。

prop-spp-potential から、$d(s,t)$ は「$q(s)=0$ と、各辺の 2 つの 1 次不等式のもとで、$q(t)$ を最大にせよ」という問題の最大値である。1 次不等式のもとで 1 次式を最大・最小にする問題を線形計画法の問題といい、高校では 2 変数の場合を 不等式の表す領域と線形計画法 で扱う。最短の道の問題は、変数が頂点の数だけある線形計画法の問題でもある。

6 つの頂点のグラフで不等式を確かめる

ex-spp-run の距離 $q(A)=0$、$q(B)=3$、$q(C)=2$、$q(D)=8$、$q(E)=10$、$q(F)=13$ は、9 本の辺のすべてで不等式を満たし、等号になる辺は図 3 の最短の道の木の辺である。

辺ごとの確認を開く

たとえば辺 $CD$(長さ $8$)では $8\le2+8$、辺 $CE$(長さ $10$)では $10\le2+10$ である。等号になるのは辺 $AC$($2=0+2$)、$CB$($3=2+1$)、$BD$($8=3+5$)、$DE$($10=8+2$)、$EF$($13=10+3$)の 5 本で、図 3 の最短の道の木の辺と一致する。

負の長さの辺

一方通行の辺だけの有向グラフ(rem-spp-directed)では、長さが負の辺があっても、長さの和が負の閉じた道がなければ距離は定まり、「確定」をしない別の方法で求められる。

負の辺があるときの距離と求め方を開く

長さの和が負の閉じた道がなければ、lem-spp-simple の段 1 で除く回り道の長さは $0$ 以上なので、距離は単純な道の長さの最小値として定まる。このときは、すべての辺 $u\to v$ について「$D(u)+w(u\to v)< D(v)$ なら書き換える」操作を、頂点の数より $1$ 少ない回数だけくり返す方法(Bellman–Ford 法とよばれる)で距離が求まる。この記事では証明しない。Dijkstra 法のように「確定」をしないので、ex-spp-cx-negative のような確定の早すぎは起こらない。

演習

Dijkstra 法を動かす

頂点 $S$、$U$、$V$、$X$、$Y$、$T$ と、辺の長さ $SU=3$、$SV=1$、$UV=1$、$UX=2$、$VX=5$、$VY=6$、$XY=1$、$XT=5$、$YT=2$ のグラフで、$S$ から各頂点への距離と、$S$ から $T$ への最短の道を Dijkstra 法で求めよ。

解答を開く

確定する順は $S\ (0)$、$V\ (1)$、$U\ (2)$、$X\ (4)$、$Y\ (5)$、$T\ (7)$ である。途中の書き換え:$S$ の確定で $D(U)=3$、$D(V)=1$。$V$ の確定で $D(U)=\min(3,1+1)=2$、$D(X)=6$、$D(Y)=7$。$U$ の確定で $D(X)=\min(6,2+2)=4$。$X$ の確定で $D(Y)=\min(7,4+1)=5$、$D(T)=9$。$Y$ の確定で $D(T)=\min(9,5+2)=7$。直前の頂点をたどると $T\leftarrow Y\leftarrow X\leftarrow U\leftarrow V\leftarrow S$ で、最短の道は $S\to V\to U\to X\to Y\to T$(長さ $1+1+2+1+2=7$)である。

等号のときの確定

ex-spp-start の地図で、辺 $PR$ の長さだけを $5$ に変える。$s=P$ として Dijkstra 法を行うと、2 回目に暫定値が最小の頂点が 2 つ現れることを確かめよ。また、どちらを先に確定しても、確定した値が同じ(距離)になることを確かめよ。

解答を開く

1 回目に $P$ を確定し、$D(Q)=5$、$D(R)=5$ となる。2 回目の未確定は $Q\ (5)$、$R\ (5)$、$S\ (\infty)$ で、最小の頂点が 2 つある。

$R$ を先に確定する場合:$D(Q)=\min(5,5+2)=5$、$D(S)=5+6=11$。3 回目に $Q$ を確定し、$D(S)=\min(11,5+1)=6$。4 回目に $S$ を確定する。

$Q$ を先に確定する場合:$D(R)=\min(5,5+2)=5$、$D(S)=5+1=6$。3 回目に $R$ を確定し、$D(S)=\min(6,5+6)=6$。4 回目に $S$ を確定する。

どちらでも $D(Q)=5$、$D(R)=5$、$D(S)=6$ である。単純な道を書き出すと、$P$ から $Q$ へは $5$(直接)と $7$($R$ 経由)と $12$($S$ 経由)、$R$ へは $5$ と $7$ と $12$、$S$ へは $6$、$8$、$11$、$13$ で、最小値 $5$、$5$、$6$ と一致する。

さらに先へ

関連項目

参考文献

Mathpediaは寄付と、参考文献の書籍リンク(Amazonアソシエイト)の紹介料で運営されています。 支援について / 寄付する