Возможно, это глупый вопрос, но я пытаюсь использовать dijkstra_shortest_paths
BGL, и, в частности, использовать поле моего связанного свойства Edge в качестве weightmap. Мои попытки в настоящее время привели к десяткам страниц ошибок компилятора, так что я надеюсь, что кто-то знает, как мне помочь. По сути, так выглядит мой код:
struct GraphEdge {
float length;
// other cruft
};
struct GraphVertex {
...
};
typedef boost::adjacency_list
<boost::vecS, boost::vecS, boost::directedS,
GraphVertex, GraphEdge> GraphType;
Я могу заполнить график без проблем, однако, когда дело доходит до вызова dijkstra_shortest_paths
, у меня возникают проблемы. Я хотел бы использовать поле length
. В частности, я хотел бы знать, что нужно для повышения вуду, чтобы он соответствовал вызову, подобному этому:
GraphType m_graph;
vector<int> predecessor(num_vertices(m_graph));
vector<float> distances(num_vertices(m_graph), 0.0f);
vector<int> vertex_index_map(num_vertices(m_graph));
for (size_t i=0; i<vertex_index_map.size(); ++i) {
vertex_index_map[i] = i;
}
dijkstra_shortest_paths(m_graph, vertex_from, predecessor, distances,
weightmap, vertex_index_map,
std::less<float>(), closed_plus<float>(),
(std::numeric_limits<float>::max)(), 0.0f,
default_dijkstra_visitor());
// How do I write the right version of weightmap here?
так, чтобы карта весов каким-то образом ассоциировала конкретное ребро моего графа с соответствующим полем длины
в собственности. Я уверен, что есть простой способ сделать это, но документация для BGL невероятно непрозрачна для меня. Если вы скажете мне, где в документации описан пример, я тоже был бы очень рад.
Заранее спасибо!
На случай, если кого-то это волнует, использование версии вызова с именованным параметром, похоже, сработало следующим образом:
dijkstra_shortest_paths(m_graph, vertex_from,
weight_map(get(&TrafficGraphEdge::length, m_graph))
.distance_map(make_iterator_property_map(distances.begin(),
get(vertex_index, m_graph))));
Это находится в документации, здесь . Однако я до сих пор не знаю, как использовать версию вызова с «безымянным параметром».