// 名前付きパラメータバージョン template <class VertexListGraph, class Param, class Tag, class Rest> void dag_shortest_paths(const VertexListGraph& g, typename graph_traits<VertexListGraph>::vertex_descriptor s, const bgl_named_params<Param,Tag,Rest>& params) // 名前無しパラメータバージョン template <class VertexListGraph, class DijkstraVisitor, class DistanceMap, class WeightMap, class ColorMap, class PredecessorMap, class Compare, class Combine, class DistInf, class DistZero> void dag_shortest_paths(const VertexListGraph& g, typename graph_traits<VertexListGraph>::vertex_descriptor s, DistanceMap distance, WeightMap weight, ColorMap color, PredecessorMap pred, DijkstraVisitor vis, Compare compare, Combine combine, DistInf inf, DistZero zero)
このアルゴリズム [8] は 重み付きの非循環有向グラフ (DAG) の単一始点の最短経路問題を解く。 このアルゴリズムは DAG にとって、Dijkstra や Bellman-Ford アルゴリズムより 一層効率的である。全ての辺の重みが 1 に等しい時はこのアルゴリズムの代わりに 幅優先探索を使いなさい。最短経路問題の定義のために、最短経路問題のいくつかの 背景についての章 Shortest-Paths Algorithms を見なさい。
dag_shortest_paths() 関数から出力を得るための主な二つの選択が 存在する。distance_map() パラメータを通して距離プロパティ・ マップを提供するならばグラフ中の始点から他の全ての頂点への最短距離は 距離マップに記録されるだろう。 さらに最短経路木を先行点マップ (predecessor map) に記録する事ができる。 その場合 V 中の各頂点 u にとって、最短経路木中では p[u] が u の先行点になるだろう (但し p[u] = u でここに u が 始点であるかまたは始点からは到達不能な頂点である場合を除く)。これらの二つの 選択に加え、ユーザはアルゴリズムのイベント・ポイントのどれかの間アクションを 取れる独自のビジタを提供する事ができる。
アルゴリズムが適用されるグラフオブジェクト。VertexListGraph の型は Vertex List Graph のモデルでなければならない。IN: vertex_descriptor s
始点。全ての距離はこの頂点から計算され、最短経路木はこの頂点を根とする。
グラフ中の各辺の重みまたは“長さ”。WeightMap の型は Readable Property Map のモデルでなければならない。グラフの辺記述子型は重みマップのキー型と して使用できる必要がある。マップの値型は距離マップの値型を伴った Addable でなければならない。IN: vertex_index_map(VertexIndexMap i_map)
デフォルト: get(edge_weight, g)
これは各頂点を [0, num_vertices(g)) の範囲において整数にマップする。 これは辺がリラックスされた (減らされた) 時、ヒープ・データ構造を効率よく更新 するのに必要である。VertexIndexMap は Readable Property Map のモデルでなければならない。マップの値型は汎整数型でなければならない。 グラフの頂点記述子型はマップのキー型として使用できる必要がある。OUT: predecessor_map(PredecessorMap p_map)
デフォルト: get(vertex_index, g)
先行点マップ (predecessor map) は最小全域木中に辺を記録する。アルゴリズムの 完了時に、V 中の全ての u のための辺 (p[u],u) は最小全域木 中にある。もし p[u] = u なら u は始点かまたは始点から到達不能な 頂点である。 PredecessorMap の型はキーと頂点の型がグラフの頂点記述子型 と同じ Read/Write Property Map でなければならない。UTIL/OUT: distance_map(DistanceMap d_map)
デフォルト: dummy_property_map
グラフ g 中の始点 s から各頂点への最短経路の重みは、この プロパティ・マップ中に記録される。最短経路の重みは、最短経路に沿った辺の重みの 和である。DistanceMap の型は Read/Write Property Map のモデルでなければならない。グラフの頂点記述子型は 距離マップのキー型として使用できる必要がある。 距離マップの値型は combine 関数 オブジェクトと単位要素のための zero オブジェクトから作られた Monoid の要素型である。 さらに距離の値型は compare 関数オブジェクトによって供給される StrictWeakOrdering の順序付けを持っていなければならない。IN: distance_compare(CompareFunction cmp)
デフォルト: サイズ num_vertices(g) の WeightMap の 値型の std::vector から作られた iterator_property_map で、添え字マップには i_map を用いる。
この関数はどの頂点が始点により近いか決定するために距離を比較するのに使われる。 CompareFunction の型は Binary Predicate のモデルでなければならず、DistanceMap プロパティ・ マップの値型に一致する引数型を持たなければならない。IN: distance_combine(CombineFunction cmb)
デフォルト: std::less<D> ここに D=typename property_traits<DistanceMap>::value_type
この関数は道の距離を計算するために、距離を結合するのに使われる。 CombineFunction の型は Binary Function のモデルでなければならない。二項関数の第一引数の型は DistanceMap プロパティ・マップの値型に一致していなければならず、 第二引数の型は WeightMap プロパティ・マップの値型に一致していなければ ならない。結果型は距離の値型と同じでなければならない。IN: distance_inf(D inf)
デフォルト: std::plus<D> ここに D=typename property_traits<DistanceMap>::value_type
inf オブジェクトは D オブジェクトのどの値よりも最も大きく なければならない。すなわち、d != inf の場合どれでも compare(d, inf) == true でなければならない。 D の型は DistanceMap の値型である。IN: distance_zero(D zero)
デフォルト: std::numeric_limits<D>::max()
zero の値は距離の値と combine 関数オブジェクトによって 作られたMonoid のための単一要素でなけけばならない。 D の型は DistanceMap の値型である。UTIL/OUT: color_map(ColorMap c_map)
デフォルト: D()
これは頂点に印をつけるためにアルゴリズムの実行の間使われる。頂点は白色から 始めて、それがキュー中に挿入された時に灰色になる。それからそれがキューから 取り除かれた時に黒色になる。アルゴリズムの終了時に、始点から到達可能な頂点は 黒色に色づけされている。その他の全ての頂点は白色のままである。ColorMap の型は Read/Write Property Map のモデルでなければならない。頂点記述子はマップのキー型として 使用できる必要があり、マップの値型は Color Value のモデルでなければならない。OUT: visitor(DijkstraVisitor v)
デフォルト: サイズ num_vertices(g) の default_color_type の std::vector から作られた iterator_property_map で、添え字マップには i_map を用いる。
アルゴリズム内の一定のイベント・ポイントの間に起こしたいアクションを指定する のに使いなさい。DijkstraVisitor は Dijkstra Visitor コンセプトのモデルでなけ ればならない。ビジタ・オブジェクトは値渡しされる [1]。
デフォルト: dijkstra_visitor<null_visitor>
時間複雑性は O(V + E) である。
example/dag_shortest_paths.cpp を見よ。これはこのアルゴリズムの 使用例である。
[1]
ビジタのパラメータは値渡しされるので、もしビジタが状態を持っているなら、
アルゴリズムの間のいかなる状態の変更も、送ったビジタ・オブジェクトには行われず
ビジタ・オブジェクトのコピーに対して行われる。それゆえポインタまたは
リファレンスによってこの状態をビジタに保持させる事を望むかもしれない。
Copyright © 2000-2001 | Jeremy Siek, Indiana University (jsiek@osl.iu.edu) |
Japanese Translation Copyright © 2003 Takashi Itou
オリジナルの、及びこの著作権表示が全ての複製の中に現れる限り、この文書の複製、利用、変更、販売そして配布を認める。このドキュメントは「あるがまま」に提供されており、いかなる明示的、暗黙的保証も行わない。また、いかなる目的に対しても、その利用が適していることを関知しない。
このドキュメントの対象: Boost Version 1.29.0
最新版ドキュメント (英語)