Bellman Ford用于检测图中的负加权循环。我想知道如何使用它来检测超过某个阈值的周期。
示例:
Arrays
此图表有2个周期。一个产品= 1,另一个产品= 4.如果阈值= 1,算法应该输出真,因为有一个产品的循环> 1.
答案 0 :(得分:3)
我假设你想检测一个重量超过某个阈值的简单循环(否则,你可以重复任何正重量> 1个循环足够的时间以超过任何正阈值)。
不幸的是,这个问题是NP-Hard。
简单缩减给定哈密顿循环问题的实例G=(V,E)
,对于任何边缘保持相同的图G
和w(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.