グラフアルゎリズムその1
2017-11-07
宮川 拓
 グラフアルゎリズムを勉匷しよう
 背景
 機械孊習の郚分問題ずしお出おきがち
 ex.物䜓怜出, 圢態玠解析, ...
 最短経路問題が倚そう
抂芁
2/57
参考文献
 コルメン他
『アルゎリズム・むントロダクショ
ン』第3版2013, 近代科孊瀟
3/57
アゞェンダ
 グラフに関する甚語ず抂念
 グラフの探玢
 トポロゞカル゜ヌト
 単䞀始点最短経路問題次回
4/57
グラフに関する甚語ず抂念
5/57
グラフの構成
 グラフ:=
 頂点 (vertex) ず、
頂点同士を぀なぐ蟺 (edge) 、
からなるデヌタ構造
6/57
グラフの構成
 グラフG=(V, E)
 ただしV={v0, v1, ... v5},
E={e0, e1, ... e5}
v0 v1
v2
v5
v3 v4
e0
e1
e2
e3
e4
e5
e6
7/57
有向グラフず無向グラフ
有向グラフ
無向グラフ
8/57
有向グラフず無向グラフ
 無向グラフは有向グラフの特殊な堎合
ずみなすこずもできる
 ぀たり、(v0, v1)がG.Eの元であるずき、
必ず(v1, v0)もG.Eの元であるような有
向グラフ、ず考えれば良い
9/57
道 (path)
 列‹v0, v1, ... vk›に぀いお、
すべおの(v[i], v[i+1])がG.Eの元で
あれば、頂点v0からvkぞの道
pathず呌ぶ
10/57
閉路 (cycle)
 最初の芁玠ず最埌の芁玠が同じ頂点で
あるような道を閉路cycleず呌ぶ
11/57
有向非埪環グラフ (DAG)
 閉路のない有向グラフを有向非埪環グ
ラフ (Directed Acyclic Graph)ず
呌ぶ
 朚はDAGの特殊な堎合ずみなせる
 ただひず぀の頂点根から他のすべお
の頂点ぞ道がたどれるこず
 根以倖の頂点ぞの根からの道はひず぀だ
けであるこず
12/57
プログラム䞊のグラフの衚珟
 隣接リスト
0 1
2
5
3 4
0 → {2, 3}
1 → {1}
2 → {1, 3, 4}
3 → {}
4 → {2}
5 → {}
省メモリだけど転眮グラフが䜜りづらい
13/57
プログラム䞊のグラフの衚珟
 隣接行列
0 1
2
5
3 4
0 0 1 1 0 0
0 1 0 0 0 0
0 1 0 1 1 0
0 0 0 0 0 0
0 0 1 0 0 0
0 0 0 0 0 0
メモリ食いだけど転眮グラフが䜜りやすい
14/57
グラフの探玢
15/57
グラフの探玢
 幅優先探玢
 コヌド
 蟺の重みがすべお等しいずきの、
最短経路問題の解法ずかんがえられる
 深さ優先探玢
 コヌド
 トポロゞカル゜ヌトなどの解法の䞀郚ず
しお䜿われる
16/57
グラフの探玢
 幅優先探玢
a b
c
f
d e
Queue = ‹a›
0 ∞
∞
∞ ∞
∞
17/57
グラフの探玢
 幅優先探玢
a b
c
f
d e
Queue = ‹c, d›
0 ∞
1
1 ∞
∞
18/57
グラフの探玢
 幅優先探玢
a b
c
f
d e
Queue = ‹d, b, e›
0 2
1
1 2
∞
19/57
グラフの探玢
 幅優先探玢
a b
c
f
d e
Queue = ‹b, e›
0 2
1
1 2
∞
20/57
グラフの探玢
 幅優先探玢
a b
c
f
d e
Queue = ‹e›
0 2
1
1 2
∞
21/57
グラフの探玢
 幅優先探玢
a b
c
f
d e
Queue = ‹›
0 2
1
1 2
∞
22/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
たずはaの探玢を開始
23/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
aが指しおいる先であるcの探玢を開始
24/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
cが指しおいる先であるbの探玢を開始
25/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
bが指しおいる先b自身はすでに探玢枈み
したがっおbは探玢終了
26/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
27/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
28/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
29/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
30/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
cが指しおいる先に未探玢の頂点はない
したがっおcは探玢終了
31/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
aも探玢終了
32/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
倚くの堎合深さ優先探玢では党頂点をなめる
トポロゞカル゜ヌト等での䜿いやすさのため
33/57
グラフの探玢
 深さ優先探玢
a b
c
f
d e
34/57
トポロゞカル゜ヌト
35/57
トポロゞカル゜ヌト
 トポロゞカル゜ヌト:
 DAGの頂点を、前埌関係を保っお䞀列
に䞊べるこず
36/57
トポロゞカル゜ヌト
 ある日の家事のDAG
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
37/57
トポロゞカル゜ヌト
ア サ リ の 砂 抜 き
ア ン チ ョ ビ す り ぀ ぶ す
ニ ン ニ ク み じ ん 切 り
ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る
ア ン チ ョ ビ ぀ た み 食 い
掗 濯 物 を 取 り 入 れ る
癜 身 魚 ず ア サ リ ず ト マ ト を 投 入
蓋 を し お è’ž す
ア ã‚€ ロ ン 掛 け る
 手順の䟋
38/57
トポロゞカル゜ヌト
 アルゎリズム
 党頂点を深さ優先探玢する
 探玢が終わった頂点から順番に、
結果列の先頭に远加する
 コヌド
39/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ∅
40/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ∅
41/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ∅
42/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : 蓋 を し お è’ž す
43/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
44/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
45/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ ぀ た み 食 い → 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
46/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ ぀ た み 食 い
→ 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
47/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ ぀ た み 食 い
→ 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
48/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ ぀ た み 食 い
→ 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
49/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア ã‚€ ロ ン 掛 け る → ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ ぀ た み 食 い → 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
50/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : 掗 濯 物 取 り 入 れ る → ア ã‚€ ロ ン 掛 け る → ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ ぀ た み 食 い → 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
51/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : 掗 濯 物 取 り 入 れ る → ア ã‚€ ロ ン 掛 け る → ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ ぀ た み 食 い → 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
52/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア サ リ の 砂 抜 き → 掗 濯 物 取 り 入 れ る → ア ã‚€ ロ ン 掛 け る
→ ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ ぀ た み 食 い
→ 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
53/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア サ リ の 砂 抜 き → 掗 濯 物 取 り 入 れ る → ア ã‚€ ロ ン 掛 け る
→ ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ ぀ た み 食 い
→ 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
54/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ す り ぀ ぶ す → ア サ リ の 砂 抜 き → 掗 濯 物 取 り 入 れ る
→ ア ã‚€ ロ ン 掛 け る → ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ ぀ た み 食 い
→ 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
55/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ア ン チ ョ ビ す り ぀ ぶ す → ア サ リ の 砂 抜 き → 掗 濯 物 取 り 入 れ る
→ ア ã‚€ ロ ン 掛 け る → ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る → ア ン チ ョ ビ ぀ た み 食 い
→ 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
56/57
トポロゞカル゜ヌト
ア サ リ の
砂 抜 き
ア ン チ ョ ビ
す り ぀ ぶ す
ニ ン ニ ク
み じ ん 切 り
ア ン チ ョ ビ ず
ニ ン ニ ク を 炒 め る
蓋 を し お
è’ž す
癜 身 魚 ず ア サ リ ず
ト マ ト を 投 入
ア ン チ ョ ビ
぀ た み 食 い
掗 濯 物
取 り 入 れ る
ア ã‚€ ロ ン
掛 け る
結 果 : ニ ン ニ ク み じ ん 切 り → ア ン チ ョ ビ す り ぀ ぶ す → ア サ リ の 砂 抜 き
→ 掗 濯 物 取 り 入 れ る → ア ã‚€ ロ ン 掛 け る → ア ン チ ョ ビ ず ニ ン ニ ク を 炒 め る
→ ア ン チ ョ ビ ぀ た み 食 い → 癜 身 魚 ず ア サ リ ず ト マ ト を 投 入 → 蓋 を し お è’ž す
57/57

Graph Algorithms Part 1