2013-02-25 26 views
3

My图表具有以下声明使用boost :: push_relabel算法

struct vertex_info 
{ 
    std::string name; 
    std::string label;  
    unsigned int type; 
    bool isND; 
}; 

struct edge_info 
{ 
    std::string name; 
    long capacity; 
    long residualCapacity; 
    long rev; 
}; 

typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS 
    , vertex_info, edge_info > expr_graph_t; 

我已经构建的曲线图(流网络)flowGsourcesink节点。现在我想用升压图库中给出的push_relabel方法来计算最大流量。我正在调用如下函数。

push_relabel_max_flow(flowG, source, sink 
     , get(&edge_info::capacity, flowG) 
     , get(&edge_info::residualCapacity, flowG) 
     , get(&edge_info::rev, flowG) 
     , get(boost::vertex_index, flowG) 
    ); 

编译器(g ++)正在生成长错误消息(pasted here)。我怀疑我无法将正确类型的地图传递给函数。功能签名可用here in boost-doc

在文档中给出了很多例子,但它们使用的图形与我的不同。我不能改变图形声明,否则很多代码都会中断。我不习惯提高property_map的概念。

+1

一个问题(可能是问题)是'reverse_edge_map'需要一个属性映射,其中key_type = edge_descriptor和value_type = edge_descriptor,你使用的值是value_type = long。你可以使用'adjacency_list_traits :: edge_descriptor'声明你的'rev'。如果你添加一个简单的示例图,我可以尝试使其工作。 – 2013-03-18 14:37:28

+0

谢谢你。发生了一些事情。如果我不能理清它,我会创建一个小例子并让你知道。 – Dilawar 2013-03-18 16:10:35

+0

@llonesmiz男人,你救了我的一天。不能够感谢。请添加此作为答案,我会接受它。再次感谢。 :-) – Dilawar 2013-03-18 16:18:06

回答

2

此解决方案归因于llonesmiz。

的问题是,reverse_edge_map需要属性地图为key_type = edge_descriptor和VALUE_TYPE = edge_descriptor和我用一个具有VALUE_TYPE = long。我宣称revadjacency_list_traits<vecS,vecS,bidirectionalS>::edge_descriptor。它编译以为我生成了一个seg-fault,我认为这是一个功能逻辑问题,而不是函数原型。

+2

[这里](http://liveworkspace.org/code/4c3IQV$0)是一个使用[这个例子图]的例子(http://www.boost.org/libs/graph/doc/graph_theory_review.html #sec:网络流的算法)。 – 2013-03-20 15:21:16