簡體   English   中英

結合使用Boost Boost_shortest_path_nonnegative_weights()和捆綁屬性

[英]Use Boost successive_shortest_path_nonnegative_weights() with bundled properties

好吧,標題說明了一切,但我根本無法使它正常工作:(提供的程序是示例程序,出於演示目的-不僅僅是從我的項目中復制粘貼)

#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/successive_shortest_path_nonnegative_weights.hpp>
#include <boost/property_map/property_map.hpp>
#include <boost/tuple/tuple.hpp>


typedef boost::adjacency_list_traits<boost::vecS, boost::vecS, boost::directedS> DirectedGraphTraits;
struct VertexProperty{ };
struct EdgeProperty{
    double edge_capacity;
    double edge_weight;
    DirectedGraphTraits::edge_descriptor reverse_edge;
    EdgeProperty(double distance, DirectedGraphTraits::edge_descriptor reverseEdge) :
                edge_capacity(1), edge_weight(distance), reverse_edge(reverseEdge) {
        };
    EdgeProperty(double distance) :
        edge_capacity(0), edge_weight(-distance){}
    EdgeProperty(){};
};
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperty, EdgeProperty> DirectedGraph;

void addEdge(DirectedGraph::vertex_descriptor source, DirectedGraph::vertex_descriptor target, double distance, DirectedGraph g){
    std::pair<DirectedGraphTraits::edge_descriptor,bool> reverse = (boost::add_edge(source,target,EdgeProperty(distance),g));
    boost::add_edge(target,source,EdgeProperty(distance,reverse.first),g);
}

int main(void) {
    typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperty, EdgeProperty> DirectedGraph;
    DirectedGraph g(6+2);

//add some edges here
//From source
addEdge(0,1,.0,g); addEdge(0,2,.0,g); addEdge(0,3,.0,g);
//Middle
addEdge(1,4,.2,g); addEdge(2,5,.3,g); addEdge(3,4,.1,g); addEdge(3,5,.4,g);
//To sink
addEdge(4,7,.0,g); addEdge(5,7,.0,g); addEdge(6,7,.0,g);

    boost::successive_shortest_path_nonnegative_weights(g,0,7,
        boost::capacity_map(boost::get(&EdgeProperty::edge_capacity,g))).
        boost::reverse_edge_map(boost::get(&EdgeProperty::reverse_edge,g)).
        boost::weight_map(boost::get(&EdgeProperty::edge_weight,g)));
    std::cout<<"Hi";
    return 0;
}

我收到以下錯誤:

error: ‘boost::reverse_edge_map’ is not a member of   ‘boost::bgl_named_params<boost::bundle_property_map<boost::adjacency_list<boost::vecS, boost::vecS, boost::directedS, VertexProperty, EdgeProperty>, boost::detail::edge_desc_impl<boost::directed_tag, long unsigned int>, EdgeProperty, double>, boost::edge_capacity_t, boost::no_property>’

我要去哪里錯了? (我正在使用Boost 1.55,因為該算法僅在該版本中定義)

編輯:我解決了問題,將在幾個小時內提供答案。

解決的辦法是我使用了稍微錯誤的語法(在實際上沒有必要的地方使用boost::說明符),並且沒有輸出映射。 解:

std::map<DirectedGraph::edge_descriptor, int> edge2rescap;
    boost::associative_property_map<std::map<DirectedGraph::edge_descriptor, int> > out(edge2rescap);

    boost::successive_shortest_path_nonnegative_weights(g, 0, 7,
            capacity_map(boost::get(&EdgeProperty::edge_capacity, g))
            .reverse_edge_map(boost::get(&EdgeProperty::reverse_edge, g))
            .weight_map(boost::get(&EdgeProperty::edge_weight, g))
            .residual_capacity_map(out));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM