Я использую библиотеку графов повышения, чтобы позвонить dijkstra_shortest_paths
. Однако у меня есть кое-что особенное в том, что weight_map
на самом деле является функтором. Следовательно, каждый раз, когда библиотеке boost требуется вес ребра, вызывается мой функтор, он выполняет сложное вычисление и отправляет результат обратно в boost.
К сожалению, в dijkstra_shortest_paths.hpp
метод examine_edge
структуры dijkstra_bfs_visitor
имеет get
вызов карты весов только для проверки, является ли возвращаемое значение отрицательным. Я полностью осознаю, что не могу использовать алгоритм Дейкстры с отрицательными значениями, и я уверен, что мой функтор возвращает только положительные значения. Однако эта проверка приводит к тому, что мой функтор вызывается дважды для каждого ребра. Поскольку он выполняет сложные вычисления, я бы хотел избежать его повторного выполнения (результаты не меняются между вызовами... каждое ребро получает одно и то же ожидание во время dijkstra_shortest_paths
запуска).
Пока что я вручную проверяю ребро, переданное функтору, и в случае повторного вызова возвращаю предыдущий запомненный результат. Это явно скорее обходной путь, чем решение.
Я попытался передать свой собственный посетитель, который перезаписывает examine_edge
, однако исходный метод, определенный dijkstra_bfs_visitor
повышения, все еще применяется.
Кто-нибудь знает, есть ли лучший способ справиться с этой ситуацией и как-то избежать проверки веса отрицательного края?
struct DijkstraVisitorConcept
и перегрузить свою собственную функциюvoid constraints()
, где вы можете вообще удалить проверкуexamine_edge()
. - person A. K.   schedule 21.07.2011