考虑我们有一个网络流量并使用Edmond-Karp算法,我们已经在网络上拥有最大流量。现在,如果我们向网络添加任意边缘(具有一定容量),更新最大流量的最佳方法是什么?我正在考虑更新有关新边缘的残留网络,并再次寻找扩充路径,直到找到新的最大流量,但我不确定它是否有效,或者它是否是最好的方法!添加边缘后更新最大流量
回答
做maxflow后,你知道每个边缘流动的内容的数量。
所以,当边的成本变化,你可以做以下的事情:
- 假设,内容流由边缘
w
。 - 现在做一个
forward dfs
和一个backward dfs
从边缘和撤消总共w
内容从它连接的边缘。
在此,每个边缘由x/y
,其中y
意味着边缘容量和x
表示意味着它流动的内容。
现在您想将边缘4->3
的成本从2
更改为3
。
所有你需要做的就是做从4->3
边缘forward and backward dfs
和撤消2
重量从这些边缘为4->3
流入w=2
内容。
下面是该过程将是这样的:
现在你几乎完成:)
- 更改边缘
4->3
从2
成本到3
并再次尝试找到扩充路径:) 如果新的边缘成本大于目前的成本比你将不必撤销的重量。你可以尝试找到一个改变边缘容量的增强路径。
但如果容量减少,你要撤消的重量,并设法找到可增广路。
如果一个新的边缘添加,你可以添加边缘,并尝试如有发现可增广路。而已。
让我知道如果你发现它是二fficult理解或者如果我错了不知何故:)
编辑:
实际上添加一个新的边并不是很困难 - 在添加边之前您已经有了边的流量/容量,然后添加了边和它的倒数。然后运行你用来寻找扩充路径的算法,直到找到非零流量,就是这样。大部分最大流量已经被发现,所以这应该(理论上)不会太慢。我不知道你正在使用哪种最大流量算法,所以我不能更具体,但可能在添加新边缘后违反了算法的属性,从而以最优方式找到最大流量。你仍然已经处理了大部分图表,所以这不应该是一个太大的问题。
无论您用于最大流量的原始算法是什么,我都会建议您使用Ford-Fulkerson算法来完成任务。我认为在大多数最大流量已经被发现的情况下,它会表现良好。
实际上,我使用的是Edmond-Karp算法,它是福特 - 福克森的变体。唯一的区别是,在寻找增强路径的每个步骤中,它使用BFS,因此它将具有最小数量的边缘。它可以证明,在整数容量下,我们可以在多项式时间内完成工作! – Nima 2014-12-13 19:54:33
好的。这应该做得更好。 – 2014-12-13 19:56:39
- 1. 页脚边缘出现大量边缘。可以使用这个
- 2. 最大流量
- 3. 边缘预算最大简单路径
- 4. 找到最大号码。图的边缘
- 5. 根据边缘属性添加多个边缘使用igraph
- 6. Swift:创建边缘按钮和添加文本边缘
- 7. 最大流边约束
- 8. Graphviz,更改边缘的大小
- 9. java - 如何找到MST中最大的加权边缘?
- 10. 轻量级边缘
- 11. 如何从一个顶点获得边缘属性的最大值的边缘
- 12. 使用Cytoscape.js添加边缘标签
- 13. 向自定义边缘添加颜色
- 14. 添加边缘折叠以COSE布局
- 15. 在Seaborn JointGrid中为边缘添加yticks
- 16. 如何添加“无关”边缘
- 17. 如果每条边的容量增加,最大流量的变化
- 18. Python/NetworkX:通过边缘发生的频率向边缘添加权重
- 19. 贪婪的最大流量
- 20. 获取边缘检测后的边缘坐标(Canny)
- 21. 溢出:滚动; CSS添加边框到页面的边缘?
- 22. 如何用matplotlib为烛台添加边框或边缘颜色?
- 23. 对齐边缘xcode 7.0灰色,无边距约束更新
- 24. 如何测量边缘检测图像边缘的长度?
- 25. 添加新行后MongoDB React.js更新表
- 26. 添加新表后更新ormlite_config.txt
- 27. 添加新元素后,mCustomScrollbar不更新
- 28. 如何更改JUNG边缘的边缘标签?
- 29. jQuery的旁边添加(后添加)
- 30. 更新最小最大最新与加盟
非常感谢。我还有两个问题。首先,为什么我们需要撤回重量2呢?为什么我们不能只是改变容量,并检查扩充路径?我认为如果它是最小切割的边缘之一,那么我们可能能够通过它发送更多的流动,否则不可能发送更多的流动,因为最小切割限制流动!第二,你的回答提到能力的变化。如果我添加一个新的边缘怎么办?例如添加容量4的边缘*** 4-> 6 ***? – Nima 2014-12-13 20:02:39
不错的问题。 好吧,考虑一下新边缘成本大于当前成本的情况,在我们的示例中边缘4→3从2变为3.在这种情况下,您不必撤消重量。你可以尝试找到一条增加路径,将边缘的容量改为3. 但是如果容量减少会怎样?那就是4-> 3的容量减少到0.那么我认为以前的技术将无法工作,所以你必须撤销重量并尝试找到一条增强路径。 对于第二个问题,您可以添加边,并尝试找到扩充路径(如果可用)。而已。因为在这里你得到一条新路。 – 2014-12-14 05:31:16
好的,我明白了。还有一个问题!当从源到边缘有多条路径改变时,或者从改变边缘的末端节点到接收器有多条路径。我们如何决定撤销哪条路径?例如,这里是从3到7的多条路径。因此有不同的方法来撤销流程。我应该如何选择要撤消的路径? – Nima 2014-12-14 21:23:11