我知道这可能被选为重复版(因为我已经看过这个Negative weights using Dijkstra's Algorithm我认为SO中的答案都不是我想要的。 我感兴趣的是在图中具有一个负边缘的Dijkstra算法的解决方案,但Dijkstra仍将显示正确的解决方案。那个图表怎么样?我无法想象,或者我还不够理解Dijkstra如何处理负边缘。而且我知道有一个带负边的图可以用Dijkstra遍历并且仍然有正确的路径。不要告诉我请使用Bellman-Ford或Johnson的算法。
答案 0 :(得分:0)
事实上,Dijkstra的算法试图通过比较可以达到目标的路径成本并以最低成本获取路径来找到最短路径。因此,它基本上可以节省从起点到每个可以帮助您实现目标的单个节点的最低成本。它通过比较节点和最后一个节点的新成本来做到这一点,所以如果负值不影响该顺序(负边缘是最短路径的一部分),路径没有问题(但是你得到了错误的路径成本)。还有一种情况是负边缘无法引导您进入目标(它不是任何路径的一部分),那么您在路径和成本方面没有任何问题。也许你可以找到第三个例子,边缘是一条带你到达目标的路径的一部分,但它仍然不是最短路径的一部分。 希望这有帮助, 祝你好运。
答案 1 :(得分:0)
如果负边缘的绝对值小于无向图表中任何其他边缘的权重,那么Dijkstra算法将正常工作。
这可以确保我们不会遇到以后从队列中弹出的节点的距离会更新的情况。与典型设置(仅正权重)一样,一旦我们将一个节点从队列中弹出,我们就可以保证我们无法通过较短的路径到达它。
注意:此不适用于有向图,在目标端点从队列中弹出后可能会遇到负边缘的源端点(因此可能需要更新弹出的节点。)
答案 2 :(得分:0)
示例可以是任何图形,其中负边缘通向顶点而没有边缘开始。