给定网络流G(V,E)。在我们运行FF算法并获得残差grpah Gf和min-cut(S,T)
之后我想知道最小数量的边E'⊂E,使得每个e∈E的容量增加一个单位将使最大流量增加到val(f)+1。该算法应在O(E * log(V))中运行。
这是我的方法。
对于每个交叉边缘(u,v)
(1)使用BFS查找到u的部分扩充路径;以及从v到t的所有部分增强路径。如果存在这样的部分增强路径。然后增加(u,v)可以使最大流量增加1。
如果(1)为假,
可能性很小
(a)在残差中,源s没有外边缘
(b)在残差中,下沉t没有进入边缘。
(c)以上两种情况都发生了
在(a)的情况下,最小割有一组只包含源s。找到从交叉边到t的最短路径,这个距离+ 1(交叉边)将是我们的最小值。通过在O(E * log(V))时间内使用Dijlstra算法
在(b)的情况下,类似地,找到从交叉边到t的最短路径(假设这个交叉边是(u,v)而v在T中,v到t是所有交叉边的最短路径),这个距离+ 1 +从s到u的最短路径距离=将所有容量增加1的最小边数导致最大流量增加一个
在(c)的情况下,我们需要寻找从s到t的最短路径;我们可以在O(E * log(V))时间内应用Dijlstra算法。
但是,我认为上述方法可以实现目标但效率不高(特别是在处理案例(2)时,它可能无法在E * log(V)时间内运行)。
是否有更简单的接近方式?
答案 0 :(得分:0)
如果容量是整数,那么这似乎相当简单。
从S使用深度优先搜索到使用具有备用容量的链接查找从那里可到达的所有节点。将这些节点放在一个集合中并标记它们。
从T使用深度优先搜索到找到所有可以使用具有备用容量的链接到达T的节点。用不同的方式标记这些节点。
使用广度优先搜索来查找从S到达任何可到达的节点的任何节点的最短路径。从可从S到达的节点集开始。在每个阶段查看是否有任何可以到达T的节点是当前集合中节点的邻居。如果是这样,那么你就完成了。如果不是,那么下一阶段的集合是当前集合中未标记的节点的邻居集合。标记新集合中的所有节点。
如果容量不是整数,那么创建任何流量都不会给你至少一个流量,那么我认为你在https://en.wikipedia.org/wiki/Minimum-cost_flow_problem的土地上。