Ich habe den folgenden Code, der einen ungerichteten Graphen erzeugt:Minimum Spanning Tree mit Boost-
// --- Header File ---
class Node { ... };
struct Edge { float weight; };
typedef adjacency_list<vecS, vecS, undirectedS, Node, Edge> Grafo;
class MST
{
public:
MST(std::vector<Node> nodes);
Grafo g;
vector<edge_t> build();
};
// --- cpp File ---
MST::MST(std::vector<Node> nodes) { // build the graph by setting vertices and edges... }
vector<edge_t> MST::build()
{
vector<edge_t> mst;
kruskal_minimum_spanning_tree(g, std::back_inserter(mst));
return mst;
}
Das Problem ist in der Zeile, die ich Kruskal nennen: kruskal_minimum_spanning_tree()
. Wenn ich diese Zeile Kommentar wird es in Ordnung kompilieren, und ich kann die Grafik mit graphviz exportieren (können Sie die Grafik bei webgraphviz.com sehen):
graph G {
0[label="a"];
1[label="b"];
2[label="c"];
3[label="d"];
4[label="e"];
0--1 [label=80.4487381];
0--2 [label=406.060333];
0--3 [label=405.738831];
0--4 [label=434.203857];
1--2 [label=25.9422436];
1--3 [label=210.344955];
1--4 [label=246.965591];
2--3 [label=35.805027];
2--4 [label=35.1283379];
3--4 [label=167.5858];
}
Aber wenn ich versuche, mit dieser Linie zu kompilieren bekomme ich eine Menge von Fehlern von Boost (ich benutze g ++ 4.9.2). Der erste Fehler ist: error: forming reference to void typedef value_type& reference;
, dieser Fehler wird mehrmals wiederholt. Andere Fehler, die angezeigt wird:
error: no matching function for call to 'get(boost::edge_weight_t, const boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Symbol, Edge>&)'
get(edge_weight, g));
Also habe ich versucht, get(edge_weight, g);
vor Aufruf der Kruskal Methode hinzufügen, aber ich habe Notizen sagen:
note: types 'boost::subgraph<Graph>' and 'const boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, Symbol, Edge>' have incompatible cv-qualifiers
get(edge_weight, g));
und
note: mismatched types 'const boost::two_bit_color_map<IndexMap>' and 'boost::edge_weight_t'
get(edge_weight, g));
I don‘ Ich weiß was zu tun ist. Dies ist das erste Mal, dass ich Boost Graph Library verwende. Es ist sehr mächtig, aber nicht leicht zu verstehen.
Es hat funktioniert. Jetzt kam ich auf die Idee der Eigentumsdeklaration. Du hast mir eine Boost-Lektion gegeben, vielen Dank. – psylo