使用Bellman Ford获得负循环


20

我必须在有向加权图中找到一个负周期。我知道Bellman Ford算法是如何工作的,它告诉我是否存在可达到的负周期。但是它没有明确命名。

如何获取循环的实际路径?v1,v2,vk,v1

应用标准算法后,我们已经进行了次迭代,因此不可能进一步改进。如果我们仍然可以降低到节点的距离,则存在负循环。n1

我的想法是:由于我们知道仍然可以改善路径的边缘,并且知道每个节点的前身,因此我们可以从该边缘追溯到直到再次遇到它为止。现在我们应该有一个循环。

可悲的是,我没有找到任何可以告诉我这是否正确的论文。那么,它真的像那样工作吗?

编辑:此示例证明我的想法是错误的。给定下图,我们从节点运行Bellman-Ford 。1

在此处输入图片说明

我们按的顺序处理边缘。经过次迭代后,我们得到节点距离:n 1a,b,c,dn1
2 - 30 3 - 151:5
2:30
3:15

父表:有父有父有父
3 2 3 3 213
23
32

现在,进行第次迭代,我们发现仍可以使用边沿改善节点的距离。因此,我们知道存在一个负循环,而是其中的一部分。1 一个一个n1aa

但是,通过追溯到父表的方式,我们陷入了另一个负循环,再也不会相遇。c,da

我们如何解决这个问题?

Answers:


14

您在大多数情况下是正确的。再增加一个。在尝试查找循环时返回前身链时,到达起始顶点或到目前为止在前身链中已经看到的任何其他顶点时,您将停止。基本上,每当您使用前身向后移动时,只要检测到周期,就停止并输出顶点。v1

至于论文,一个简单的Google搜索就会产生Xiuzhen Huang:Negative-Weight Cycle Algorithms。另外,他们还列出了另一种算法,用于查找从源顶点无法获得的负权重循环。s


链接断开。
human.js 2015年


我只是使用黄教授的想法,但我不明白为什么他要同时添加一个新的源节点和一个新的目标(s'and t')。在我看来,一个新的源节点通过任意长度的边缘连接到所有现有的顶点,将会打开所有循环。
阿布纳萨尔

0

您的示例与您的想法并不矛盾。确实,您发现了一个负面循环。我认为您的示例所说明的想法是,源顶点可能不是负周期中的节点。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.