【发布时间】:2016-01-12 20:27:04
【问题描述】:
我查看了 dijkstra 算法 found here 的实现,但它似乎适用于负权重。
具体来说,relax 方法会更新顶点在优先级队列中的距离,如果它最初不在队列中,则将其重新插入。
而且由于没有任何检查来确保我们不会重新插入已知顶点,所以这个实现会不会更像是一个贝尔曼福特算法,我们不断插入顶点来访问和放松,直到用完减少距离的边缘?
例如:
在下图中以A为源运行时,我们首先确定以下距离:
C = 0
B = 1
D = 99
然后在我们移除队列之后,我们剩下 (D, 99),这使我们访问顶点 D 并放松它。当放松顶点 D 时,我们发现 (D to B = -300),这使得到 B 的距离为 -201。现在使用上面的“放松”方法,我们将 (B, -201) 重新插入到队列中。现在我们取队列的最小值,即我们刚刚插入的 (B, -201)。由此,我们放松 B,我们可以得到到 C 的距离为 -200。
我知道任何负循环都会使程序不会终止,但是如果我们得到一个没有负循环的图呢? 希望我在这里没有遗漏任何琐碎的事情。感谢您的帮助!
【问题讨论】:
-
在任何周期尝试负重。
-
这个问题仅关于 SO 就有相当多的历史,但看看他的CS answer。