使用boost :: successive_shortest_path_nonnegative_weights的最小成本最大流量

时间:2016-03-02 11:54:22

标签: c++ algorithm boost graph max-flow

我需要使用

计算流网络的最小成本最大流量
boost::successive_shortest_path_nonnegative_weights()

BGL中可用的功能(v 1_60_0)。 正如documentation中指定的那样,

  

表示网络的有向图G =(V,E)必须被扩充以包括E中每个边的反向边。也就是说,输入图应该是Gin =(V,{E U ET})。 [...] CapacityEdgeMap参数上限必须将E中的每个边缘映射到正数,并将ET中的每个边缘映射到0. WeightMap必须将每个边缘从E映射到非负数,并且每个边缘从ET到-weight的权重它的反转边缘。

我有一个简单的功能,对于添加到图表中的每个边缘,添加一个具有上述指定的容量和重量的反向边缘:

void add_edge_and_reverse(vertex_desc& source, vertex_desc& target, Edge& edge, flow_network_t& fn, boost::associative_property_map<std::map<edge_desc, edge_desc>>& rev_map)
{
    std::pair<edge_desc, bool> e = boost::add_edge(source, target, edge, fn);
    Edge reverse_edge(-edge.cost, 0);
    std::pair<edge_desc, bool> e_rev = boost::add_edge(target, source, reverse_edge, fn);
    rev_map[e.first] = e_rev.first;
    rev_map[e_rev.first] = e.first;
}

现在,图形包含反向边缘,并且它们具有负权重,这与我使用的算法的名称明显不同。 因此,当我执行算法时,我收到此错误:

ValueError: The graph may not contain an edge with negative weight.

我做错了什么?

1 个答案:

答案 0 :(得分:0)

刚遇到同样的问题。经过几分钟的调试后,我发现了问题。我使用浮动类型作为权重。因此,对于数值误差,修改的边缘权重(负权重的dijkstra的版本)可能略微低于0。 可能的解决方案可能是重写&#34; successive_shortest_path_nonnegative_weights.hpp&#34;这样就可以计算出小的负值