Hello,
Applying the suggestion below:
struct Node {
std::string name;
long index;
boost::default_color_type color;
long distance;
graph_traits<Graph>::edge_descriptor predecessor;
};
struct Arc {
long capacity;
long residual;
graph_traits<Graph>::edge_descriptor rev;
};
With the following call:
flow = kolmogorov_max_flow(g, s, t,
capacity_map(get(&Arc::capacity, g)).
residual_capacity_map(get(&Arc::residual, g)).
reverse_edge_map(get(&Arc::rev, g)).
predecessor_map(get(&Node::predecessor, g)).
color_map(get(&Node::color, g)).
distance_map(get(&Node::distance, g)).
vertex_index_map(get(&Node::index, g))
);
Resulted with many errors.But I think I found the right way. The following code compiles without errors or warnings:
----------------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;
Graph::edge_descriptor predecessor;
default_color_type color;
long distance;
long index;
};
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, long Arc::*>::type res_capacity
= get(&Arc::residual_capacity, g);
property_map<Graph, Graph::edge_descriptor Arc::*>::type reverse
= get(&Arc::reverse,g);
property_map<Graph,Graph::edge_descriptor Node::*>::type predecessor
= get(&Node::predecessor,g);
property_map<Graph,default_color_type Node::*>::type color
= get(&Node::color,g);
property_map<Graph,long Node::*>::type distance
= get(&Node::distance,g);
property_map<Graph,long Node::*>::type index
= get(&Node::index,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;
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,capacity,res_capacity,reverse,predecessor,color,distance,index,s,t);
return 0;
}
-----------------------------END OFCODE-----------------
However when trying to run this code I receive "Segmentation error". (this error does not appear when I remove the call to kolmogorov)
I work under linux and I tried to compile with both g++ and g++-3.3
The valgrind output can be found at:
http://www.cs.huji.ac.il/~lweizm45/valgring_output.txt
Any suggestions?
Lior