29 #if defined(__MINGW32__) || defined(_MSC_VER)
37 #include <boost/config.hpp>
38 #include <boost/graph/adjacency_list.hpp>
39 #include <boost/assert.hpp>
42 #include "./../../common/src/signalhandler.h"
44 #include "./../../common/src/pgr_types.h"
61 typedef typename boost::graph_traits<G>::vertex_descriptor
V;
62 typedef typename boost::graph_traits<G>::edge_descriptor
E;
63 typedef typename boost::graph_traits<G>::vertex_iterator
V_it;
64 typedef typename boost::graph_traits<G>::edge_iterator
E_it;
65 typedef typename boost::graph_traits<G>::out_edge_iterator
Eout_it;
67 typename boost::property_map<G, boost::edge_capacity_t>::type
capacity;
68 typename boost::property_map<G, boost::edge_reverse_t>::type
rev;
69 typename boost::property_map<G, boost::edge_residual_capacity_t>::type
93 std::vector<boost::default_color_type> color(num_v);
94 std::vector<int64_t> distance(num_v);
95 return boost::boykov_kolmogorov_max_flow(
boost_graph,
102 const std::set<int64_t> &source_vertices,
103 const std::set<int64_t> &sink_vertices,
105 std::set<int64_t> vertices;
106 for (int64_t source : source_vertices) {
107 vertices.insert(source);
109 for (int64_t sink : sink_vertices) {
110 vertices.insert(sink);
112 for (
size_t i = 0; i < total_tuples; ++i) {
113 vertices.insert(data_edges[i].source);
114 vertices.insert(data_edges[i].target);
116 for (int64_t
id : vertices) {
118 id_to_V.insert(std::pair<int64_t, V>(
id, v));
119 V_to_id.insert(std::pair<V, int64_t>(v,
id));
124 for (int64_t source_id : source_vertices) {
127 boost::tie(e, added) =
129 boost::tie(e_rev, added) =
138 for (int64_t sink_id : sink_vertices) {
141 boost::tie(e1, added) =
143 boost::tie(e1_rev, added) =
159 for (
size_t i = 0; i < total_tuples; ++i) {
164 boost::tie(e, added) =
166 boost::tie(e_rev, added) =
168 E_to_id.insert(std::pair<E, int64_t>(e, data_edges[i].
id));
169 E_to_id.insert(std::pair<E, int64_t>(e_rev,
176 if (data_edges[i].going || data_edges[i].coming) {
178 boost::tie(e, added) =
180 boost::tie(e_rev, added) =
182 E_to_id.insert(std::pair<E, int64_t>(e, data_edges[i].
id));
183 E_to_id.insert(std::pair<E, int64_t>(e_rev,
197 std::vector<std::vector<int64_t> > &paths) {
201 paths[path_id].push_back(v_id);
203 for (boost::tie(ei, e_end) =
210 paths[path_id].push_back(v_id);
223 std::vector<std::vector<int64_t> > paths(flow, std::vector<int64_t>());
225 Eout_it ei, e_end, ei2, e2_end;
226 for (boost::tie(ei, e_end) =
230 for (boost::tie(ei2, e2_end) =
232 ei2 != e2_end; ++ei2) {
236 flow_dfs((*ei2).m_target, path_id, paths);
242 for (
int i = 0; i < flow; i++) {
243 size_t size = paths[i].size();
247 for (j = 0; j < size - 1; j++) {
249 edge.
seq = (int) (j + 1);
251 edge.
end_id = paths[i][size - 1];
252 edge.
node = paths[i][j];
258 path_elements.push_back(edge);
261 edge.
seq = (int) (j + 1);
263 edge.
end_id = paths[i][size - 1];
264 edge.
node = paths[i][j];
266 path_elements.push_back(edge);
boost::property_map< G, boost::edge_reverse_t >::type rev
boost::graph_traits< G >::edge_descriptor E
boost::graph_traits< G >::vertex_descriptor V
int64_t get_vertex_id(V v)
std::map< int64_t, V > id_to_V
void create_edge_disjoint_paths_graph(pgr_basic_edge_t *data_edges, size_t total_tuples, const std::set< int64_t > &source_vertices, const std::set< int64_t > &sink_vertices, bool directed)
std::map< V, int64_t > V_to_id
boost::graph_traits< G >::out_edge_iterator Eout_it
V get_boost_vertex(int64_t id)
boost::property_map< G, boost::edge_capacity_t >::type capacity
boost::graph_traits< G >::vertex_iterator V_it
void get_edge_disjoint_paths(std::vector< General_path_element_t > &path_elements, int64_t flow)
void flow_dfs(V vertex, int64_t path_id, std::vector< std::vector< int64_t > > &paths)
std::map< E, int64_t > E_to_id
boost::property_map< G, boost::edge_residual_capacity_t >::type residual_capacity
boost::graph_traits< G >::edge_iterator E_it
int64_t boykov_kolmogorov()