网络流算法
流网络
G = ( V , E ) G=(V,E) G=(V,E) ,不考虑反向边,如果边不存在,则容量 C C C为0
可行流: f f f
- 容量限制, 0 < = f ( u , v ) < = c ( u , v ) 0<=f(u,v)<=c(u,v) 0<=f(u,v)<=c(u,v)
- 流量守恒, v x ∈ V ∣ { s , t } v_x \in V|\{s,t\} vx∈V∣{s,t} , ∑ f ( v , x ) = ∑ f ( x , v ) \sum{f(v,x)}=\sum{f(x,v)} ∑f(v,x)=∑f(x,v)
流量值: ∣ f ∣ = ∑ f ( s , v ) − ∑ f ( v , s ) |f|=\sum{f(s,v)}-\sum{f(v,s)} ∣f∣=∑f(s,v)−∑f(v,s)
最大流:最大可行流
残留网络: G f G_f Gf
- V f = V , E f = E + E 中所有反向边 V_f=V,E_f=E+E_{中所有反向边} Vf=V,Ef=E+E中所有反向边
- 也是一个可行流
f + f ‘ f+f^` f+f‘也是原来网络的一个可行流,两个方案相加,每条边对应相加
- 容量限制
- 流量守恒
- ∣ f + f ‘ ∣ = ∣ f ∣ + ∣ f ‘ ∣ |f+f^`|=|f|+|f^`| ∣f+f‘∣=∣f∣+∣f‘∣
增广路径:在残留网络里,从起点沿着大于零的边走,能走到终点的路径
- 如果一个原图的f的残留网络有增广路径,说明f可行流不是最大流
- 引入割的概念证明
- 匈牙利算法和最大流算法本质一样
- 匈牙利效率反而低一点
割: G = ( V , E ) G=(V,E) G=(V,E)
- 割点,把点集不重不漏分为两个部分,分别为s和t,分别在 S S S和 T T T这两个集合里
- 割的容量:
- 所有从S指向T的v边的容量之和
- c ∈ ( S , T ) = ∑ u ∈ S ∑ v ∈ T c ( u , v ) c \in (S,T) = \sum\limits_{u \in S}{\sum\limits_{v \in T}{c(u,v)}} c∈(S,T)=u∈S∑v∈T∑c(u,v)
- 最小割:容量的最小值
- 割的流量:
- f ( S , T ) = ∑ u ∈ S ∑ v ∈ T f ( u , v ) − ∑ u ∈ T ∑ v ∈ S f ( u , v ) f(S,T)=\sum\limits_{u \in S}{\sum\limits_{v \in T}{f(u,v)}}-\sum\limits_{u \in T}{\sum\limits_{v \in S}{f(u,v)}} f(S,T)=u∈S∑v∈T∑f(u,v)−u∈T∑v∈S∑f(u,v)
- 割的容量和流量的定义是不对称的
- 性质
- ∀ [ S , T ] , ∀ f , f ( S , T ) < = c ( S , T ) \forall [S,T] , \forall f,f(S,T)<= c(S,T) ∀[S,T],∀f,f(S,T)<=c(S,T)
- f ( S , T ) = ∣ f ∣ f(S,T)=|f| f(S,T)=∣f∣
- f ( x , y ) = ∑ u ∈ x ∑ v ∈ y f ( u , v ) − ∑ u ∈ x ∑ v ∈ y f ( v , u ) f(x,y)=\sum\limits_{u \in x}\sum\limits_{v \in y}{f(u,v)}-\sum\limits_{u \in x}\sum\limits_{v \in y}{f(v,u)} f(x,y)=u∈x∑v∈y∑f(u,v)−u∈x∑v∈y∑f(v,u)
- 有了四个性质之后可以证明
- 最后这张图的证明来自《最小割模型在信息学竞赛中的应用》——胡伯涛
![]()
- ∣ f ∣ < = c ( S , T ) |f|<=c(S,T) ∣f∣<=c(S,T)
- 最大流量<= 最小割的容量
- 最大流最小割定理
- 一个可行流f是最大流
- 可行流f的残留网络中不存在增广路
- ∃ [ S , T ] , ∣ f ∣ = c ( S , T ) \exists [S,T], |f|=c(S,T) ∃[S,T],∣f∣=c(S,T)