Boost :: graph Dijkstra: изначально заполняется очередь - PullRequest
4 голосов
/ 06 октября 2011

Я использую boost::graph и его реализацию Dijkstra.

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

Идея заключается в следующем: я нахожусь в здании с входами на разных улицах.Так что я могу начать свое путешествие по любой из этих улиц.Но меня интересует только самый короткий.

Если бы я использовал свою собственную реализацию алгоритма Дейкстры, я бы сделал следующее:

  • Для каждого начального узла,карта расстояний до 0
  • Добавьте начальный узел в очередь приоритетов.

Хотя установить карту расстояний на 0 с помощью boost::dijkstra_shortest_paths_no_init легко, я не могу понять, как добавитьузел в очереди приоритетов.Я посмотрел на исходный код, и он кажется почти невозможным.Поэтому я подумываю определить свой собственный функтор Combine, который будет возвращать расстояние 0, если я достигну одного из начальных узлов, но это выглядит довольно уродливо.

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

Я пропустил возможность в библиотеке boost или кто-то знает об умном обходном пути.Я также подумываю о том, чтобы исправить буст, чтобы разрешить пользовательскую инициализацию очереди с приоритетами.

1 Ответ

1 голос
/ 06 октября 2011

Я не использовал boost :: graph, и я надеюсь, что кто-то с лучшим знанием этого даст лучший ответ, но, возможно, вы могли бы создать тип графа, который оборачивает существующий граф, оставляя исходный неизмененным, но подвергая воздействиюалгоритм, который включает в себя ваши виртуальные узлы и ребра?Если нет, то невозможно ли скопировать весь график?

...