0

クラスカルの最小スパニングツリーをグラフに適用して、無向循環グラフから実際のツリーに変換しようとしています。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をこのKruskalMST関数に必要な適切なbgl_named_pa​​rams引数にするにはどうすればよいですか?

4

1 に答える 1

0

定義されたadjacency_listテンプレートクラスから継承することは、単に良い考えではありません。この継承を削除すると、問題が解決しました。boost ::graphをメンバー変数として使用し、他のすべてをクラスでラップする方がはるかに優れています。

于 2013-09-05T07:14:04.733 に答える