Использование связанных свойств в качестве карты весов в dijkstra_shortest_paths

Возможно, это глупый вопрос, но я пытаюсь использовать 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 невероятно непрозрачна для меня. Если вы скажете мне, где в документации описан пример, я тоже был бы очень рад.

Заранее спасибо!

9
задан Carlos Scheidegger 20 August 2010 в 00:18
поделиться

1 ответ

На случай, если кого-то это волнует, использование версии вызова с именованным параметром, похоже, сработало следующим образом:

    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))));

Это находится в документации, здесь . Однако я до сих пор не знаю, как использовать версию вызова с «безымянным параметром».

11
ответ дан 4 December 2019 в 09:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: