假设我在图G =(V,E)上运行Ford-Fulkerson算法,结果是最大流量f max ,这与最小切割相关联XMIN。我有兴趣通过增加图中任何一个边缘的容量来尽可能地增加流量。我如何识别这个边缘?
一种策略可能是:给定初始顶点 s 和最终顶点 t ,考虑从 s 到 t 并验证容量较低的边缘。例如,如果我有1/1的边,这是我必须增加容量的顶点。
是否有解决此问题的通用算法?
答案 0 :(得分:7)
一旦找到了图表中的最大流量,增加边缘容量(u,v)只会增加最大流量,如果从s到u以及从v到t的正容量路径残差图。如果不是这种情况,则在增加后残差图中不会有增量路径,因此最大流量将保持最大值。
在具有此属性的边(u,v)中,在增加(u,v)的容量之后,可以从s推到t的最大额外流量将是有界的。如果你可以推动任何流过这条边,你必须通过找到从s到u的路径和从v到t的路径来实现。这样做时,两条路径中的每条路径都会出现瓶颈边缘,并且流量不会增加超过此值。因此,解决问题的一个选择是执行以下操作:
换句话说,如果你可以计算图中的最大瓶颈路径,你可以找到应该在时间O(B(m,n)+ m)增加的边,其中B(m,n)是计算图中最大瓶颈路径的成本。
幸运的是,这是一个经过充分研究的问题,可以使用Dijkstra算法的变体来解决,而不是存储每个节点的最低成本路径,而是存储每个节点的最大瓶颈路径。快速谷歌搜索应该提供一些额外的信息。使用Fibonacci堆,您可以在时间O(m + n log n)中实现此搜索,因此用于识别容量应该增加的边缘的总运行时间也应该是O(m + n log n)。
希望这有帮助!