私はブーストのプリムのアルゴリズムを使用して、エッジ重みと、エッジ重みだけでなくID番号を使って最小スパニングツリーを見つけようとしています。C++ブーストプリムのアルゴリズムはカスタムウェイトを使用していますか?
たとえば、両方のエッジウェイトが1の場合、IDは比較されますが、どちらか小さい方がネクタイを壊します。
EdgeWeightクラスを作成し、これを行うために<と+演算子をオーバーロードしてから、動作することを期待してedge_weight_tプロパティをintからEdgeWeightに変更しました。
// TestPrim.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <boost/config.hpp>
#include <iostream>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/prim_minimum_spanning_tree.hpp>
using namespace std;
class EdgeWeight{
public:
EdgeWeight(){}
EdgeWeight(int weightIn, int destinationIdIn){
weight = weightIn;
destinationId = destinationIdIn;
}
bool operator<(const EdgeWeight& rhs) const {
if (weight < rhs.weight)
return true;
else if(weight == rhs.weight){
if (destinationId < rhs.destinationId)
return true;
else
return false;
}
else
return false;
}
EdgeWeight operator+(const EdgeWeight& rhs) const {
EdgeWeight temp;
temp.weight = weight + rhs.weight;
temp.destinationId = destinationId + rhs.destinationId;
return temp;
}
int weight;
int destinationId;
};
int _tmain(int argc, _TCHAR* argv[])
{
using namespace boost;
typedef adjacency_list < vecS, vecS, undirectedS, property<vertex_distance_t, EdgeWeight>, property < edge_weight_t, EdgeWeight > > Graph;
typedef std::pair < int, int >E;
const int num_nodes = 5;
E edges[] = { E(0, 2), E(1, 3), E(1, 4), E(2, 1), E(2, 3),
E(3, 4), E(4, 0)
};
EdgeWeight weights[] = { EdgeWeight(1, 2), EdgeWeight(1, 3), EdgeWeight(2, 4),
EdgeWeight(7, 1), EdgeWeight(3, 3), EdgeWeight(1, 4), EdgeWeight(1, 0) };
Graph g(edges, edges + sizeof(edges)/sizeof(E), weights, num_nodes);
property_map<Graph, edge_weight_t>::type weightmap = get(edge_weight, g);
std::vector < graph_traits <Graph>::vertex_descriptor > p(num_vertices(g));
prim_minimum_spanning_tree(g, &p[0]);
for (std::size_t i = 0; i != p.size(); ++i)
if (p[i] != i)
std::cout << "parent[" << i << "] = " << p[i] << std::endl;
else
std::cout << "parent[" << i << "] = no parent" << std::endl;
return EXIT_SUCCESS;
}
私はエラー、「Cました:エラーC2440: ':int型 'に '' から変換することはできません' マイクロソフトのVisual Studio 10.0 \ VCの\ \ \プログラムファイル(x86の)は\限度(92)が含まれD ' 1>コンストラクタがソースタイプを取ることができなかった、またはコンストラクタのオーバーロードの解像度があいまいでした。 "
これは正しい方法ですか?これを行うより良い方法はありますか?
http://www.boost.org/doc/libs/1_38_0/libs/graph/doc/prim_minimum_spanning_tree.html http://www.boost.org/doc/libs/1_38_0/boost/graph/prim_minimum_spanning_tree.hpp
編集:[OK]をので、私は今のCJMの摂動法を使用して重みを実施したが、中私は、何とか上記の方法を使用する必要があります信じている未来はまだそれを
EDIT2を行う方法を疑問に思っ:エレミヤのREPONSEに基づいて、私はEdgeWeightにint型からvertex_distance_tを変更したが、同じエラー
このエラーは、アルゴリズムとは何かを持っているようにそれはいないようですか?そのファイルの92行目は何ですか?このエラーがどこに表示されているのですか? –
私は結び目を破るより簡単な方法は、端の重みを非常に小さな数だけ摂動させることだと思います。例えば。あなたのエッジウェイトが最初は整数の場合、ウェイト5の2つのエッジの場合、ウェイトが4.9、ウェイトが5.1になります。どのように物事を混乱させるかは、あなたが期待しているネクタイ/エッジウェイトのドメインに依存します。 – cjm
私はそれを推測することができます。私はタイプを使って "正しい"方法をしようとしていました。 – stack356