用于正电路的 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)
的最小权重的更有效解决方案是删除该边,找到从 v
到 u
的最短路径.
现在,您可以知道边的权重应该是多少才能得到权重为 0 的循环,(-d(v,u)
),除此之外 - 您有一个正循环,较少 - 负循环。
如果你想找到最短路径又不想使用负边,你可以使用与Bellman-Ford几乎相似的Dijkstra算法。
但是,如果您只想访问权重可能较低的边缘,您可以查看 "Prim's Algorithm" 或 "Kruskall Algorithm",这些用于查找 "Minimum Spanning Tree(MST)" 图形。
我正在处理一个有向图的项目,其中边的权重都取决于变量 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)
的最小权重的更有效解决方案是删除该边,找到从 v
到 u
的最短路径.
现在,您可以知道边的权重应该是多少才能得到权重为 0 的循环,(-d(v,u)
),除此之外 - 您有一个正循环,较少 - 负循环。
如果你想找到最短路径又不想使用负边,你可以使用与Bellman-Ford几乎相似的Dijkstra算法。
但是,如果您只想访问权重可能较低的边缘,您可以查看 "Prim's Algorithm" 或 "Kruskall Algorithm",这些用于查找 "Minimum Spanning Tree(MST)" 图形。