AECBFD

コンピュータ発展(井川)
3.
−3. 1 −
最短路の問題
グ ラ フ の 最 短 路 問 題 ( s h o r t e s t p a t h p r o b l e m ) と は , グ ラ フ の 2 頂 点 間 を 結 ぶ 道 (path )
の う ち で 辺 の 重 み の 総 和 が 最 小 の も の を 求 め る 問 題 で あ る .交 通 網 の 問 題 等 は そ の 1 例 で
ある.
この問題で対象とするのは,基本的には辺に重みのついた有向グラフである.重みは 0
以上の整数または実数値とする.重みとは,交通網の問題のように 2 点間の移動に要する
時間や費用を意味すると考えればわかりやすい.交通網の問題では無向グラフを使うのが
自然である.どちらも解き方の基本は同じである.
さらにこの問題は,出発点と終点の組合せとして何を取るかで,いくつかの種類に分か
れる.代表的なものは次の 2 種類である.
(1) 出 発 点 を 1 つ 固 定 し て , そ こ か ら 他 の す べ て の 頂 点 へ の 最 短 路 を 求 め る 問 題
(2) す べ て の 2 頂 点 の 組 合 せ に 対 し て , 最 短 路 を 求 め る 問 題
実用面では他の問題設定も考えられるが,それらの問題はほぼ,この 2 つのどちらかに
帰着して解くことができる.
こ こ で は ま た , 道 を 構 成 す る 各 辺 の 重 み を 加 え 合 わ せ た も の を そ の 道 の 長 さ ( length ) と
呼ぶことにする.
3.1
単一出発点の問題
出発点を 1 つ固定して,この頂点から他のすべての頂点への最短路を求める.出発点か
らはすべての頂点へ到達可能だと仮定する.
こ の 問 題 に は ,D i j k s t r a の ア ル ゴ リ ズ ム (D i j k s t r a ’s algor i th m) と よ ぶ 効 率 の 良 い ア ル ゴ
リ ズ ム が 知 ら れ て い る .そ の 基 本 的 な 戦 略 は ,各 頂 点 へ の 最 短 路 を 出 発 点 に 近 い ( 最 短 路 の
長 さ が 等 し い)と こ ろ か ら 1 つ ず つ 確 定 し て い く こ と で あ る .
図 5 − 1 に 重 み 付 き グ ラ フ 例 を 示 す .数 字 は 辺 の 重 み を 表 す .出 発 点 は A で あ る .図 5
−2 は 各 頂 点 ま で の 最 短 路 を 確 定 す る 順 序 を 示 し て い る . 塗 り つ ぶ し の つ い て い る 頂 点 が
最短路確定である.頂点の中の数は,その時点までにわかっているその頂点への最短の道
の長さを表す.各ステップでは,この値が最小の頂点を選んで,最短路を確定している.
頂点 D の値が 3 番目と 4 番目の間で変わっている点に注意が必要である.
3
B
6
D
2
A
1
4
E
3
C
6
F
図 5 −1
−3. 2 −
コンピュータ発展(井川)
――――――――――――――――――――――――――>>>
6
9
6
7
7
4
10
10
8
10
10
図5−1
【 演 習 1 】下 図 6 の 無 向 グ ラ フ に つ い て D i j k s t r a の ア ル ゴ リ ズ ム を 実 施 し て 最 短 路 を 求 め
るプログラムを作成しなさい.
e
2
1
a
b
f
4
6
h
2
7
2
1
c
3
2
d
5
図6
g
コンピュータ発展(井川)
プ ロ グ ラ ム 例 を 次 に 示 す :【 演 習 1 ( l i s t c 3- s06 .c )】
/* - *- m o d e : c ; m o d e : f o n t-l o c k ; f i l e- coding- s y s t e m : e u c -j a p a n -* - * /
/*
フ ァ イ ル 名 : listc3- s 0 6 . c
内 容 : 単 一 出 発 点 か ら グ ラ フ 上 の 各 点 へ の 最 短 路 問 題 (Dijkstra's
a l g o r i t h m)
作成者 学籍番号:
氏名:
日 付 :2 0 0 3 . 1 0 . 2 4
*/
#include <stdio.h>
/* 節 の 数 * /
#define N 8
#define M 9999
/* 隣 接 行 列 * /
int a[N][N]={ {0,1,7,2,M,M,M,M},
{1,0,M,M,2,4,M,M},
{7,M,0,M,M,2,3,M},
{2,M,M,0,M,M,5,M},
{M,2,M,M,0,1,M,M},
{M,4,2,M,1,0,M,6},
{M,M,3,5,M,M,0,2},
{M,M,M,M,M,6,2,0}};
int main(void)
{
int j,k,p,start,min,
leng[N],
/ * 節 点 ま で の 距 離 */
v[N];
/ * 確 定 フ ラ グ */
p r i n t f ( "始 点 = " ) ; s c a n f ( " % d " , & s t a r t ) ;
for (k = 0 ; k < N ; k++){
leng[k]= M ; v[k] = 0;
}
用語の定義:
leng[start]=0;
o r文( 献
j =10】; 石
j <
; j +『
+ )ア
{ ル ゴ リ ズ ム と デ ー タ 構 造 』, 岩 波 書 店 , 1 9 9 6 .
【 引 f用
畑N
清著
min = M;
/ * 最 小 の 節 点 を 捜 す */
【 引 用 文 献f o2
r】
( k杉= 原
0 ;厚k吉< ほ
Nか; 編
k +『
+ )ア
{ ルゴリズム工
i f共( v
=0
ng[k] < min){
立[ k出] =版
,&
2 0&0 1l e.
p=k; min=leng[k];
}
}
v[p]=1;
/* 最小の節点を確定する */
if (min==M){
p r i n t f ( "グ ラ フ は 連 結 で な い ¥n " ) ;
return 1;
}
/* pを経由してkに至る長さがそれまでの最短路より小さければ更新 */
for (k = 0 ; k < N ; k++){
if((leng[p]+a[p][k]) < leng[k])
leng[k] = leng[p] + a[p][k];
}
プ ロ グ} ラ ム 例 を 次 に 示 す :【 演 習 1 ( l i s t c 3- s02.c )】 す べ て の 節 が 始 点 の 場 合
for (j = 0 ;j < N ;j++)
p r i n t f ( " % d - > % d : % d¥n " , s t a r t , j , l e n g [ j ] ) ;
【】
}
return (0);
−3. 3 −
コンピュータ発展(井川)
−3. 4 −
(以下のプログラムは,各自で作成してみよう)
【演習2】演習1のプログラムで,最短経路の表示を加えたプログラムを作成しなさい.
(l istc3- s 0 7 . c)
【 演 習 3 】 深 さ 優 先 探 索 の 応 用 : ト ポ ロ ジ カ ル ソ ー ト (l istc3- s08. c)
半 順 序 関 係 が 与 え ら れ た 有 向 グ ラ フ に お い て ,1 番 最 初 に 訪 問 す る 頂 点 か ら 最 後 に 訪 問
す る 頂 点 ま で を 1 列 に 並 べ る ( こ れ を , ト ポ ロ ジ カ ル ソ ー ト と い う) プ ロ グ ラ ム を 作 成 し
な さ い . こ こ で , 半 順 序 関 係 ( p a r t i a l o r d e r) と は , ど ち ら を 先 に 先 行 し て も 良 い よ う な 必
ずしも順序を比較できない場合を含む順序関係をいう.
( 例 ) PERT 問 題
1
5
0
3
4
2
7
6
図 7
【 引 用 文 献 1 】 石 畑 清 著 『 ア ル ゴ リ ズ ム と デ ー タ 構 造 』, 岩 波 書 店 , 1 9 9 6 .
【 引 用 文 献 2 】 杉 原 厚 吉 ほ か 編 『 ア ル ゴ リ ズ ム 工 学 ― 計 算 困 難 問 題 へ の 挑 戦 ― 』,
共 立 出 版 , 2001 .