Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm Dijkstra的未访问节点';s算法?_Algorithm_Graph Theory_Shortest Path - Fatal编程技术网

Algorithm Dijkstra的未访问节点';s算法?

Algorithm Dijkstra的未访问节点';s算法?,algorithm,graph-theory,shortest-path,Algorithm,Graph Theory,Shortest Path,在Dijkstra算法的优先级队列实现中,我们移除顶部的节点,将其标记为已访问,并更新与顶部相邻的所有顶点的距离值 在执行此操作时,我们是否需要检查与顶部相邻的顶点是否已被访问,或者是否更新所有顶点的顶点,而不管它们是否已被访问?您是否只想知道节点的可达性,还是想知道可达性以及最小距离 对于仅可访问性,在标记为已访问后不要更新 对于†可达性和最小距离,如果距离小于(节点中的当前值+从当前节点到达邻居节点的成本),则更新该距离。否则就让它保持原样 †这种情况下的一种情况是,机器人试图从其当前

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


在执行此操作时,我们是否需要检查与顶部相邻的顶点是否已被访问,或者是否更新所有顶点的顶点,而不管它们是否已被访问?

您是否只想知道节点的可达性,还是想知道可达性以及最小距离

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


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

您是只想知道节点的可达性,还是想知道可达性以及最小距离

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


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

假设从优先级队列中移除的当前节点是
cur
,那么我们需要检查cur节点是否可以找到任何可以缩短任何相邻节点距离的边,然后我们需要更新距离


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

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


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

它取决于实现

事实上,r甚至没有提到堆-但它只处理连接到未访问节点的边(因此只检查未访问的边),一些实现(例如C.L.r.S中表示的实现)会更新连接到已处理节点的所有节点

dijkstra原稿的相关引用:

从p开始的最小长度路径已知(集合A),其他路径已知(集合 B、 C)。。。考虑连接节点的所有分支 集合A中的节点位于集合B或集合C中


上面的引文专门考虑了只更新从未发现的节点。

它取决于实现

事实上,r甚至没有提到堆-但它只处理连接到未访问节点的边(因此只检查未访问的边),一些实现(例如C.L.r.S中表示的实现)会更新连接到已处理节点的所有节点

dijkstra原稿的相关引用:

从p开始的最小长度路径已知(集合A),其他路径已知(集合 B、 C)。。。考虑连接节点的所有分支 集合A中的节点位于集合B或集合C中


上面的引文特别考虑了只更新从未发现的节点。

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

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

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

希望这有帮助。现在,如果忽略这一点,则没有问题。没有复杂性变化,但会发生松弛操作的冗余检查。

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

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

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

希望这有帮助。现在,如果忽略这一条,则没有问题。没有复杂度变化,但会发生松弛操作的冗余检查。

如果图中没有带负权重的边,则无论哪种方法,算法都应该正常工作。如果图中没有带负权重的边,那么无论哪种方法,算法都应该正常工作。如果有的话,反正也不行。