【问题标题】:Algorithm: Check if max flow is unique算法:检查最大流量是否唯一
【发布时间】:2016-10-17 12:23:56
【问题描述】:

以下练习的问题:

令 N = (V,E,c,s,t) 是一个流网络,使得 (V,E) 是无环的,并且令 m = |E|。描述一个多项式- 时间算法,通过解决 ≤ m + 1 个最大流问题来检查 N 是否具有唯一的最大流。 说明算法的正确性和运行时间

我的建议如下:

run FF (Ford Fulkerson) once and save the value of the flow v(f) and the flow over all egdes f(e_i)
for each edge e_i with f(e_i)>0:
    set capacity (in this iteration) of this edge c(e_i)=f(e_i)-1 and run FF. 
    If the value of the flow is the same as in the original graph, then there exists another way to push the max flow through the network and we're done - the max flow isn't unique --> return "not unique"
    Otherwise we continue 

we're done with looping without finding another max flow of same value, that means max flow is unique -> return "unique"

有任何反馈吗?我是否忽略了一些不起作用的情况?

【问题讨论】:

    标签: algorithm graph max unique flow


    【解决方案1】:

    您的问题留下了一些细节,例如,这是一个整数流图(可能是的,尽管 Ford-Fulkerson,如果它收敛,也可以在其他网络上运行),以及您如何准确定义两个流是不同的(映射边到流的函数是否不同就足够了,或者实际流动的边集必须不同,这是一个更强的要求)。


    如果网络不一定是整数流,那么,不,这不一定有效。考虑下图,其中,在每条边上,括号内的数字代表实际流量,括号左侧的数字代表容量(例如,每个 (a, c) 和 (c, d) 是 1.1,每个的流量都是 1.):

    在此图中,流是非唯一的。通过 (a, b)(b, d) 浮动 0.5 可以总共流动 1。但是,您的算法不会通过将每个边的容量降低到其当前流量以下 1 来找到这一点。


    如果网络是整数,则不能保证找到与当前边缘不同的一组参与边缘。通过下图可以看出:


    不过,最后,如果网络是整数流网络,并且不同流的含义只是边与流的不同函数,那么您的算法是正确的。

    1. 充分性如果您的算法找到具有相同总结果的不同流,那么显然新流是合法的,而且,必然地,至少有一条边在流动与以前不同的数量。

    2. 必要性假设存在与原始流量不同的流量(总值相同),至少有一条边的流量不同。说,对于每条边,替代解决方案中的流量不小于原始解决方案中的流量。由于流量不同,因此在替代解决方案中的流量必须至少有一条边增加。但是,如果没有不同的边缘减少流量,则要么违反流量守恒,要么原始解决方案次优。因此,存在一些边e,其中替代解决方案中的流量低于原始解决方案中的流量。由于它是一个整数流网络,因此在 e 上的流必须至少低 1。但是,根据定义,将 e 的容量减少到至少比当前流量低 1,不会使替代流量非法。因此,如果 e 的容量减少,则必须找到一些替代流程。

    【讨论】:

    • 感谢您的详细解答!由于提到的两点(整数流,不同流的含义)在练习中没有进一步定义,因此算法与所做的假设/简化一起工作就足够了。
    • @Harry 您可能还需要在证明中包含一个简短的说明,即生成的算法确实是多项式的(因为它的时间复杂度是 O(|E| * C),其中 C 是福特-富尔克森)。
    • 很好的证明,但是如果算法返回 False 会发生什么?您必须证明在这种情况下只有一个唯一的流函数。
    【解决方案2】:
    • 非整数、有理流可以“缩放”为整数
    • 更改边缘容量是有风险的,因为某些边缘可能很关键,并且包含在每个最大流量中

    有更好的运行时解决方案,您无需检查每一条边。 创建一个残差网络 (https://en.wikipedia.org/wiki/Flow_network)。在残差网络图上运行DFS,如果找到一个圆圈,则表示还有另一个最大流,其中至少一条边上的流不同。

    【讨论】: