我正在开发一个带有有向图的项目,其中边的权重都取决于变量x。 我试图找到x的最小值,这样我的图表就不包含任何正权重的电路。
我的问题是 - 它可能很愚蠢,但我不知道如何 - : 如何使用修改后的Bellman-Ford来检查是否存在正电路而不是负电路?
感谢。
答案 0 :(得分:0)
如何使用经过修改的Bellman-Ford检查是否存在 正电路而不是负电路?
将所有权重更改为负值:
w'(u,v) = -w(u,v)
然后简单地运行常规BF。
您可以对该值x
运行二进制搜索,以查找负循环所需的最小值,例如,在O(logx)
BF的调用中。
找到制作负周期所需的最小权重(u,v)
的更有效的解决方案是删除该边缘,找到从v
到u
的最短路径。 / p>
现在,你可以知道边缘的权重应该是什么,以获得一个权重0的循环,(-d(v,u)
),除此之外的任何东西 - 你有一个正循环,少 - 负循环。
答案 1 :(得分:0)
如果你想找到最短的路径并且不想使用负边缘,你可以使用与Bellman-Ford几乎相似的Dijkstra算法。
但是,如果您只想访问权重可能较低的边缘,可以查看“Prim算法”或“Kruskall算法”,这些算法用于查找图形的“最小生成树(MST)”。