Ric*_*sol 7 algorithm graph graph-algorithm max-flow ford-fulkerson
假设我在图G =(V,E)上运行Ford-Fulkerson算法,结果是最大流量f max,它与最小切割Xmin相关联.我有兴趣通过增加图中任何一个边的容量来尽可能地增加流量.我如何识别这个边缘?
一种策略可能是:给定初始顶点s和最终顶点t,考虑从s到t的所有路径并验证具有较低容量的边缘.例如,如果我有1/1的边,这是我必须增加容量的顶点.
是否有解决此问题的通用算法?
一旦找到了图中的最大流量,如果从s到u以及从残差图中的v到t存在正容量路径,则增加边沿(u,v)的容量将仅增加最大流量.如果不是这种情况,那么在增加之后残差图中将不存在增强路径,因此最大流量将保持最大.
在具有此属性的边(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).
希望这可以帮助!