提升:将dijkstra_shortest_path()应用于filtered_graph

时间:2014-09-12 10:42:28

标签: boost graph

我有一个捆绑属性的图表

//property
struct Edge
{
    int distance;
};

//graph
typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::bidirectionalS, Node, Edge> graph_t;

//predicate
template <typename Graph>
struct Filter
{
    const Graph gr;
    Filter(const Graph &g): gr(g) {}
    bool operator() (const Edge &e) const {
        if(gr[e].distance < 5) return 0;
        return 1;
    }
};

Filter <graph_t> filter(g);
boost::filtered_graph <graph_t, Filter <graph_t> > fg(g, filter);

我想将dijkstra_shortest_path算法应用于过滤图。

std::vector<int> d(num_vertices(fg));
std::vector<v> p(boost::num_vertices(fg));
boost::dijkstra_shortest_paths(fg, nodes[0], boost::weight_map(get(&Edge::distance, fg))
        .distance_map(boost::make_iterator_property_map(d.begin(), get(boost::vertex_index, fg)))
        .predecessor_map(boost::make_iterator_property_map(p.begin(), get(boost::vertex_index, fg))));

我在编译时得到的错误是:

/Users/artem/Documents/boost_1_55_0/boost/concept_check.hpp:142:错误:对象类型&#39; boost :: filter_iterator&gt;,boost :: keep_all,boost :: filtered_graph,Filter&gt;,升压:: keep_all&GT; &gt;,boost :: detail :: out_edge_iter,void *&gt ;, Edge&gt; *&gt ;, unsigned long,boost :: detail :: edge_desc_impl,long&gt; &GT;&#39;无法分配,因为隐式删除了其复制赋值运算符       a = b; //需要赋值运算符         ^

什么是不正确的?无法理解,如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

正如本post所述,您的operator()应该接受边缘描述符,而不是边缘。

例如,您可以尝试这样的事情:

bool operator() (const boost::graph_traits<graph_t>::edge_descriptor& e) const 
{
    ... get the variable edge of type Edge from the edge_descriptor e in some way ...

    if(gr[edge].distance < 5) return 0;
    return 1;
}

所有这些都使boost::graph非常烦人。我希望开发人员能够提高可用性,目前这种可用性非常差。

查看this post可能也很有用。