Dijkstra算法中未访问过的节点?

时间:2015-10-20 17:38:53

标签: algorithm graph-theory shortest-path

在Dijkstra算法的优先级队列实现中,我们删除顶部的节点,将其标记为已访问并更新与顶部相邻的所有顶点的距离值。

在这样做时,我们需要检查顶部附近的顶点是否已被访问过,或者我们是否为所有顶点更新顶点而不管它们是否已被访问过?

4 个答案:

答案 0 :(得分:0)

您是否有兴趣仅了解节点的可达性或了解可达性以及最小距离

  • 对于仅可访问性,请勿在标记为已访问后对其进行更新。
  • 对于 可达性和最小距离,如果距离小于(节点中的当前值+从当前到达邻居节点的成本)节点),更新它。否则保持原样。

在这种情况下,一种情况是机器人试图从当前位置找到到达某个地方的最快路径。

答案 1 :(得分:0)

假设从优先级队列中删除的当前节点是cur,那么我们需要检查从cur节点我们可以找到任何可以减少任何邻接节点距离的边缘,然后我们需要更新距离。

请注意,当从优先级队列中删除节点时,这意味着我们已经从源顶点找到了该节点的最小距离。我认为您有点困惑,所以再次检查算法。

答案 2 :(得分:0)

它取决于实现。

事实是,Dijkstra's Algorithm original pape r甚至没有提到堆 - 但它只处理连接到未访问节点的边(所以只检查未访问的节点),一些实现(例如表示的那个) CLRS)更新连接到已处理节点的所有节点。

dijkstra原始论文的相关引言:

  

P的最小长度路径已知(设置A)和其他(设置   B,C)...考虑连接刚转移到的节点的所有分支   使用集合B或C

中的节点设置A.

以上引述仅考虑更新尚未发现的节点。

答案 3 :(得分:0)

两种情况都没有问题(假设存在负重循环,这是应用dijkstra的前提条件)。但是我们通常会删除有效代码的冗余,这就是为什么已经访问过的节点没有更新,因为它已经放松了。我们这样检查

if(dist == initial distance) then only apply a step

otherwise leave it...(pop and then go to next node in priority queue)

希望这会有所帮助。现在,如果你忽略这一点,那么没有问题..没有复杂性的变化,但是发生了松散操作的冗余检查。