最小全域木問題
概要
いくつかの頂点と、各頂点の間をつなげるコスト (辺の重み) が定義されており、最も小さいコストですべての頂点をつなぐ最適化問題。コストは 0 より大きく接続不能 (つまりコスト
最小シュタイナー木問題
無向グラフ
アルゴリズム
クラスカル法
クラスカル法 (Kruskal's algorithm) は閉路にならない最小コストの辺を選んでゆく操作をすべての頂点が接続されるまで繰り返す。疎集合データ構造 (disjoint-set data structure) の Union-Find アルゴリズムの適用例として知られている。この方法で最小全域木となる証明はP.27参照。
- 最初に最小コスト2の辺(D,F)をつなげる。
- 次に最小コスト3の辺(B,D),(A,F)のどちらを選んでも良いがここでは(B,D)をつなげる。
- 次の最小コスト3の辺(A,F)をつなげる。
- 次に最小コスト4の辺(A,D),(C,D)だが(A,D)は閉路となるため(C,D)をつなげる。
- 次に最小コスト5の辺(B,C),(C,E)だが(B,C)は閉路となるため(C,E)をつなげる。
閉路になるかは接続しようとしている辺の両端が既に選択されているかで判定ができる。全ての頂点と辺が記憶領域に乗る規模の一般的なグラフであれば、最初に全ての辺をソートし重みの低い順に閉路になるかどうかを評価してゆけば良いので実装は容易である。
プリム法
プリム法 (Prim algorithm) は連結部分グラフに対してコストが最小になる方向に拡大してゆく操作を全体が連結グラフとなるまで繰り返すアルゴリズム。最初に任意の頂点を選択し、最もコストの低い辺を選んで接続する。できあがった部分グラフ以外の頂点とを結ぶ最もコストの低い辺を選択する。この操作をすべての頂点が接続するまで繰り返す。
既に選択されている頂点とまだ選択されていない頂点を接続するためプリム法で閉路ができることはない。以下は適当な重み付き隣接行列を定義するとプリム法で最小全域木を作成する。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| A | 0 | 1 | 1 | 1 | 1 | 1 |
| B | 0 | 1 | 1 | 1 | 1 | |
| C | 0 | 1 | 1 | 1 | ||
| D | 0 | 1 | 1 | |||
| E | 0 | 1 | ||||
| F | 0 |
クラスカル法と比べて大きな違いがあるわけではないが、クラスカル法がグラフ上の全ての辺 (実際に選ばれるかに拘らず) から最も重みの小さい辺を選ぶのに対して、プリム法は選択済みの部分グラフと接続している辺の中から最も重みの小さい辺を選ぶことから、計算量と記憶領域の点で若干優位な実装が可能である。
参考文献
- クラスカル法
, プリム法
, シュタイナー木
- 宮崎修一 "グラフ理論入門基本とアルゴリズム", 森北出版 (2015)