# `dag_shortest_paths`

    // 名前付きパラメータバージョン
    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 が 始点であるかまたは始点からは到達不能な頂点である場合を除く)。これらの二つの 選択に加え、ユーザはアルゴリズムのイベント・ポイントのどれかの間アクションを 取れる独自のビジタを提供する事ができる。

### Where Defined

`boost/graph/dag_shortest_paths.hpp`

### Parameters

IN: `const VertexListGraph& g`

> アルゴリズムが適用されるグラフオブジェクト。`VertexListGraph` の型は Vertex List Graph のモデルでなければならない。

IN: `vertex_descriptor s`

> 始点。全ての距離はこの頂点から計算され、最短経路木はこの頂点を根とする。

### Named Parameters

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)`

OUT: `predecessor_map(PredecessorMap p_map)`

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

UTIL/OUT: `distance_map(DistanceMap d_map)`

> グラフ `g` 中の始点 `s` から各頂点への最短経路の重みは、この プロパティ・マップ中に記録される。最短経路の重みは、最短経路に沿った辺の重みの 和である。`DistanceMap` の型は Read/Write Property Map のモデルでなければならない。グラフの頂点記述子型は 距離マップのキー型として使用できる必要がある。 距離マップの値型は `combine` 関数 オブジェクトと単位要素のための `zero` オブジェクトから作られた Monoid の要素型である。 さらに距離の値型は `compare` 関数オブジェクトによって供給される StrictWeakOrdering の順序付けを持っていなければならない。
> デフォルト: サイズ `num_vertices(g)` の `WeightMap` の 値型の `std::vector` から作られた `iterator_property_map` で、添え字マップには `i_map` を用いる。

IN: `distance_compare(CompareFunction cmp)`

> この関数はどの頂点が始点により近いか決定するために距離を比較するのに使われる。 `CompareFunction` の型は Binary Predicate のモデルでなければならず、`DistanceMap` プロパティ・ マップの値型に一致する引数型を持たなければならない。
> デフォルト: `std::less<D>` ここに `D=typename property_traits<DistanceMap>::value_type`

IN: `distance_combine(CombineFunction cmb)`

> この関数は道の距離を計算するために、距離を結合するのに使われる。 `CombineFunction` の型は Binary Function のモデルでなければならない。二項関数の第一引数の型は `DistanceMap` プロパティ・マップの値型に一致していなければならず、 第二引数の型は `WeightMap` プロパティ・マップの値型に一致していなければ ならない。結果型は距離の値型と同じでなければならない。
> デフォルト: `std::plus<D>` ここに `D=typename property_traits<DistanceMap>::value_type`

IN: `distance_inf(D inf)`

> `inf` オブジェクトは `D` オブジェクトのどの値よりも最も大きく なければならない。すなわち、`d != inf` の場合どれでも `compare(d, inf) == true` でなければならない。 `D` の型は `DistanceMap` の値型である。
> デフォルト: `std::numeric_limits<D>::max()`

IN: `distance_zero(D zero)`

> `zero` の値は距離の値と `combine` 関数オブジェクトによって 作られたMonoid のための単一要素でなけけばならない。 `D` の型は `DistanceMap` の値型である。
> デフォルト: `D()`

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(V + E) である。

### Visitor Event Points

- `vis.initialize_vertex(u, g)` はアルゴリズムの開始前に各頂点で呼び出される。
- `vis.examine_vertex(u, g)` は頂点が集合 S に加えられた 時に呼び出される。この時点で (p[u],u) は最短経路木の辺である事が 分かるので d[u] = delta(s,u) = d[p[u]] + w(p[u],u) である。更に 調査された頂点の距離は単調増加 d[u1] <= d[u2] <= d[un] である。
- `vis.examine_edge(e, g)` は頂点の各出辺において、 頂点が集合 S に加えられた後で直ちに呼び出される。
- `vis.edge_relaxed(e, g)` は辺 (u,v) において、 もし d[u] + w(u,v) < d[v] であるなら呼び出される。 頂点 v のための最近のリラックス (減少) にあずかった辺 (u,v) は最短経路木の中にある辺である。
- `vis.discover_vertex(v, g)` は頂点 v において、 (u,v) が調査されて v が白色である時に呼び出される。 頂点が発見されていれば灰色に色づけされており、各到達可能な頂点はきっかり一度 発見されるからである。
- `vis.edge_not_relaxed(e, g)` はもし辺がリラックスされない (上を見よ) なら呼び出される。
- `vis.finish_vertex(u, g)` は頂点の出辺が全て調査された後に呼び出される。

### Example

`example/dag_shortest_paths.cpp` を見よ。これはこのアルゴリズムの 使用例である。

### Notes

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

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

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

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