一直对增广路这种贪心思想表示怀疑,今天看到一个很好的证明~
首先介绍割的概念,所谓图的割,指的是某个顶点集合S属于V,从S出发的所有边的集合成为割(S,V\S),这些边的容量和被称为割的容量,如果有源点s属于S,汇点t属于V\S,则称之为s-t割,如果将s-t割的所有边都在原图中去掉,则不再有s->t的路径。
容易得到,对于任意一个s-t割,总有f的流量<=割的容量,根据平衡条件,当且仅当割为最小割,流为最大流时取等号。
首先,对于ford-Fulkerson算法求出的流为f,f对应的残余网络中从s可达的顶点集合为S,因为f对应的残余网络中不存在从s->t的路径了,那么显然,在残余网络中,任意一条从S->V\S 中的边流量f=c,任意一条从反向弧f=0,这个一定是满足,如果不满足,那么S集合还可以扩充顶点,与前提矛盾。因此,S->V\S的割的容量等于流的大小。则可以证明裸的増广路ford算法是正确的。
再说一下dinic算法,dinic算法总是寻找最短的増广路并沿着它增广,増广路的长度不会在增广过程中改变,则当无法增广时,说明分层图上没有可以增广的路线了,这有两种情况,第一,已经求出了最大流,第二,可能存在长一些的増广路可以继续增广,因此,继续bfs构造分层网络。每次完成后最短増广路长度+1,由于最短路<n,则最对重复n-1次bfs就可完成了。
感谢liuzhan214大大的证明过程:http://blog.csdn.net/liuzhan214/article/details/52057985。