講義「アルゴリズムとデータ構造」
第13回 グラフとネットワークのアルゴリズム(2)
大学院情報科学研究院 情報理工学部門 情報知識ネットワーク研究室
喜田拓也
2019/5/21 講義資料
今日の内容
グラフとは (おさらい)
グラフ 𝐺𝐺 に対する全域木について 全域木(スパニング木)
最小全域木(最小スパニング木)
最小全域木を求めるアルゴリズムについて クラスカルのアルゴリズム
クラスカルのアルゴリズムの高速化
クラスカルのアルゴリズムが正しいことの証明
時間計算量が O 𝑚𝑚 log 𝑛𝑛 であることの証明
無向グラフ 有向グラフ
グラフとは (おさらい)
頂点 (vertex) の集合 𝑉𝑉 と辺 (edge) の集合 𝐸𝐸 ⊆ 𝑉𝑉 × 𝑉𝑉 の組 (𝑉𝑉, 𝐸𝐸) 𝑣𝑣 0
𝑣𝑣 1
𝑣𝑣 2 𝑣𝑣 3
𝑣𝑣 4 𝑒𝑒 0
𝑒𝑒 1 𝑒𝑒 2 𝑒𝑒 3
𝑒𝑒 4
𝑒𝑒 5 𝑣𝑣 0
𝑣𝑣 1
𝑣𝑣 2 𝑣𝑣 3
𝑣𝑣 4 𝑒𝑒 0
𝑒𝑒 1 𝑒𝑒 2 𝑒𝑒 3
𝑒𝑒 4 𝑒𝑒 5
𝑣𝑣 0 𝑣𝑣 1
𝑣𝑣 2 𝑣𝑣 3
𝑣𝑣 4 2
3 4
2
1
2 𝑣𝑣 0
𝑣𝑣 1
𝑣𝑣 2 𝑣𝑣 3
𝑣𝑣 4 2
3 4
2
1
2
無向ネットワーク 有向ネットワーク
𝑣𝑣
0𝑣𝑣
1𝑣𝑣
2𝑣𝑣
3𝑣𝑣
4※ 無向グラフの場合は,各辺を両方向の2辺からなる有向グラフとみなして表現する
グラフの表現のしかた (おさらい)
𝑣𝑣 0 𝑣𝑣 1
𝑣𝑣 2 𝑣𝑣 3
𝑣𝑣 4 𝑒𝑒 0
𝑒𝑒 1 𝑒𝑒 2 𝑒𝑒 3
𝑒𝑒 4 𝑒𝑒 5
𝑣𝑣 0 𝑣𝑣 1
𝑣𝑣 2 𝑣𝑣 3
𝑣𝑣 4 2
3 4
2
1 2
0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 0
𝑣𝑣
0𝑣𝑣
1𝑣𝑣
2𝑣𝑣
3𝑣𝑣
4𝑣𝑣
0𝑣𝑣
1𝑣𝑣
2𝑣𝑣
3𝑣𝑣
40 2 4 0 0 0 0 3 0 0 0 0 0 2 0 0 0 0 0 1 2 0 0 0 0
𝑣𝑣
0𝑣𝑣
1𝑣𝑣
2𝑣𝑣
3𝑣𝑣
4隣接行列
0 1 2 3 4
2
NULL1
2
NULL3
NULL4
NULL0
NULL0 1 2 3 4
2 3
NULL3 2
NULL4 1
NULL0 2
NULL1 2 2 4
NULL隣接リスト
グラフ 𝐺𝐺 に対する全域木 (spanning tree)
深さ優先の全域木 幅優先の全域木
定義:
「グラフ 𝐺𝐺𝐺 はグラフ 𝐺𝐺 = (𝑉𝑉, 𝐸𝐸) の全域木(スパニング木)である」
⇕
「 𝐺𝐺𝐺 は 𝐺𝐺 のすべての頂点を含む部分グラフで木になっているもの」
【路 (path) 】 辺でつながった頂点の列
【閉路 (cycle) 】 自分に戻ってくるような路(長さは 3 頂点以上)
グラフ 𝐺𝐺 が連結 ⇔ 𝐺𝐺 の任意の頂点対が路でつながっている グラフ 𝐺𝐺 が木 ⇔ 𝐺𝐺 は閉路のない連結グラフ
𝑣𝑣 0 𝑣𝑣 1
𝑣𝑣 2
𝑣𝑣 3 𝑣𝑣 4 𝑣𝑣 5 𝑣𝑣 6
𝑣𝑣 7
𝑣𝑣 0 𝑣𝑣 1
𝑣𝑣 2
𝑣𝑣 3 𝑣𝑣 4 𝑣𝑣 5 𝑣𝑣 6
𝑣𝑣 7
ネットワーク 𝐺𝐺 の最小全域木 (minimum spanning tree)
定義:
グラフ 𝐺𝐺𝐺 はネットワーク(重み付きグラフ) 𝐺𝐺 = (𝑉𝑉, 𝐸𝐸) の 最小全域木(最小スパニング木)である
𝐺𝐺𝐺 は 𝐺𝐺 の全域木で含まれる辺の重みの総和が最小のもの ⇕
𝐺𝐺 の最小スパニング木
3 4
2 5 1
2 7
ネットワーク 𝐺𝐺
4 2 1
2
応用例として,通信網の設計,ガス・水道の配管設計などがある
最小全域木を求めるアルゴリズム
• プリム (Prim) のアルゴリズム
1930 年に Vojtěch Jarník (ヤルニーク)が開発.
それとは独立に 1957 年に Prim により開発された.
また, 1959 年には Dijkstra により再発見された.
DJP 法, Jarník 法, Jarník-Prim 法とも呼ばれる.
最小全域木が構成されている連結成分の範囲 を徐々に広げていくという方針で求める.
Joseph B. Kruskal 1928-2010 , USA
Robert Clay Prim (1921-?), USA
最小全域木 (MST) を求める代表的なアルゴリズム
• クラスカル (Kruskal) のアルゴリズム
1956 年に Joseph Kruskal (ジョセフ・クラスカル)に よって提案された.重みが小さい辺から選択し,
現在の解に追加していくという方針で求める.
[考え方] 解候補 𝑇𝑇 を空集合から始めて,重みが小さい辺から選 択し,現在の解候補 𝑇𝑇 に加えていく.ただし,選択することにより閉 路ができる場合は選択しない.
クラスカルのアルゴリズム
クラスカルのアルゴリズムの解候補 𝑇𝑇 がもつ性質
• 𝑇𝑇 は閉路を含まない
• 𝑇𝑇 は,森になっている(必ずしも連結しているとは限らない)
※ グラフ 𝐺𝐺 が森 ⇔ 𝐺𝐺 は閉路のないグラフ
3 4
2 5 1
2 7
3 4
2 5 1
2 7
3 4
2 5 1
2 7
3 4
2 5 1
2 7
3 4
2 5 1
2 7 閉路ができる!
クラスカルのアルゴリズム(疑似コード)
Procedure MST-Kruskal( 𝐺𝐺 : グラフ , 𝑤𝑤 : 重み ) 1: 𝑇𝑇 ← φ; // 解 𝑇𝑇 は最初は空
2: 辺の配列 𝑒𝑒 を重みの小さい順 𝑒𝑒 0 , … , 𝑒𝑒[𝑚𝑚 − 1] に整列する ; 3: for 𝑖𝑖 ← 0, 1, … , 𝑚𝑚 − 1 do
4: if ( 𝑇𝑇 ∪ 𝑒𝑒 𝑖𝑖 が閉路を含まない ) then
5: 𝑇𝑇 ← 𝑇𝑇 ∪ 𝑒𝑒 𝑖𝑖 ;
6: end if 7: end for
6: 最小全域木 𝑇𝑇 を出力する ;
このチェックは 意外に難しい!
単純にやると毎回 O(𝑛𝑛) 時間 かかる(全体では O(𝑚𝑚𝑛𝑛) )
(ヒント: 𝑒𝑒[𝑖𝑖] の一方の頂点
から 𝑇𝑇 を探索をする)
練習問題: 最小全域木を求めてみよう!
3 1
2 3
2 1
問 1 問 2
問 3 問 4
2 1 3
2 3
1
3 1
2 1 1 3
4 4
4 2
1
1 3
4 3 3
1 2
1
1 4 4
4 2
1
3 3
1 2
1
1 4 4
4 2
1
解決法
𝑇𝑇 の連結成分毎に,頂点に異なる「色」を 塗っておいて,新しく加えた辺 𝑒𝑒[𝑖𝑖] の両端の 色を比べることでチェックできる!
「色」のグループを表すのには,
Union-Find データ構造を使う
両端が異なる色のときは,辺を 加えても閉路はできない
辺を加えたら色を塗り直す
良い辺
悪い辺
両端が同じ色のときは,辺を 加えると閉路ができる
クラスカルのアルゴリズムの高速化
単純に塗り直すと毎回
O(𝑛𝑛) 時間かかる
11Union-Find で
O(log 𝑛𝑛) 時間に
「色」(グループ番号)をもつグループ分けを管理するデータ構造 次の二つの演算を毎回 O(log 𝑛𝑛) 時間で実行できる
• Union( 𝑖𝑖 , 𝑗𝑗 ): 番号 𝑖𝑖 のグループと番号 𝑗𝑗 のグループを合併する
• Find( 𝑖𝑖 ): 番号 𝑖𝑖 のグループ番号を返す
Union-Find データ構造
色の塗り直しに相当 ただし色は選べない
Union(1,2) Union(2,7)
色: 1, 2, 7
1 2 7
5 3 8
4 6
色: 2, 7
1 2 7
5 3 8
4 6
色: 2
1 2 7
5 3 8
4 6
Find(1) → 1 Find(4) → 2 Find(6) → 7
Find(1) → 2 Find(4) → 2 Find(6) → 7
Find(1) → 2 Find(4) → 2 Find(6) → 2
代表元
(色を表す)
12