Источник проблемы был затронут в принятом вами ответе.
Однако это еще не все.
Во-первых, вы в значительной степени «по праву» хотите использовать Node::id
в качестве индекса вершины, и может быть много веских причин для использования чего-то другого, кроме vector
, в качестве селектора вершинного контейнера ¹.
Во-вторых, этот материал должен был ... наверное, сработать. bellman_ford
документы :
Тип PredecessorMap должен представлять собой карту свойств чтения / записи, тип ключа и вершины которой совпадает с типом дескриптора вершины графа.
А iterator_property_map
документы :
Эта карта свойств представляет собой адаптер, который преобразует любой итератор произвольного доступа в карту свойств Lvalue. Тип OffsetMap отвечает за преобразование ключевых объектов в целые числа, которые можно использовать как смещения с помощью итератора произвольного доступа.
Теперь LValuePropertyMap может фактически быть только для чтения, но в данном случае это явно не должно быть.
При использовании make_iterator_property_map
с дополнительным параметром id-map он должен фактически вести себя как любая ассоциативная карта свойств как для типа ключа, так и для типа значения vertex_descriptor
, как того требует алгоритм.
ОБНОВЛЕНИЕ См. "БОНУС" ниже
Я мог бы немного подробнее остановиться позже, чтобы понять, почему это не сработало, но сейчас давайте просто обойдем проблему, не изменяя модель графа:
Live On Coliru
auto gg = g.graph();
auto id = get(&Node::id, gg);
std::map<Graph::vertex_descriptor, Graph::vertex_descriptor> assoc_pred;
bellman_ford_shortest_paths(gg, n,
weight_map(get(&EdgeProperties::weight, gg))
.distance_map(make_iterator_property_map(dist.begin(), id))
.predecessor_map(make_assoc_property_map(assoc_pred))
);
Это работает как следует и как ожидалось:
Calling main()
1 --> 0
0 --> 1
There are 2 nodes and 2 edges in the graph
БОНУС
Я нашел недостающую ссылку: карта предшественника была определена с неправильным типом значения:
vector<Graph::vertex_descriptor> pred(n);
Очевидно, будет работать: Live On Coliru
¹ это немного отличается от дескриптора вершины, но связано в том смысле, что выбор контейнера вершин обычно предсказывает фактический тип дескриптора вершины