使用Bellman Ford检测产品超过阈值的周期

时间:2018-05-18 07:08:16

标签: c++ algorithm graph bellman-ford

Bellman Ford用于检测图中的负加权循环。我想知道如何使用它来检测超过某个阈值的周期。

示例:

Arrays

此图表有2个周期。一个产品= 1,另一个产品= 4.如果阈值= 1,算法应该输出真,因为有一个产品的循环> 1.

2 个答案:

答案 0 :(得分:3)

我假设你想检测一个重量超过某个阈值的简单循环(否则,你可以重复任何正重量> 1个循环足够的时间以超过任何正阈值)。

不幸的是,这个问题是NP-Hard

Hamiltonian cycle problem

简单缩减

给定哈密顿循环问题的实例G=(V,E),对于任何边缘保持相同的图Gw(e) = 2,并将其发送到阈值为2^|V|-1的问题。
如果有任何一个重量大于2^|V|-1, then it has more than | V | -1`边的循环,那么这个循环是哈密顿的,如果有一个哈密顿循环,算法会发现有一个循环重量2 * 2 * ... * 2> 2 ^ | V | -1

由于哈密顿循环是Np完全的,我们发现它的多项式减少到这个问题,这个问题是NP-Hard,并且没有已知的多项式解。

tl; dr:使用Bellman Ford解决这个问题,远非微不足道,如果可能的话,需要将图形修改为原始图形的指数(假设P!= NP)

答案 1 :(得分:0)

问题的部分解决方案

只要阈值等于1,此解决方案就可以正常工作。

tl; dr 通过应用对数并使用Floyd-Warshal检测负周期来改变边的权重,如果周期的原始权重的乘积大于1,则会发生负周期。

长答案。 Floyd-Warshal可用于APSP,也可用于检测negative cycles in a graph。为了解决这个问题,解决方案是找到否定。循环,执行以下操作:

  • 根据邻接矩阵构建图表
  • 使用log(weight of edge) * (-1)
  • 初始化矩阵的值

如果原始值小于1,则此value将变为正数,或换句话说:对于大于1的所有值,此{{3}}为负。

log(m * n) = log(m) * log(n)开始,我们不必再乘以获得结果,只需添加日志即可。

因此,如果算法发现负循环,我们就可以知道它从原始循环边缘产生的产品大于1.