用于正电路的 Bellman-Ford 算法

Bellman-Ford algorithm for positive circuits

我正在处理一个有向图的项目,其中边的权重都取决于变量 x。 我试图找到 x 的最小值,使我的图形不包含任何正权重电路。

我的问题是 - 这可能很愚蠢,但我不明白 - : 我如何使用修改后的 Bellman-Ford 来检查是否存在正电路而不是负电路?

谢谢。

How can I use a modified Bellman-Ford to check for the presence of positive circuits instead of negative circuits ?

将所有权重更改为负值:

w'(u,v) = -w(u,v)

然后只是 运行 普通 BF。

您可以运行对该值进行二进制搜索x 以找到负循环所需的最小值,例如,在 O(logx) BF 调用中。


找到形成负循环所需的边 (u,v) 的最小权重的更有效解决方案是删除该边,找到从 vu 的最短路径.

现在,您可以知道边的权重应该是多少才能得到权重为 0 的循环,(-d(v,u)),除此之外 - 您有一个正循环,较少 - 负循环。

如果你想找到最短路径又不想使用负边,你可以使用与Bellman-Ford几乎相似的Dijkstra算法。

但是,如果您只想访问权重可能较低的边缘,您可以查看 "Prim's Algorithm" 或 "Kruskall Algorithm",这些用于查找 "Minimum Spanning Tree(MST)" 图形。

Dijkstra Algorithm

Prim's Algorithm

Kruskal's Algorithm