network flow的应用:
1. bipartite matching problem。(employee和job的分配匹配问题)
- 构建bipartite图,添加s,t。
- 看问题中变量的意义,决定图中各边的capacity。(有点玄学)
- 算max flow,用ford-fulkerson或者别的什么max flow算法。
2. minimum cut problem。(image segmentation问题)
- 利用的是minimum cut = max flow
--------------------------------------------------------------------------
ford-fulkerson算法伪码:
Ford-Fulkerson
for <u,v> ∈ E
<u,v>.f = 0
while find a route from s to t in e
m = min(<u,v>.f, <u,v> ∈ route)
for <u,v> ∈ route
if <u,v> ∈ f
<u,v>.f = <u,v>.f + m
else
<v,u>.f = <v,u>.f - m
cut(割)的容量(设cut<S,T>)=所有从S到T的edge的capacity的和
cut的flow = 所有从S到T的edge上的flow - 所有从T到S的edge上的flow
如何证明ford-fulkerson能得到max flow?(如何证明没有augmented path的时候就达到max flow了)
证明:将residual graph里所有所有源点s能reach到的node看作集合S,那么所有node的集合V减去集合S就是集合T=V-S,T就是所有源点s无法reach到的点,此时(S,T)就是一个割。那么对于所有跨cut<S,T>的边<u,v>必然有flow(<u,v>)=capacity(<u,v>),不然的话就说明在residual graph中u有路径可以连接到v,也就是说源点s可以reach到T中的v,这和T的定义矛盾。
MIT quiz题:(network flow是)