带有Dijkstra算法的有向图的优先级队列/最小堆

时间:2013-05-07 21:43:42

标签: c heap priority-queue dijkstra

对于作业,我需要使用实现为最小堆的优先级队列来实现Dijkstra算法。我已经有一个实现,其中我使用距离表和未处理的顶点的无序数组。 (如页面底部here所述)。

下面给出了一个示例输入文件,其中第一行是顶点数,后面的每一行是:source,destination,weight。

3
1 2 3
3 2 1
1 3 1

我最初的想法是将图中的每个边缘视为堆中的一个节点,但这是不对的,因为其中一个测试文件有15677372个边缘,我甚至无法立即创建一个大的数组段错误。在使用未处理的顶点数组实现该方法之后,似乎我需要以某种方式用堆替换该数组,但我不确定如何去做。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

通常,在Dijkstra算法中,您的优先级队列将保存图中的节点以及到目前为止到该节点的最佳估计距离。标准技术是将图中的所有节点排入最初距离为∞的优先级队列,然后根据需要使用队列的减少键操作来降低它们。

从内存的角度来看,这通常是完全不可行的,因此另一种解释是最初将队列保持为空,然后在距离0处使用起始节点对其进行播种。每次处理节点时,都要更新距离估计值。每个相邻的节点。您可以按如下方式执行此操作:

  • 如果节点已在优先级队列中,您可以使用减小键来降低节点的距离。
  • 如果节点尚未在优先级队列中,则以所需的优先级插入它。

这使得优先级队列对于非荒谬密集的图形保持较小。

希望这有帮助!