在Dijkstra算法的优先级队列实现中,我们删除顶部的节点,将其标记为已访问并更新与顶部相邻的所有顶点的距离值。
在这样做时,我们需要检查顶部附近的顶点是否已被访问过,或者我们是否为所有顶点更新顶点而不管它们是否已被访问过?
答案 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)
希望这会有所帮助。现在,如果你忽略这一点,那么没有问题..没有复杂性的变化,但是发生了松散操作的冗余检查。