Dijkstra的优先级队列算法是否找不到目标?

时间:2015-04-01 23:00:55

标签: algorithm graph-theory graph-algorithm dijkstra

我知道算法是如何工作的 - 但是当使用优先级队列试图找到无法找到的目标节点时,它似乎会无休止地在循环中反弹。

Dijkstra的算法是否处理节点与图表断开连接的情况?

2 个答案:

答案 0 :(得分:4)

在每次迭代中,从优先级队列中提取一个节点,并且永远不会再添加它。因此,优先级队列最终将变为空,并且算法在发生时停止。如果没有到目标节点的路径,则无法到达的节点将其前任指针设置为nil(这是它们的初始值)。

该算法通常采用以下两种方式之一制定:

  • 首先将开始节点添加到优先级队列。在这种情况下,算法将在找到所有可到达节点后停止。
  • 首先将所有节点添加到优先级队列。在这种情况下,当队列中只剩下无法到达的节点时,您将开始提取无法到达的节点,但每个节点的距离都是无穷大,因此它们永远不会为任何其他节点提供更短的路径。

答案 1 :(得分:1)

长话短说,它不会循环,因为Dijkstra是BFS(逐级移动)+贪婪(放松从前一级到当前级别的距离),它确实遍历回到之前的level。当队列为空时,算法将结束。

如果找不到目的地,算法应返回-1或null。