# `edmunds_karp_max_flow`

    // 名前付きパラメータバージョン
    template <class VertexListGraph, class P, class T, class R>
    typename detail::edge_capacity_value<VertexListGraph, P, T, R>::value_type
    edmunds_karp_max_flow(VertexListGraph& g,
       typename graph_traits<VertexListGraph>::vertex_descriptor src,
       typename graph_traits<VertexListGraph>::vertex_descriptor sink,
       const bgl_named_params<P, T, R>& params = all defaults)

    // 名前無しパラメータバージョン
    template <class VertexListGraph,
    	  class CapacityEdgeMap, class ResidualCapacityEdgeMap,
    	  class ReverseEdgeMap, class ColorMap, class PredEdgeMap>
    typename property_traits<CapacityEdgeMap>::value_type
    edmunds_karp_max_flow(VertexListGraph& g,
       typename graph_traits<Graph>::vertex_descriptor src,
       typename graph_traits<Graph>::vertex_descriptor sink,
       CapacityEdgeMap cap, ResidualCapacityEdgeMap res, ReverseEdgeMap rev,
       ColorMap color, PredEdgeMap pred)

`edmunds_karp_max_flow()` 関数はネットワークの最大流を計算する。 最大流の記述のために章 Network Flow Algorithms を見なさい。計算された最大流が関数の返却値になるだろう。 関数はさらに E 中の全ての (u,v) のために流量 f(u,v) を計算する。そしてそれは 残差容量 r(u,v) = c(u,v) - f(u,v) の形で返される。

このアルゴリズムのために入力グラフとプロパティ・マップのパラメータにいくつかの 特別な必要条件がある。最初に、ネットワークを表す有向グラフ G=(V,E) は E 中の各辺のための逆辺 (reverse edge) を含むために増やされなければな らない。換言すれば、入力グラフは Gin = (V,{E U ET}) であるべきである。`ReverseEdgeMap` 引数 `rev` は元のグラフ中の 各辺をその逆辺にマップしなければならない。 すなわち E 中の全ての (u,v) に対して (u,v) -> (v,u) である。 `CapacityEdgeMap` 引数 `cap` は E 中の各辺を正の数に マップしなければならず、ET 中の各辺は 0 にされなければなら ない。

アルゴリズムは Edmonds and Karp に負っている。もっとも Network Flows に 述べられている“ラベリング・アルゴリズム”と呼ばれる亜種を使っているが。

このアルゴリズムは最大流問題を実装するための大変単純で容易な解答である。 しかしながら、このアルゴリズムが `push_relabel_max_flow()` アルゴリズムほどには良くないいくつかの理由がある。

- 非整数の容量の場合、時間複雑性は最疎グラフを除く全てのグラフにとって push-relabel アルゴリズムの O(V2E1/2) より悪い O(V E2) である。
- 整数の容量の場合、もし容量の範囲 U が大変大きいならば、 アルゴリズムに長い時間がかかるだろう。

### Where Defined

`boost/graph/edmunds_karp_max_flow.hpp`

### Parameters

IN: `VertexListGraph& g`

> 有向グラフ。グラフの型は VertexListGraph のモデルでなければなら ない。グラフ中の各辺 (u,v) のために、逆辺 (v,u) もまたグラフ 中になければならない。

IN: `vertex_descriptor src`

> 流れのネットワーク・グラフのためのソース頂点。

IN: `vertex_descriptor sink`

> 流れのネットワーク・グラフのためのシンク頂点。

### Named Parameters

IN: `capacity_map(CapacityEdgeMap cap)`

> 辺容量プロパティ・マップ。型は定数 Lvalue Property Map のモデルでなければならない。マップのキー型はグラフの辺記述子型でなければ ならない。
> デフォルト: `get(edge_capacity, g)`

OUT: `residual_capacity_map(ResidualCapacityEdgeMap res)`

> これは辺をその残差容量にマップする。。型は変更可能の Lvalue Property Map のモデルでなければならない。マップのキー型はグラフの辺記述子型で なければならない。
> デフォルト: `get(edge_residual_capacity, g)`

IN: `reverse_edge_map(ReverseEdgeMap rev)`

> グラフ中の全ての辺 (u,v) を逆辺 (v,u) にマップする辺プロパティ・ マップ。マップは定数 Lvalue Property Map のモデルでなければならない。マップのキー型はグラフの 辺記述子型でなければならない。
> デフォルト: `get(edge_reverse, g)`

UTIL: `color_map(ColorMap color)`

> 幅有線探索の段階の間進行過程を保持するためにアルゴリズムによって使われる。 アルゴリズムの終了時に、白色の頂点は最小カット集合を定義する。マップは Lvalue Property Map のモデルでなければならない。マップのキー型はグラフの頂点記述子型であるべき で、値型は ColorValue のモデルでなければならない。
> デフォルト: サイズ `num_vertices(g)` の `default_color_type` の `std::vector` から作られた iterator_property_mapで、添え字マップには `i_map` を用いる。

UTIL: `predecessor_map(PredEdgeMap pred)`

> 増大した道を格納するためにアルゴリズムによって使われる。マップは変更可能の Lvalue Property Map でなければならない。キー型はグラフの頂点記述子型であるべきで、値型は グラフの辺記述子型でなければならない。
> デフォルト: サイズ `num_vertices(g)` の 辺記述子の `std::vector` から作られた iterator_property_mapで、添え字マップには `i_map` を用いる。

IN: `vertex_index_map(VertexIndexMap i_map)`

> グラフの各頂点を `[0, num_vertices(g))` の範囲において唯一の整数に マップしなさい。このプロパティ・マップはカラー・マップまたは 先行点マップのためにデフォルトが使われた時にのみ必要である。 頂点添え字マップは Readable Property Map のモデルでなければならない。マップのキー型はグラフの頂点記述子型で なければならない。
> デフォルト: `get(vertex_index, g)`

### Complexity

時間複雑性は普通の場合には O(V E2) でもしくは容量値が 定数 U で範囲づけられた整数であるならば O(V E U) である。

### Example

`example/edmunds-karp-eg.cpp` 中のプログラムは最大流問題の例 (辺容量を伴うグラフ) を DIMACS 形式で書かれた ファイルから読み、最大流を計算する。

### See Also

`push_relabel_max_flow()`.

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

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

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