以下练习的问题:
令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"
有任何反馈意见吗?我忽略了一些不起作用的情况吗?
答案 0 :(得分:2)
你的问题留下了一些细节,例如,这是一个整数流程图(可能是的,尽管Ford-Fulkerson,如果它收敛,也可以在其他网络上运行),以及你究竟如何定义两个流程是不同的(将函数映射到流的边缘是不同的,或者实际流动的边缘集必须是不同的,这是一个更强的要求)。
如果网络不一定是整数流,那么,不,这不一定有效。考虑下面的图表,其中,在每个边缘,括号内的数字代表实际流量,括号左边的数字代表容量(例如,每个(a,c)的容量< / em>和(c,d)为1.1,每个流的流量为1.):
在此图表中,流程不是唯一的。通过(a,b)和(b,d)浮动0.5,可以使总计1流动。但是,你的算法通过将每个边缘的容量减少到低于当前流量的1来获得这一点。
如果网络是整数,则无法保证找到与当前边缘不同的一组参与边缘。您可以通过以下图表看到它:
但是,最后,如果网络是整数流网络,并且不同流的含义只是边缘与流的不同函数,那么您的算法是正确的。
充足如果您的算法找到具有相同总结果的不同流,那么显然新流是合法的,而且,必然,至少有一个边流动与以前不同的金额。
必要性假设流量与原始流量不同(总值相同),其中至少有一个流量不同。比如说,对于每个边缘,替代解决方案中的流量不小于原始解决方案中的流量。由于流量不同,因此必须存在至少一个边缘,其中替代解决方案中的流量增加。然而,如果没有不同的边缘减少流量,则存在违反流量守恒或原始解决方案不理想的情况。因此,存在一些边缘 e ,其中替代解决方案中的流程低于原始解决方案中的流程。由于它是整数流网络,因此 e 上的流量必须至少低1。但是,根据定义,将 e 的容量减少到至少比当前流量低1,不会使替代流量非法。因此,如果 e 的容量减少,则必须找到一些替代流程。
答案 1 :(得分:1)
有一个更好的运行时解决方案,您不需要检查每一个边缘。 创建一个剩余网络(https://en.wikipedia.org/wiki/Flow_network)。在剩余网络图上运行DFS,如果找到圆圈,则表示存在另一个最大流量,其中至少一个边缘上的流量不同。