图Dijkstra:初始填充队列

Boost::graph Dijkstra : initially populating the queue

本文关键字:填充 队列 Dijkstra      更新时间:2023-10-16

我使用boost::graph和它的Dijkstra实现。

我想计算从一组顶点到另一组顶点的最短路径。我不想计算这些集合之间的所有可能路径

这个想法是这样的:我在一个有不同街道入口的建筑里。所以我可以从这些街道开始我的旅程。但是我只对最短的那条感兴趣。

如果我使用我自己的Dijkstra算法的实现,我就会做以下事情:

  • 对于每个起始节点,距离映射到0
  • 将起始节点加入优先队列

虽然使用boost::dijkstra_shortest_paths_no_init很容易将距离图设置为0,但我不知道如何将节点添加到优先队列中。我查看了源代码,这似乎是不可能的。因此,我正在考虑定义我自己的Combine函子,如果我到达其中一个开始节点,它将返回0距离,但它看起来相当难看。

我可以创建一个虚拟节点,并从虚拟节点向起始节点添加边。但是,这会触发一些我希望避免的并发访问问题。

我是否错过了boost库中的一个可能性,或者有人知道一个聪明的解决方案。我还在考虑修补boost,以允许自定义初始化优先级队列。

我没有使用boost::graph,我希望有更好的知识的人会给一个更好的答案,但也许你可以创建一个图形类型包装现有的图,留下原始的未修改,但暴露给算法的视图,包括你的虚拟节点和边?如果不是,复制整个图是不是不可行的?