流与割定义
割定义
对于图Graph(V,E)
s-t割是对顶点集V的一个划分,使得s属于A,t属于B.
割的容量定义
cap(A,B)=∑c(e) e out of A 即A的流出容量, 用c表示
最小割,找到最小容量的割
流的定义
一个s-t流满足:
对于每个边来讲0大于等于f(e)大于等于c(e)
对于每个顶点属于除了v属于V/{s,t} 他们的出流量都等于入流量
流量
等于s的所有输出流量一般用f表示
最大流寻找算法
引理
1.lemma (A,B) 是任意割, A的流出值-A的流入值=流量
2.lemma 弱对偶 流始终小于等于割的容量 v(f)<=cap(A,B)
3.最大流等于最小割
贪心算法
Greedy algorithm.
- Start with f(e) = 0 for all edge e.
- Find an s-t path P where each edge has f(e) < c(e).
- Augment flow along path P.
- Repeat until you get stuck.
引入残余图residual graph-增广路径的方法
主要思路是撤销’走错’的路径
e=(u,v) e^r=(v,u)
残余容量定义:
cf(e)=e(e)-f(e) e属于E
cf(e)=f(e) e^r属于E
最大流等于最小割证明(重点)
1.存在割使得v(f)=c(A,B)
2.f是最大流
3.这没有增广路径
证明思路 1=>2 2=>3 3=>1
3=>1稍微有点绕,
在残余图中,设A是s能到达的顶点集合。
v(f)=∑f(e) e out of A - ∑f(e) e into A
可得
1.∑f(e) e out of A=∑c(e) e out of A
因为根据s定义,A是可到达的。
反证:若A连接B的一边还有剩余容量,说明t可以顺着那条路到达B,因而和A定义矛盾。
2.∑f(e) e into A=0
因为是残余图,每条边均有两个方向(双向),出和入之和等于容量。出的方向的流量等于容量了,那入的方向自然等于0。
代码示例
int dfs