# `prim_minimum_spanning_tree`

    // 名前付きパラメータバージョン
    template <class VertexListGraph, class P, class T, class R>
    void prim_minimum_spanning_tree(VertexListGraph& g,
      typename graph_traits<VertexListGraph>::vertex_descriptor s,
      const bgl_named_params<P, T, R>& params)

    // 名前無しパラメータバージョン
    template <class VertexListGraph, class DijkstraVisitor,
    	  class PredecessorMap, class DistanceMap,
    	  class WeightMap, class IndexMap>
    void prim_minimum_spanning_tree(const VertexListGraph& g,
       typename graph_traits<VertexListGraph>::vertex_descriptor s,
       PredecessorMap predecessor, DistanceMap distance, WeightMap weight,
       IndexMap index_map, DijkstraVisitor vis)

これは重みのある辺を伴う無向グラフのための最小全域木問題を解く Prim の アルゴリズム [25,8,27,15] である。MST は木中の辺の重みの合計 が最小化されたグラフ中の全ての頂点を接続する辺の集合である。さらに詳しくは章 Minimum Spanning Tree Problem を見なさい。実装は単に比較と結合のファンクタを適当に 選択して `dijkstra_shortest_paths()` を呼んでいる。Prim のアルゴリズムの擬似コードを下に載せた。

    PRIM-MST(G, s, w)
      for each vertex u in V[G]
        color[u] := WHITE
        d[u] := infinity
      color[s] := GRAY
      d[s] := 0
      ENQUEUE(PQ, s)
      p[s] := s
      while (PQ != Ø)
        u := DEQUEUE(PQ)
        for each v in Adj[u]
          if (w(u,v) < d[v])
            d[v] := w(u,v)
            p[v] := u
            if (color[v] =  WHITE)
              ENQUEUE(PQ, v)
              color[v] := GRAY
            else if (color[v] =  GRAY)
              UPDATE(PQ, v)
          else
            do nothing
        end for
        color[u] := BLACK
      end while
      return (p, d)
    頂点 u の初期化

    頂点 s の開始
    頂点 s の発見

    頂点 u の調査
    辺 (u,v) の調査

    辺 (u,v) はリラックスされた (減らされた)

    頂点 v の発見

    辺 (u,v) はリラックスされない (減らされない)

    u の終了

### Where Defined

`boost/graph/prim_minimum_spanning_tree.hpp`

### Parameters

IN: `const VertexListGraph& g`

> 無向グラフ。`VertexListGraph` の型は Vertex List Graph のモデルでなければなら ない。

OUT: `PredecessorMap p_map`

> 先行点マップ (predecessor map) は最小全域木中に辺を記録する。アルゴリズムの 完了時に、V 中の全ての u のための辺 (p[u],u) は最小全域 木中にある。もし p[u] = u なら u は木の根かまたは根から到達 不能な頂点である。 `PredecessorMap` の型はキーと頂点の型がグラフの 頂点記述子型と同じ Read/Write Property Map でなければならない。

### Named Parameters

IN: `root_vertex(vertex_descriptor r)`

> 最小全域木の根となるであろう頂点。根頂点の選択は任意である。
> デフォルト: `*vertices(g).first`

IN: `weight_map(WeightMap w_map)`

> グラフ中の各辺の重みまたは“長さ”。`WeightMap` の型は Readable Property Map のモデルでなければならない。グラフの辺記述子型はウェイト・マップのキー型と して使用できる必要がある。マップの値型はディスタンス・マップの値型を伴った Addable でなければならない。
> デフォルト: `get(edge_weight, g)`

IN: `vertex_index_map(VertexIndexMap i_map)`

> これは各頂点を `[0, num_vertices(g))` の範囲において整数にマップする。 これは辺がリラックスされた (減らされた) 時、ヒープ・データ構造を効率よく更新 するのに必要である。`VertexIndexMap` は Readable Property Map のモデルでなければならない。マップの値型は汎整数型でなければならない。 グラフの頂点記述子型はマップのキー型として使用できる必要がある。
> デフォルト: `get(vertex_index, g)`

UTIL/OUT: `distance_map(DistanceMap d_map)`

> グラフ `g` 中の始点 `s` から各頂点への最短経路の重みは、この プロパティ・マップ中に記録される。最短経路の重みは、最短経路に沿った辺の重みの 和である。`DistanceMap` の型は Read/Write Property Map のモデルでなければならない。グラフの頂点記述子型は ディスタンス・マップのキー型として使用できる必要がある。ディスタンス・ マップの値型は Less Than Comparable でなければならない。
> デフォルト: サイズ `num_vertices(g)` の `WeightMap` の 値型の `std::vector` から作られた `iterator_property_map` で、添え字マップには `i_map` を用いる。

UTIL/OUT: `color_map(ColorMap c_map)`

> これは頂点に印をつけるためにアルゴリズムの実行の間使われる。頂点は白色から 始めて、それがキュー中に挿入された時に灰色になる。それからそれがキューから 取り除かれた時に黒色になる。アルゴリズムの終了時に、始点から到達可能な頂点は 黒色に色づけされている。その他の全ての頂点は白色のままである。 `ColorMap` の型は Read/Write Property Map のモデルでなければならない。頂点記述子はマップのキー型として 使用できる必要があり、マップの値型は Color Value のモデルでなければならない。
> デフォルト: サイズ `num_vertices(g)` の `default_color_type` の `std::vector` から作られた `iterator_property_map` で、添え字マップには `i_map` を用いる。

OUT: `visitor(DijkstraVisitor v)`

> アルゴリズム内の一定のイベント・ポイントの間に起こしたいアクションを指定する のに使いなさい。`DijkstraVisitor` は Dijkstra Visitor コンセプトのモデルでなけ ればならない。ビジタ・オブジェクトは値渡しされる [1]。
> デフォルト: `dijkstra_visitor<null_visitor>`

### Complexity

時間複雑性は O(E log V) である。

### Example

ファイル `examples/prim-example.cpp` は Prim のアルゴリズムの使用例を含む。

### Notes

[1] ビジタのパラメータは値渡しされるので、もしビジタが状態を持っているなら、 アルゴリズムの間のいかなる状態の変更も、送ったビジタ・オブジェクトには行われず ビジタ・オブジェクトのコピーに対して行われる。それゆえポインタまたは リファレンスによってこの状態をビジタに保持させる事を望むかもしれない。

Copyright © 2000-2001 | Jeremy Siek, Indiana University (jsiek@osl.iu.edu)

Japanese Translation Copyright © 2003 Takashi Itou
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。

このドキュメントの対象: Boost Version 1.30.0
最新版ドキュメント (英語)