在无向图中找出负循环

时间:2014-03-18 17:42:24

标签: algorithm graph cycle

我尝试使用谷歌搜索,但没有任何有价值的内容。

图表:

  • 是无向的。
  • 表示为具有双边的有向图。
  • 可能包含负权重的边。

我知道我可以使用Bellman-Ford在定向情况下解决这个问题,但是对于无向边缘,它只会返回单边(2个周期)作为其输出。我需要找到一个大小>的周期2。

此外,该算法应具有运行时复杂度O(V * E)和内存复杂度O(V)。

1 个答案:

答案 0 :(得分:2)

查看http://en.wikipedia.org/wiki/Bellman%E2%80%93Ford_algorithm中的算法,在步骤2中,您考虑使用每个边(u,v)来找到v的较短路径,如果您看到改进,则通过设置前一个来记录它[ v] =你。这意味着在每个阶段你都知道每个节点的前身 - 所以你可以通过在设置前任[v] = u之前检查前一个[u]!= v来消除长度两个周期。

通过消除这些循环,您可以更改导入的不变量 - 在每个阶段,您现在可以找到距离s最短的路径,最多i个边缘不包括任何长度为2个周期。

从源头到达的长度为3或更大的循环仍然应该出现 - 在您应该找到每个最短路径长度达到访问每个顶点所需的长度之后,对负循环的检查会寻找明显的改进。

示例:考虑G = {{A,B,C,D},{AB = 2,AC = 2,BC = -3,BD = 1,CD = 1}}。

更新,更新B然后更新C然后D:

A = 0,B = C = D =无穷大

A = 0,B = 2,A,C = -1,B,D = 0,C

A = 0,B = 1来自D,C = -2来自B,D = -1来自C

A = 0,B = 0来自D,C = -3来自B,D = -2来自C

A = -1,来自C,B = -1来自D,C = -4来自B,D = -3来自C ...

这证明了在存在负循环的情况下距离将无限期地持续变化:

另外假设。然后有一个稳定的距离分配:任何可能的任何距离更新都不会减少它。这意味着检查可能减小距离的边缘的顺序是无关紧要的,因为对于这种情况,每个边缘在被检查时都保持距离不变。

在负循环中选择一个点并考虑从该点开始的路径,直到它绕回并再次到达自身。由于检查此路径中的第一条边会使所有内容保持不变,因此该边缘远端的距离减去该边缘近端的距离必须不大于沿边缘的距离。类似地,沿路径的两个步长减去路径起点处的距离必须不大于沿着相关两个边缘的距离之和,或者我们将更新到两个点中更远的距离。继续,我们计算出(圆形)路径末端的距离必须不超过(圆形路径)的起点加上沿该路径的边缘的总和,或者某些东西会被更新。但是路径的起点和终点是相同的点,因为它是圆形的,沿边缘的距离之和是负的,因为它是一个负循环,所以我们达到了一个矛盾,实际上必须有一些更新一旦我们检查了圆形路径上的所有边缘。

相关问题