7#ifndef BOOST_BOYKOV_KOLMOGOROV_MAX_FLOW_HPP
8#define BOOST_BOYKOV_KOLMOGOROV_MAX_FLOW_HPP
10#include <boost/config.hpp>
11#include <boost/assert.hpp>
18#include <boost/pending/queue.hpp>
19#include <boost/limits.hpp>
20#include <boost/property_map/property_map.hpp>
21#include <boost/none_t.hpp>
22#include <boost/graph/graph_concepts.hpp>
23#include <boost/graph/named_function_params.hpp>
24#include <boost/graph/lookup_edge.hpp>
25#include <boost/concept/assert.hpp>
44 class EdgeCapacityMap,
45 class ResidualCapacityEdgeMap,
52 typedef typename property_traits<EdgeCapacityMap>::value_type
tEdgeVal;
59 typedef boost::queue<vertex_descriptor>
tQueue;
60 typedef typename property_traits<ColorMap>::value_type
tColorValue;
62 typedef typename property_traits<DistanceMap>::value_type
tDistanceVal;
67 ResidualCapacityEdgeMap res,
97 for(boost::tie(vi, v_end) = vertices(
m_g); vi != v_end; ++vi){
103 for(boost::tie(ei, e_end) = edges(
m_g); ei != e_end; ++ei) {
121 boost::tie(connecting_edge, path_found) =
grow();
146 if(current_node ==
m_sink){
154 boost::tie(to_sink, is_there) = lookup_edge(current_node,
m_sink,
m_g);
158 if(cap_from_source > cap_to_sink){
159 set_tree(current_node, tColorTraits::black());
170 }
else if(cap_to_sink > 0){
171 set_tree(current_node, tColorTraits::white());
181 m_flow += cap_from_source;
187 set_tree(current_node, tColorTraits::black());
198 set_tree(current_node, tColorTraits::white());
213 std::pair<edge_descriptor, bool>
grow(){
217 BOOST_ASSERT(
get_tree(current_node) != tColorTraits::gray() &&
222 if(
get_tree(current_node) == tColorTraits::black()){
233 if(
get_tree(other_node) == tColorTraits::gray()){
234 set_tree(other_node, tColorTraits::black());
239 }
else if(
get_tree(other_node) == tColorTraits::black()) {
248 BOOST_ASSERT(
get_tree(other_node)==tColorTraits::white());
251 return std::make_pair(out_edge,
true);
257 BOOST_ASSERT(
get_tree(current_node) == tColorTraits::white());
267 if(
get_tree(other_node) == tColorTraits::gray()){
268 set_tree(other_node, tColorTraits::white());
273 }
else if(
get_tree(other_node) == tColorTraits::white()){
281 BOOST_ASSERT(
get_tree(other_node)==tColorTraits::black());
284 return std::make_pair(in_edge,
true);
334 if(new_pred_cap == 0){
342 while(current_node !=
m_sink){
351 if(new_pred_cap == 0){
366 BOOST_USING_STD_MIN();
372 minimum_cap = min BOOST_PREVENT_MACRO_SUBSTITUTION(minimum_cap,
get(
m_res_cap_map, pred));
377 while(current_node !=
m_sink){
379 minimum_cap = min BOOST_PREVENT_MACRO_SUBSTITUTION(minimum_cap,
get(
m_res_cap_map, pred));
401 if(
get_tree(current_node) == tColorTraits::black()){
403 tDistanceVal min_distance = (std::numeric_limits<tDistanceVal>::max)();
406 for(boost::tie(ei, e_end) =
out_edges(current_node,
m_g); ei != e_end; ++ei){
408 BOOST_ASSERT(
target(in_edge,
m_g) == current_node);
414 new_parent_edge = in_edge;
419 if(min_distance != (std::numeric_limits<tDistanceVal>::max)()){
425 for(boost::tie(ei, e_end) =
out_edges(current_node,
m_g); ei != e_end; ++ei){
428 if(
get_tree(other_node) == tColorTraits::black() && other_node !=
m_source){
440 set_tree(current_node, tColorTraits::gray());
445 BOOST_ASSERT(
get_tree(current_node) == tColorTraits::white());
448 tDistanceVal min_distance = (std::numeric_limits<tDistanceVal>::max)();
449 for(boost::tie(ei, e_end) =
out_edges(current_node,
m_g); ei != e_end; ++ei){
456 new_parent_edge = out_edge;
460 if(min_distance != (std::numeric_limits<tDistanceVal>::max)()){
466 for(boost::tie(ei, e_end) =
out_edges(current_node,
m_g); ei != e_end; ++ei){
469 if(
get_tree(other_node) == tColorTraits::white() && other_node !=
m_sink){
480 set_tree(current_node, tColorTraits::gray());
492 return graph_traits<Graph>::null_vertex();
500 BOOST_ASSERT(
get_tree(
v) == tColorTraits::black() ||
get_tree(
v) == tColorTraits::white());
510 BOOST_ASSERT(
get_tree(
v) != tColorTraits::gray());
603 if(current_vertex ==
m_sink){
697 iterator_property_map<std::vector<long>::iterator, IndexMap>
m_time_map;
712 class CapacityEdgeMap,
713 class ResidualCapacityEdgeMap,
718typename property_traits<CapacityEdgeMap>::value_type
721 ResidualCapacityEdgeMap res_cap,
722 ReverseEdgeMap rev_map,
727 typename graph_traits<Graph>::vertex_descriptor src,
728 typename graph_traits<Graph>::vertex_descriptor sink)
730 typedef typename graph_traits<Graph>::vertex_descriptor vertex_descriptor;
731 typedef typename graph_traits<Graph>::edge_descriptor edge_descriptor;
734 BOOST_CONCEPT_ASSERT(( VertexListGraphConcept<Graph> ));
735 BOOST_CONCEPT_ASSERT(( EdgeListGraphConcept<Graph> ));
736 BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept<Graph> ));
737 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<CapacityEdgeMap, edge_descriptor> ));
738 BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept<ResidualCapacityEdgeMap, edge_descriptor> ));
739 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<ReverseEdgeMap, edge_descriptor> ));
740 BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept<PredecessorMap, vertex_descriptor> ));
741 BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept<ColorMap, vertex_descriptor> ));
742 BOOST_CONCEPT_ASSERT(( ReadWritePropertyMapConcept<DistanceMap, vertex_descriptor> ));
743 BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept<IndexMap, vertex_descriptor> ));
744 BOOST_ASSERT(num_vertices(g) >= 2 && src != sink);
747 Graph, CapacityEdgeMap, ResidualCapacityEdgeMap, ReverseEdgeMap,
749 > algo(g, cap, res_cap, rev_map, pre_map, color, dist, idx, src, sink);
751 return algo.max_flow();
759 class CapacityEdgeMap,
760 class ResidualCapacityEdgeMap,
761 class ReverseEdgeMap,
763typename property_traits<CapacityEdgeMap>::value_type
766 ResidualCapacityEdgeMap res_cap,
769 typename graph_traits<Graph>::vertex_descriptor src,
770 typename graph_traits<Graph>::vertex_descriptor sink)
772 typename graph_traits<Graph>::vertices_size_type n_verts = num_vertices(g);
773 std::vector<typename graph_traits<Graph>::edge_descriptor> predecessor_vec(n_verts);
774 std::vector<default_color_type> color_vec(n_verts);
775 std::vector<typename graph_traits<Graph>::vertices_size_type> distance_vec(n_verts);
778 g, cap, res_cap, rev,
779 make_iterator_property_map(predecessor_vec.begin(), idx),
780 make_iterator_property_map(color_vec.begin(), idx),
781 make_iterator_property_map(distance_vec.begin(), idx),
791 class CapacityEdgeMap,
792 class ResidualCapacityEdgeMap,
793 class ReverseEdgeMap,
796typename property_traits<CapacityEdgeMap>::value_type
799 ResidualCapacityEdgeMap res_cap,
803 typename graph_traits<Graph>::vertex_descriptor src,
804 typename graph_traits<Graph>::vertex_descriptor sink)
806 typename graph_traits<Graph>::vertices_size_type n_verts = num_vertices(g);
807 std::vector<typename graph_traits<Graph>::edge_descriptor> predecessor_vec(n_verts);
808 std::vector<typename graph_traits<Graph>::vertices_size_type> distance_vec(n_verts);
811 g, cap, res_cap, rev,
812 make_iterator_property_map(predecessor_vec.begin(), idx),
814 make_iterator_property_map(distance_vec.begin(), idx),
821template<
class Graph,
class P,
class T,
class R>
822typename property_traits<typename property_map<Graph, edge_capacity_t>::const_type>::value_type
824 typename graph_traits<Graph>::vertex_descriptor src,
825 typename graph_traits<Graph>::vertex_descriptor sink,
826 const bgl_named_params<P, T, R>& params)
831 choose_const_pmap(get_param(params, edge_capacity), g, edge_capacity),
832 choose_pmap(get_param(params, edge_residual_capacity), g, edge_residual_capacity),
833 choose_const_pmap(get_param(params, edge_reverse), g, edge_reverse),
834 choose_pmap(get_param(params, vertex_predecessor), g, vertex_predecessor),
835 choose_pmap(get_param(params, vertex_color), g, vertex_color),
836 choose_pmap(get_param(params, vertex_distance), g, vertex_distance),
837 choose_const_pmap(get_param(params, vertex_index), g, vertex_index),
845typename property_traits<typename property_map<Graph, edge_capacity_t>::const_type>::value_type
847 typename graph_traits<Graph>::vertex_descriptor src,
848 typename graph_traits<Graph>::vertex_descriptor sink)
850 bgl_named_params<int, buffer_param_t> params(0);
std::pair< KisMagneticGraph::out_edge_iterator, KisMagneticGraph::out_edge_iterator > out_edges(typename KisMagneticGraph::vertex_descriptor v, KisMagneticGraph g)
KisMagneticGraph::vertex_descriptor target(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
VertexDescriptor get(PredecessorMap const &m, VertexDescriptor v)
void put(PredecessorMap &m, VertexDescriptor key, VertexDescriptor value)
std::vector< long > m_time_vec
iterator_property_map< std::vector< long >::iterator, IndexMap > m_time_map
iterator_property_map< std::vector< bool >::iterator, IndexMap > m_has_parent_map
bool has_sink_connect(vertex_descriptor v)
out_edge_iterator m_last_grow_edge_end
vertex_descriptor m_last_grow_vertex
graph_traits< Graph > tGraphTraits
vertex_descriptor get_next_active_node()
std::vector< bool > m_has_parent_vec
boost::queue< vertex_descriptor > tQueue
void augment(edge_descriptor e)
void finish_node(vertex_descriptor v)
ReverseEdgeMap m_rev_edge_map
void augment_direct_paths()
void set_no_parent(vertex_descriptor v)
property_traits< DistanceMap >::value_type tDistanceVal
ResidualCapacityEdgeMap m_res_cap_map
vertex_descriptor m_source
std::list< vertex_descriptor > m_orphans
tGraphTraits::vertex_iterator vertex_iterator
EdgeCapacityMap m_cap_map
iterator_property_map< std::vector< bool >::iterator, IndexMap > m_in_active_list_map
void set_edge_to_parent(vertex_descriptor v, edge_descriptor f_edge_to_parent)
bool has_parent(vertex_descriptor v) const
void set_tree(vertex_descriptor v, tColorValue t)
property_traits< EdgeCapacityMap >::value_type tEdgeVal
bk_max_flow(Graph &g, EdgeCapacityMap cap, ResidualCapacityEdgeMap res, ReverseEdgeMap rev, PredecessorMap pre, ColorMap color, DistanceMap dist, IndexMap idx, vertex_descriptor src, vertex_descriptor sink)
std::pair< edge_descriptor, bool > grow()
tEdgeVal find_bottleneck(edge_descriptor e)
tGraphTraits::vertex_descriptor vertex_descriptor
void add_active_node(vertex_descriptor v)
tColorValue get_tree(vertex_descriptor v) const
tGraphTraits::edge_descriptor edge_descriptor
std::vector< bool > m_in_active_list_vec
color_traits< tColorValue > tColorTraits
tGraphTraits::edge_iterator edge_iterator
tGraphTraits::out_edge_iterator out_edge_iterator
out_edge_iterator m_last_grow_edge_it
edge_descriptor get_edge_to_parent(vertex_descriptor v) const
bool is_closer_to_terminal(vertex_descriptor p, vertex_descriptor q)
property_traits< ColorMap >::value_type tColorValue
bool has_source_connect(vertex_descriptor v)
void remove_active_node(vertex_descriptor v)
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
property_traits< CapacityEdgeMap >::value_type boykov_kolmogorov_max_flow(Graph &g, CapacityEdgeMap cap, ResidualCapacityEdgeMap res_cap, ReverseEdgeMap rev_map, PredecessorMap pre_map, ColorMap color, DistanceMap dist, IndexMap idx, typename graph_traits< Graph >::vertex_descriptor src, typename graph_traits< Graph >::vertex_descriptor sink)