最小割问题
s
t
st
st割:将节点划分为
A
,
B
A,B
A,B两个集合,其中源节点
s
∈
A
s\in A
s∈A且宿节点
t
∈
B
t\in B
t∈B
s
t
st
st割的容量:由集合
A
A
A到集合
B
B
B所有出边容量之和。割容量可以看成是由集合
A
A
A推向集合
B
B
B的最大流值(割流量的最大值),这也是不包含反向边的容量的原因,即不包含由集合
B
B
B指向集合
A
A
A的出边容量。反向边只会使割流量减少。
目标:使
s
t
st
st割的容量最小
例如,下面
s
t
st
st割的容量为34:
最大流问题
s
t
st
st流
f
f
f:满足容量约束和流守恒约束,如下:
- 容量约束:保证每个链路流量不超过该链路的承受能力
- 流守恒约束:保证中间节点不囤积流量
流值大小:
目标:使流值最大
用Ford-Fulkerson算法求解最大流和最小割
贪心策略是失败的,因为无法撤销已添加的流
算法伪代码如下:
算法核心为剩余网络,该网络边值表示可以往该方向推送的剩余流量还有多少
例子如下:
原网络和相应的流值为一幅图
剩余网络为另一幅图
补充
- 求解顺序应该是先求剩余网络,再求原网络下对应的流。求解方法为用原网络的容量减去原网络对应残余网络的边的权值(没有对应可以虚拟一条权值为0的边),即该链路上流的大小。
- Ford-Fulkerson算法结束时,被阻塞的节点集合与另一集合的划分,即为最小割,如上图阴影部分。
最大流最小割定理
①流值引理:任意流的值大小等于沿任意割的净流量(反向流会减),如下图所示:
黑色节点属于集合
A
A
A,白色节点是属于集合
B
B
B,反向割流是要减掉的
根据流值大小定义,证明:
证明解释:因为除了
s
,
t
s,t
s,t之外,其余顶点是满足流守恒约束的,因此第二个等式可以将
s
s
s点换成集合
A
A
A,因为集合A中除
s
s
s点外,其余点的出流量之和减入流量之和恒等于0。
②弱对偶定理:任意流值小于等于任意割容量,即
v
a
l
(
f
)
≤
c
a
p
(
A
,
B
)
val(f)\leq cap(A,B)
val(f)≤cap(A,B)
由流值引理配合放缩证明,过程如下:
直观认知:由于流值是和割流量相等的,而割流量只有在饱和容量且无反向边流量的条件下才等于割容量,因此流值小于等于任意割容量。
③若某个流
f
f
f值
v
a
l
(
f
)
val(f)
val(f)等于某个割容量
c
a
p
(
A
,
B
)
cap(A,B)
cap(A,B),即
v
a
l
(
f
)
=
c
a
p
(
A
,
B
)
val(f) = cap(A,B)
val(f)=cap(A,B),那么
f
f
f是最大流,
(
A
,
B
)
(A,B)
(A,B)是最小割。
证明:
第一个式子说明流
f
f
f是最大流,第二个式子说明
(
A
,
B
)
(A,B)
(A,B)是最小割,因为是任意性证明
以下三个命题等价:
- 存在一个割容量等于某个流值,即 c a p ( A , B ) = v a l ( f ) cap(A,B) = val(f) cap(A,B)=val(f)
- f f f是最大流
- 对于某个流 f f f而言,不存在增广路径
最难的是3->1,主要证明3->1:
令
f
f
f是不带增广路径的流,集合
A
A
A是剩余网络中从起点
s
s
s可达的节点的集合。
则原网络和流图,可以表示如下:
有下列关系:
若第二项不等于0,则剩余网络可扩展,直到为0为止