增广路径 在残量网络中,从源点S出发到汇点T的一条路径。 增广路径上的最小残量表示该网络还可增加的额外流量。 点集间的流量 定义点集间的流量:f(X, Y) = ∑ ∑f(x, y) 则有: f(X,X) = 0 (流的对称性) f(X,Y) = -f(Y,X) (流的对称性) f(X∪Y,Z) = f(X,Z) + f(Y,Z) f(X,Y∪Z) = f(X,Y) + f(X,Z) x∈X y∈Y 点集间的流量 不包含s,t的点集,与它关联的边上的流量和为零 证明:f(X, V) = ∑ {∑f(x,v)} = ∑0 (流量收支平衡) = 0 x∈X v∈V x∈X 网络中的割 割(S,T)由两个点集S,T组成,满足 1、 S + T = V 2、 源点在S集合中 3、 汇点在T集合中 4、 f(S,T)表示割的流量 5、 c(S,T)表示割的容量 最小切割时使c(S,T)最小的切割 割的流量 任意割的流量等于网络的流量 证明: f(S,T) = f(S,V) – f(S,S) = f(S,V) + 0 = f(s, V) + f(S-{s}, V) = f(s, V) + 0 = |f| 割的流量 网络的流量小等于任意割的容量 证明: |f| = f(S, T) = ∑ ∑f(x, y) = ∑ ∑c(x, y) = c(S, T) 所以有最小割等于最大流 x∈S y∈T x∈S y∈T 最小割最大流定理 网络的最大流等于最小割 f是网络的最大流 残量网络中无可增广路径 存在某个切割(S,T),使f = c(S, T) 以上三个命题是等价的,证明之: 1 — 2 反证法 假设残量网络中还有增广路径, 增广路径上的流量至少为1 由该路径增广后的流量f 与f是最大流矛盾 2 — 3 此时的残量网络中不存在s-t通路 定义S为s可达的点集 定义T为可达t的点集 显然S+T = V (S,T)中所有弧都满载,否则残量网络将不为0,使s-t有通路 所以|f| = c(S,T) 3 — 1 由|f| = c(S,T)(任意割) 当|f| == c(S,T) |f|为最大值 从上面的证明,我们可以得到求最大流从增广路径算法。 从2-3的证明给出了从最大流构造最小割的过程,即求出s的可达点集S, 再令T = V - S 求最大流的增广路算法 每次用BFS找一条最短的增广路径; 然后沿着这条路径修改流量值(实际修改的是残量网络的边权)。 路径上的后向弧+流量值 路径上的前向弧-流量值 当没有增广路时,算法停止,此时的流就是最大流。 最大流例题BOJ1154 典型的最大流问题 已知网络容量,求最大流量 根据题意构图如下: 1为源点,M为汇点. 容量为题目已知给出,可能的情况是相同两个结点之间有多条水渠,将它们累加即可. 初始化流量网络为0,则残量网络即初始为容量网络. 算法流程: 构图-求最大流-输出最大流 最大流例题BOJ1154 寻找增广路 bool findload() { memset(visited,0,sizeof(visited)); head = tail = 0; queue[tail++] = s; while(head tail) { j = queue[head++]; for(i = 1; i = m; i++) if(!visited[i] cap[j][i] 0) //cap为容量,本题可以直接表示为残量 { pre[i] = j; //路径标志 visited[i] = 1; if(i == t) return true; //找到s-t通路 queue[tail++] = i; } return false; } 最大流例题BOJ1154 求最大流 int maxflow() { int i, j, flow = 0, min; //min为增广路径上的瓶颈流量;flow网络最大流 while(find
原创力文档

文档评论(0)