|
|
|
|
@@ -96,21 +96,21 @@ namespace boost {
|
|
|
|
|
ColorMap color,
|
|
|
|
|
PredEdgeMap pred)
|
|
|
|
|
{
|
|
|
|
|
typedef typename property_traits<ColorMap>::value_type ColorValue;
|
|
|
|
|
typedef color_traits<ColorValue> Color;
|
|
|
|
|
|
|
|
|
|
typename graph_traits<Graph>::vertex_iterator u_iter, u_end;
|
|
|
|
|
typename graph_traits<Graph>::out_edge_iterator ei, e_end;
|
|
|
|
|
for (tie(u_iter, u_end) = vertices(g); u_iter != u_end; ++u_iter)
|
|
|
|
|
for (tie(ei, e_end) = out_edges(*u_iter, g); ei != e_end; ++ei)
|
|
|
|
|
res[*ei] = cap[*ei];
|
|
|
|
|
|
|
|
|
|
typedef color_traits<typename property_traits<ColorMap>::value_type>
|
|
|
|
|
Color;
|
|
|
|
|
|
|
|
|
|
color[sink] = Color::gray();
|
|
|
|
|
while (color[sink] != Color::white()) {
|
|
|
|
|
breadth_first_search
|
|
|
|
|
(detail::residual_graph(g, res), src,
|
|
|
|
|
make_bfs_visitor(record_edge_predecessors(pred, on_tree_edge())),
|
|
|
|
|
color);
|
|
|
|
|
visitor(make_bfs_visitor(record_edge_predecessors(pred, on_tree_edge()))).
|
|
|
|
|
color_map(color));
|
|
|
|
|
if (color[sink] != Color::white())
|
|
|
|
|
detail::augment(g, src, sink, pred, res, rev);
|
|
|
|
|
} // while
|
|
|
|
|
@@ -124,98 +124,111 @@ namespace boost {
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
// Handle default for color property map
|
|
|
|
|
|
|
|
|
|
template <class Graph, class PredMap, class P, class T, class R>
|
|
|
|
|
typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
edmunds_karp_dispatch2
|
|
|
|
|
(Graph& g,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor src,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor sink,
|
|
|
|
|
PredMap pred,
|
|
|
|
|
const bgl_named_params<P, T, R>& params,
|
|
|
|
|
detail::error_property_not_found)
|
|
|
|
|
{
|
|
|
|
|
typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
|
|
|
|
|
typedef typename graph_traits<Graph>::vertices_size_type size_type;
|
|
|
|
|
size_type n = is_default_param(get_param(params, vertex_color)) ?
|
|
|
|
|
num_vertices(g) : 0;
|
|
|
|
|
std::vector<default_color_type> color_vec(n);
|
|
|
|
|
return edmunds_karp_max_flow_impl
|
|
|
|
|
(g, src, sink,
|
|
|
|
|
choose_const_pmap(get_param(params, edge_capacity), g, edge_capacity),
|
|
|
|
|
choose_pmap(get_param(params, edge_residual_capacity),
|
|
|
|
|
g, edge_residual_capacity),
|
|
|
|
|
choose_const_pmap(get_param(params, edge_reverse), g, edge_reverse),
|
|
|
|
|
make_iterator_property_map(color_vec.begin(), choose_const_pmap
|
|
|
|
|
(get_param(params, vertex_index),
|
|
|
|
|
g, vertex_index), color_vec[0]),
|
|
|
|
|
pred);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <class Graph, class PredMap, class P, class T, class R,
|
|
|
|
|
class ColorMap>
|
|
|
|
|
typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
edmunds_karp_dispatch2
|
|
|
|
|
// use of class here is a VC++ workaround
|
|
|
|
|
template <class ColorMap>
|
|
|
|
|
struct edmunds_karp_dispatch2 {
|
|
|
|
|
template <class Graph, class PredMap, class P, class T, class R>
|
|
|
|
|
static typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
apply
|
|
|
|
|
(Graph& g,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor src,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor sink,
|
|
|
|
|
PredMap pred,
|
|
|
|
|
const bgl_named_params<P, T, R>& params,
|
|
|
|
|
ColorMap color)
|
|
|
|
|
{
|
|
|
|
|
return edmunds_karp_max_flow_impl
|
|
|
|
|
(g, src, sink,
|
|
|
|
|
choose_const_pmap(get_param(params, edge_capacity), g, edge_capacity),
|
|
|
|
|
choose_pmap(get_param(params, edge_residual_capacity),
|
|
|
|
|
g, edge_residual_capacity),
|
|
|
|
|
choose_const_pmap(get_param(params, edge_reverse), g, edge_reverse),
|
|
|
|
|
color, pred);
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
return edmunds_karp_max_flow_impl
|
|
|
|
|
(g, src, sink,
|
|
|
|
|
choose_const_pmap(get_param(params, edge_capacity), g, edge_capacity),
|
|
|
|
|
choose_pmap(get_param(params, edge_residual_capacity),
|
|
|
|
|
g, edge_residual_capacity),
|
|
|
|
|
choose_const_pmap(get_param(params, edge_reverse), g, edge_reverse),
|
|
|
|
|
color, pred);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
template<>
|
|
|
|
|
struct edmunds_karp_dispatch2<detail::error_property_not_found> {
|
|
|
|
|
template <class Graph, class PredMap, class P, class T, class R>
|
|
|
|
|
static typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
apply
|
|
|
|
|
(Graph& g,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor src,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor sink,
|
|
|
|
|
PredMap pred,
|
|
|
|
|
const bgl_named_params<P, T, R>& params,
|
|
|
|
|
detail::error_property_not_found)
|
|
|
|
|
{
|
|
|
|
|
typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
|
|
|
|
|
typedef typename graph_traits<Graph>::vertices_size_type size_type;
|
|
|
|
|
size_type n = is_default_param(get_param(params, vertex_color)) ?
|
|
|
|
|
num_vertices(g) : 0;
|
|
|
|
|
std::vector<default_color_type> color_vec(n);
|
|
|
|
|
return edmunds_karp_max_flow_impl
|
|
|
|
|
(g, src, sink,
|
|
|
|
|
choose_const_pmap(get_param(params, edge_capacity), g, edge_capacity),
|
|
|
|
|
choose_pmap(get_param(params, edge_residual_capacity),
|
|
|
|
|
g, edge_residual_capacity),
|
|
|
|
|
choose_const_pmap(get_param(params, edge_reverse), g, edge_reverse),
|
|
|
|
|
make_iterator_property_map(color_vec.begin(), choose_const_pmap
|
|
|
|
|
(get_param(params, vertex_index),
|
|
|
|
|
g, vertex_index), color_vec[0]),
|
|
|
|
|
pred);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
// Handle default for predecessor property map
|
|
|
|
|
|
|
|
|
|
template <class Graph, class P, class T, class R>
|
|
|
|
|
typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
edmunds_karp_dispatch1
|
|
|
|
|
// use of class here is a VC++ workaround
|
|
|
|
|
template <class PredMap>
|
|
|
|
|
struct edmunds_karp_dispatch1 {
|
|
|
|
|
template <class Graph, class P, class T, class R>
|
|
|
|
|
static typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
apply(Graph& g,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor src,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor sink,
|
|
|
|
|
const bgl_named_params<P, T, R>& params,
|
|
|
|
|
PredMap pred)
|
|
|
|
|
{
|
|
|
|
|
typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
|
|
|
|
|
typedef typename graph_traits<Graph>::vertices_size_type size_type;
|
|
|
|
|
size_type n = is_default_param(get_param(params, vertex_predecessor)) ?
|
|
|
|
|
num_vertices(g) : 0;
|
|
|
|
|
std::vector<edge_descriptor> pred_vec(n);
|
|
|
|
|
|
|
|
|
|
typedef typename property_value< bgl_named_params<P,T,R>, vertex_color_t>::type C;
|
|
|
|
|
return edmunds_karp_dispatch2<C>::apply
|
|
|
|
|
(g, src, sink, pred, params, get_param(params, vertex_color));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
template<>
|
|
|
|
|
struct edmunds_karp_dispatch1<detail::error_property_not_found> {
|
|
|
|
|
|
|
|
|
|
template <class Graph, class P, class T, class R>
|
|
|
|
|
static typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
apply
|
|
|
|
|
(Graph& g,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor src,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor sink,
|
|
|
|
|
const bgl_named_params<P, T, R>& params,
|
|
|
|
|
detail::error_property_not_found)
|
|
|
|
|
{
|
|
|
|
|
typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
|
|
|
|
|
typedef typename graph_traits<Graph>::vertices_size_type size_type;
|
|
|
|
|
size_type n = is_default_param(get_param(params, vertex_predecessor)) ?
|
|
|
|
|
num_vertices(g) : 0;
|
|
|
|
|
std::vector<edge_descriptor> pred_vec(n);
|
|
|
|
|
|
|
|
|
|
return edmunds_karp_dispatch2
|
|
|
|
|
(g, src, sink,
|
|
|
|
|
make_iterator_property_map(pred_vec.begin(), choose_const_pmap
|
|
|
|
|
(get_param(params, vertex_index),
|
|
|
|
|
g, vertex_index), pred_vec[0]),
|
|
|
|
|
params,
|
|
|
|
|
get_param(params, vertex_color));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template <class Graph, class P, class T, class R, class PredMap>
|
|
|
|
|
typename edge_capacity_value<Graph, P, T, R>::type
|
|
|
|
|
edmunds_karp_dispatch1
|
|
|
|
|
(Graph& g,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor src,
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor sink,
|
|
|
|
|
const bgl_named_params<P, T, R>& params,
|
|
|
|
|
PredMap pred)
|
|
|
|
|
{
|
|
|
|
|
typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
|
|
|
|
|
typedef typename graph_traits<Graph>::vertices_size_type size_type;
|
|
|
|
|
size_type n = is_default_param(get_param(params, vertex_predecessor)) ?
|
|
|
|
|
num_vertices(g) : 0;
|
|
|
|
|
std::vector<edge_descriptor> pred_vec(n);
|
|
|
|
|
|
|
|
|
|
return edmunds_karp_dispatch2
|
|
|
|
|
(g, src, sink, pred, params, get_param(params, vertex_color));
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
|
|
|
|
|
typedef typename graph_traits<Graph>::vertices_size_type size_type;
|
|
|
|
|
size_type n = is_default_param(get_param(params, vertex_predecessor)) ?
|
|
|
|
|
num_vertices(g) : 0;
|
|
|
|
|
std::vector<edge_descriptor> pred_vec(n);
|
|
|
|
|
|
|
|
|
|
typedef typename property_value< bgl_named_params<P,T,R>, vertex_color_t>::type C;
|
|
|
|
|
return edmunds_karp_dispatch2<C>::apply
|
|
|
|
|
(g, src, sink,
|
|
|
|
|
make_iterator_property_map(pred_vec.begin(), choose_const_pmap
|
|
|
|
|
(get_param(params, vertex_index),
|
|
|
|
|
g, vertex_index), pred_vec[0]),
|
|
|
|
|
params,
|
|
|
|
|
get_param(params, vertex_color));
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace detail
|
|
|
|
|
|
|
|
|
|
@@ -227,7 +240,8 @@ namespace boost {
|
|
|
|
|
typename graph_traits<Graph>::vertex_descriptor sink,
|
|
|
|
|
const bgl_named_params<P, T, R>& params)
|
|
|
|
|
{
|
|
|
|
|
return detail::edmunds_karp_dispatch1
|
|
|
|
|
typedef typename property_value< bgl_named_params<P,T,R>, vertex_predecessor_t>::type Pred;
|
|
|
|
|
return detail::edmunds_karp_dispatch1<Pred>::apply
|
|
|
|
|
(g, src, sink, params, get_param(params, vertex_predecessor));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|