重み付きグラフの最短経路(shortest paths in weighted graphs)とは、辺に長さのついたグラフで、1 つの頂点 $s$ から各頂点への道の長さの最小値(距離)と、その長さの道を求める問題である。辺の長さがすべて $0$ 以上の連結なグラフでは、Dijkstra 法(まだ確定していない頂点のうち暫定値が最小のものを確定し、その頂点から出る辺で暫定値を小さく書き換えることをくり返す方法)で確定した値は距離に等しく、直前の頂点をたどると最短の道が得られる。証明は、最短の道の途中までも最短であることと、確定する順についての帰納法による。長さが負の辺があると、確定した値が距離より大きくなることや、いくらでも短い道があって距離が定まらないことがある。
前提知識: 一筆書きとグラフ, 数学的帰納法と整列性
4 つの町 $P$、$Q$、$R$、$S$ が道路で結ばれていて、道路の長さ(km)が分かっているとする。$P$ から $S$ へ行くいちばん短い道はどれだろうか。
町を頂点、道路を辺とし、辺に長さを書きこむと、一筆書きとグラフ で使ったグラフの図になる(図 1)。辺の長さは、道路の長さでも、かかる時間でも、運賃でもよい。
道路は $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 つなら道を全部書き出せる。しかし町が増えると、道の数は急に増える。どの 2 つの町も道路で結ばれた 6 つの町では、ある町から別の町への、同じ町を 2 度通らない道は $65$ 本ある(rem-spp-cost)。この記事で答える問いは次の 3 つである。
| 高校の計算 | この記事の言葉 | 大学の言葉 |
|---|---|---|
| 地図に道路の長さを書きこむ | 重み付きグラフ | 辺に重みのついたグラフ |
| いちばん短い道の長さ | 距離 $d(s,v)$ | 最短路の長さ |
| 近い町から順に長さを決めていく | Dijkstra 法 | 貪欲法の一種 |
| 「途中までもいちばん短い」 | 最短の道の部分も最短 | 最適性の原理 |
有限個の頂点と、異なる 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)。
辺の長さがすべて $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$ 以上であることを使っていない。
辺 $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$ で、等号である。
ex-spp-start で、$P$ から $R$ への距離が $2$ だとすぐ分かったのは、次の理由による。$P$ からどこへ行くにも、最初に $P$ から出る道路を 1 本通る。その長さは $5$ か $2$ で、どちらも $2$ 以上である。その後に長さ $0$ 以上の道路を何本足しても、$2$ より短くはならない。この考えをくり返すと、近い頂点から順に距離を決めていける。
辺の長さがすべて $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$ 回で終わる。
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$ が得られる。
頂点 $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 回目:$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$ になる。
6 つの頂点の重み付きグラフ。数字は辺の長さ
Dijkstra 法で得た A からの距離と、直前の頂点をたどってできる赤い辺の木
図 3 の赤い辺は、各頂点 $v$ と直前の頂点 $p(v)$ を結ぶ 5 本の辺である。どの頂点からも赤い辺を $A$ までたどれて、たどった道が $A$ からの最短の道になっている(thm-spp-main (2))。5 本の辺は閉じた道をつくらない。このような辺の集まりを、$A$ を根とする 最短の道の木 という。
辺の長さがすべて $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 の確定した値と一致する。
$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 本)で、確定した値と一致する。
地図に一方通行の道路があるときは、辺に向きをつける。$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 より短い
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$ はもう確定しているので書き換えられない。
最短の道に関係する問題を、同じ観点で並べる。
| 最短の道の本数 | 最短の道の長さ(この記事) | 最小全域木 | |
|---|---|---|---|
| 求めるもの | 最短の道が何本あるか | 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
長さの合計が最小の木の 1 つ。赤い 2 本の辺の合計は 3
1 つの頂点からの距離を短くすることと、道路網全体の長さを短くすることは、別の目標である。
どの 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 変数の場合を 不等式の表す領域と線形計画法 で扱う。最短の道の問題は、変数が頂点の数だけある線形計画法の問題でもある。
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 のような確定の早すぎは起こらない。
頂点 $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アソシエイト)の紹介料で運営されています。 支援について / 寄付する