Re: [Boost-users] [Graph] newbie to graph (Andrew Sutton)
Hello, Thank you for your reply. I implemented your suggestions but the problem persists. Below is the current version of my code: --------------------------------------------------------------CODE---------------------------------------------------------------------- #include <boost/config.hpp> #include <iostream> #include <string> #include <boost/graph/kolmogorov_max_flow.hpp> #include <boost/graph/adjacency_list.hpp> #include <boost/graph/write_dimacs.hpp> #include <boost/graph/read_dimacs.hpp> using namespace boost; struct Arc; struct Node; typedef adjacency_list<vecS,vecS,directedS,Node,Arc> Graph; struct Arc { long capacity; long residual_capacity; Graph::edge_descriptor reverse; }; struct Node { std::string name; }; int main() { typedef Graph::vertex_descriptor vertex_descriptor; typedef Graph::edge_descriptor edge_descriptor; typedef std::pair<edge_descriptor, bool> EdgePair; typedef std::pair<int,int> Pair; Graph g; property_map<Graph, long Arc::*>::type capacity = get(&Arc::capacity, g); property_map<Graph, Graph::edge_descriptor Arc::*>::type rev = get(&Arc::reverse,g); long flow; vertex_descriptor s, t; Pair edge_array[6] = { Pair(0,1), Pair(0,2), Pair(0,3), Pair(2,4), Pair(1,3), Pair(4,3), }; EdgePair edge_desc_obj; EdgePair edge_from_first=add_edge(edge_array[0].first,edge_array[0].second,g); g[edge_from_first.first].capacity=1; for (int i = 1; i < 5; ++i){ edge_desc_obj=add_edge(edge_array[i].first, edge_array[i].second,g); g[edge_desc_obj.first].capacity=i+1; } EdgePair edge_to_last=add_edge(edge_array[5].first,edge_array[5].second,g); g[edge_to_last.first].capacity=4; char str[2]; int i=0; vertex_descriptor v1=*vertices(g).first,v2=*vertices(g).second; while (v1!=v2) { sprintf(str,"%d",i); g[v1].name=str; std::cout << str; v1++; i++; } edge_descriptor from_s,to_t; from_s=edge_from_first.first; to_t=edge_to_last.first; s=source(from_s,g); t=target(to_t,g); flow = kolmogorov_max_flow(g, s, t); return 0; } -------------------------------------------------------------------END OF CODE------------------------------------------------------------------ The compilation output of the code above includes errors and can be found here: http://www.cs.huji.ac.il/~lweizm45/compile_output2.txt<http://www.cs.huji.ac.il/%7Elweizm45/compile_output2.txt> Again, if I remove the call to kolmogorv_max_flow, everyting is fine. If I replace the call to kolmogorov_max_flow with the line: write_dimacs_max_flow(g, capacity, identity_property_map(),s, t, std::cout); The output is: -------------------------------------- OUTPUT ------------------------------------------------------ c DIMACS max-flow file generated from boost::write_dimacs_max_flow p max 5 6 n 1 s n 4 t a 1 2 1 a 1 3 2 a 1 4 3 a 2 4 5 a 3 5 4 a 5 4 4 ---------------------------------------- END OF OUTPUT -------------------------------------------------- Which means that the graph was created correctly. Any suggestions? Thanks, Lior
The compilation output of the code above includes errors and can be found here:
Again, if I remove the call to kolmogorv_max_flow, everyting is fine. If I replace the call to kolmogorov_max_flow with the line:
write_dimacs_max_flow(g, capacity, identity_property_map(),s, t, std::cout);
One of the errors appears to be the result of a missing header in
read_dimacs. For the rest of the problems, the algorithm does not know how to access the correct property maps from your graph type. You have to pass the required property maps when you call the algorithm. kolmogorov_max_flow(g, s, t, capacity_map(capacity). residual_capacity_map(residual). reverse_edge_map(reverse)); And so on until all of the property maps have been provided. Andrew Sutton andrew.n.sutton@gmail.com
participants (2)
-
Andrew Sutton
-
Lior Weizman