J'utilise le graphe boost pour gérer les graphes et j'ai besoin de faire un arbre maxmin.
Maintenant, j'essaie d'utiliser l'algorithme de boost dijkstra, mais j'utilise un pointeur vers ma classe en tant que propriété vertex au lieu d'utiliser typedef property<vertex_index_t, int> my_prop
, et je ne peux pas le changer maintenant.
Alors, comment puis-je créer predecessor_map et distance_map pour mon graphe?Comment utiliser l'algorithme boost :: graph dijkstra si les propriétés de vertex sont des pointeurs?
Mon code ressemble à ceci (et ces cartes prédécesseurs et de distance ne fonctionne pas):
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
);
post-scriptum
J'utilise un pointeur dans la définition de vertex parce que j'ai beaucoup de graphes avec le même noeud.
Peut-être qu'il existe un moyen de contourner sans modifier la propriété vertex dans la définition graphique?
Qu'est-ce qui vous empêche de le changer? – Caleth
Curiosité, c'est intéressant s'il est même possible de le faire quand la propriété vertex est un pointeur? – Ivan
Vous pouvez passer un index de vertex externe. La documentation montre comment.Il y a des dizaines de réponses sur SO montrant (cela s'applique aussi quand l'index _default_ vertex est de type non-entier, comme quand la sélection de vertex container n'est pas boost :: vecS, donc ça arrive beaucoup) – sehe