Проверка веса отрицательного ребра в dijkstra_shortest_paths

Я использую библиотеку графа ускорения, чтобы вызвать dijkstra_shortest_paths . Однако у меня есть кое-что особенное: weight_map на самом деле является функтором. Следовательно, каждый раз, когда библиотеке boost требуется вес ребра, вызывается мой функтор, он выполняет сложные вычисления и возвращает результат обратно в boost.

К сожалению, в dijkstra_shortest_paths.hpp структура Метод dijkstra_bfs_visitor explore_edge имеет вызов get к карте весов только для проверки, является ли возвращаемое значение отрицательным. Я полностью осознаю, что не могу использовать алгоритм Дейкстры с отрицательными значениями, и уверен, что мой функтор возвращает только положительные значения. Однако эта проверка приводит к тому, что мой функтор вызывается дважды для каждого ребра. Поскольку он выполняет сложное вычисление, я бы хотел избежать его повторения (результаты не меняются между вызовами .. каждое ребро получает одинаковое ожидание во время выполнения dijkstra_shortest_paths ).

Пока что, Я вручную проверяю ребро, переданное функтору, и в случае повторного вызова возвращаю предыдущий запомненный результат. Очевидно, что это скорее обходной путь, чем решение.

Я попытался передать своего собственного посетителя, который перезаписывает explore_edge , однако исходный метод, определенный dijkstra_bfs_visitor от boost, все еще применяется.

Кто-нибудь знает, есть ли лучший способ справиться с этой ситуацией и как-то избежать проверки веса отрицательного ребра?

8
задан ildjarn 15 July 2011 в 15:17
поделиться