Ich verwende Boost-Graphen, um Graphen zu verwalten, und ich muss einen Maxmin-Baum erstellen.
Jetzt versuche ich Boost Dijkstra-Algorithmus zu verwenden, aber ich verwende einen Zeiger auf meine Klasse als Vertex-Eigenschaft anstelle von typedef property<vertex_index_t, int> my_prop
, und ich kann es jetzt nicht ändern.
Also, wie kann ich Vorgänger-Map und Distanz-Map für mein Diagramm erstellen?Wie boost :: graph dijkstra Algorithmus verwenden, wenn Vertex-Eigenschaften Zeiger sind?
Mein Code sieht wie folgt aus (und diese Vorgänger und Abstandskarten funktionieren nicht):
struct LinkStruct {...};
class Node {...};
typedef Node* NodePtr;
typedef adjacency_list<listS, listS, bidirectionalS, NodePtr, LinkStruct> MyGraph;
typedef MyGraph::vertex_descriptor vertex_descriptor;
MyGraph m_graph;
// Fill the graph
{...}
// Dijkstra parameters
std::vector<vertex_descriptor> result_tree(some_struct.size(), MyGraph::null_vertex());
std::vector<uint32_t> result_distances(some_struct.size(), 0);
// Compute maxmin tree
dijkstra_shortest_paths_no_color_map(
m_graph, // Graph
root_vertex, // Start vertex
weight_map(boost::get(&LinkStruct::weight, m_graph)). // Link property map
distance_compare([](uint32_t first, uint32_t second) -> bool {
return first > second; }). // Compare maxmin path lengths (if maxmin > maxmin)
distance_combine([](uint32_t first, uint32_t second) -> uint32_t {
return (first > second) ? second : first; }). // Get min weight of the path
predecessor_map(make_iterator_property_map(result_tree.begin(),
boost::get(vertex_index, m_graph))). // Result tree
distance_map(make_iterator_property_map(result_distances.begin(),
boost::get(vertex_index, m_graph))) // Result distances
);
P. S.
Ich benutze Zeiger in Vertex-Definition, weil ich viele Graphen mit dem gleichen Knoten haben.
Vielleicht gibt es einen Weg herum, ohne Vertex-Eigenschaft in der Grafikdefinition zu ändern?
Was Sie ändert es stoppt? – Caleth
Kuriosität, es ist interessant, wenn es sogar möglich ist, wenn die Vertex-Eigenschaft ein Zeiger ist? – Ivan
Sie können einen externen Vertex-Index übergeben. Die Dokumentation zeigt wie.Es gibt Dutzende von Antworten auf SO (dies gilt auch, wenn der _default_ Vertex-Index nicht-integraler Typ ist, zB wenn die Vertex-Container-Auswahl nicht 'boost :: vecS' ist, also passiert es viel) – sehe