网络流之最小割
网络流之最小割(参考《挑战程序设计竞赛》)
上一篇关于最大流总结中,关于最大流正确性的证明只是逻辑上的理解与思考。下面需要讨论一下关于最大流正确性的严格证明。
最小割问题与之前的最大流问题有着很深的联系。
假设在原图中,删掉某些边,能够使得从s出发到不了t,则这些边的集合被称作图的割。
定义在残余网络中,从s及s出发可达的点v组成的集合为S,其余点组成的集合为T。
定义最小割,为容量和最小的割。
由算法可知,对于任意流f而言,(f的流量)= (S的出边总流量)-(S的入边总流量),由此可知,(f的流量)<=(最小割容量)。
那么,如果能够证明,最大流等于最小割,则就可以证明最大流为最优解了。
如何证明?如果在残余网络中的S-T路径中,仍然存在流量上限不为0的正向边,则答案可以更优。然而这种情况是不存在的。由S集合的定义可知,如果存在这样的边,则那条路径的端点都应在S集合。类似的,T-S路径中,流量上限不为0的反向边也是不存在的。
因此,最大流就等于最小割,证明了Ford-Fulkerson的正确性。该性质被叫做最大流最小割定理。因此,在遇到求解最小割的题目时,就可以用求解最大流的办法来做了。
但值得注意的是,对最小割方案的打印,与最大流不同(本身原理就不同,只不过值相等)。我们割的那些边,实际就是残余网络中从S集合连向T集合的边,即左端点被访问过,右端点未被访问过的边。