如何从Kruskal MST的捆绑属性中获取重量图?

时间:2013-02-07 09:08:32

标签: c++ boost boost-graph

我正在尝试将Kruskal的最小生成树应用到我的图形中,以将其从无向循环图转换为真实树。边缘权重都是相同的,因为MST是否唯一无关紧要。

到目前为止,我已按如下方式实施:

typedef boost::adjacency_list<boost::setS, boost::listS, 
            boost::undirectedS, CoordNode, CoordSegment> BGraph;

class CoordSegment {
public:
    double weight;
[...]
}

我需要在图表中添加一些功能,因此我的图形对象实际上是一个衍生物(如果这很重要):

class Graph : public BGraph {
protected:
    unsigned int _idCounter;

[...]
}

我的问题在这里:

// compiles ok
boost::property_map<BGraph, double CoordSegment::*>::type weightMap = boost::get(&CoordSegment::weight, _graph);

    std::vector<EdgeDesc> tree;
// doesn't compile 
    boost::kruskal_minimum_spanning_tree(_graph, std::back_inserter(tree), weightMap);

它抱怨如下:

\src\PGraphSkel.cpp(376) : error C2784: "void boost::kruskal_minimum_spanning_tree(const Graph &,OutputIterator,const boost::bgl_named_params<P,T,R> &)": template-argument for "const boost::bgl_named_params<P,T,R> &" could not be deduced from "boost::bundle_property_map<Graph,Descriptor,Bundle,T>".
1>        with
1>        [
1>            Graph=BGraph,
1>            Descriptor=boost::detail::edge_desc_impl<boost::undirected_tag,void *>,
1>            Bundle=CoordSegment,
1>            T=double
1>        ]
1>        C:\Libraries\boost_1_46_1\boost/graph/kruskal_min_spanning_tree.hpp(120): See declaration of 'boost::kruskal_minimum_spanning_tree'

为什么它会抱怨它?

如何将bundled_property_map转换为此Kruskal MST函数所需的正确bgl_named_pa​​rams参数?

1 个答案:

答案 0 :(得分:0)

继承定义的adjacency_list模板类并不是一个好主意。删除此继承解决了这个问题。使用boost :: graph作为成员变量并将其他所有内容包装在一个类中更好。