考虑到我们有网络流并使用Edmond-Karp算法,我们已经拥有网络上的最大流量。现在,如果我们向网络添加任意边缘(具有一定容量),更新最大流量的最佳方法是什么?我正在考虑更新关于新边缘的剩余网络,并再次寻找扩充路径,直到我们找到新的最大流量,但我不确定它是否有效或是否是最佳方式!
答案 0 :(得分:4)
执行maxflow后,您就会知道每个边缘流动的内容量。
因此,当边缘成本发生变化时,您可以执行以下操作:
w
。forward dfs
和backward dfs
,并从其关联的边缘撤消总w
个内容。
此处每条边都由x/y
表示,其中y
表示边缘容量,x
表示其流动的内容。
现在您要将边4->3
的费用从2
更改为3
。
您需要做的就是从forward and backward dfs
边缘4->3
做2
,并在4->3
流w=2
内容的情况下从这些边缘撤消4->3
权重。
以下是流程:
现在你差不多完成了:)
2
的费用从3
更改为{{1}},然后再次尝试查找扩充路径:)如果您发现难以理解,或者我错了,请告诉我:))
编辑:
如果新的边缘成本高于当前成本,那么您不得不撤消重量。您可以尝试找到改变边缘容量的扩充路径。
但如果容量减少,你必须减轻重量并试图找到一条增强路径。
如果添加了新边,您只需添加边并尝试查找扩充路径(如果可用)。那就是它。
答案 1 :(得分:0)
实际上添加新边缘并不是很困难 - 在添加边缘之前,您有边缘的流量/容量,然后添加边缘及其反转。然后运行您用来查找扩充路径的算法,直到找到非零流量,就是这样。已经发现大部分最大流量,所以这应该(理论上)不要太慢。我不知道你使用的是哪种最大流算法,所以我不能更具体,但是在添加新边缘之后你可能会违反算法的属性,因此你会以次优的方式找到最大流量。您仍然已经处理了大部分图表,所以这不应该是一个太大的问题。
我建议您使用Ford-Fulkerson算法完成任务,无论您使用最大流量的原始算法是什么。我认为在大多数最大流量已经被发现的情况下它会表现良好。