网络流的基本概念
做题大致思路
问题 ( ightarrow) 某种方式建图的网络流 ( ightarrow) 网络流解与原问题解是否等价。
流网络
流网络是一个有向图 (G<V,E>),其中有两个特殊点 (s,tin V) ,分别为源点和汇点。(G) 中每一条边有一个 (ge 0) 的权值,称作边的容量,边 ((u,v)) 容量可记做 (c(u,v))。
源点相当于一个水源,汇点相当于一个大海,中间的边和点相当于河流水道,水从水源流出,流经河道,流向大海。容量描述的就是这些河流水道的宽度/深度/etc.。
为了简化问题,我们假设若存在边 ((u,v)in E),则不存在 ((v,u)in E) 。
其实我们也有一种办法消除这种边,只需要将 ((v,u)) 拆成 ((v,t)) 和 ((t,u)) 就可以了。
总之,在考虑问题时,不用考虑反向边。
可行流
对于每一个流网络,我们可以考虑它的任意一个可行流(可简称流),流用 (f) 来表示,(f(u,v)) 表示的是单位时间内从 (u) 点到 (v) 点流经边 ((u,v)) 的流。
通俗的来说,就是河道里面流了多少水。
就是说我们要指定每一条边的流量得到一个方案 (f) ,若满足两个条件:容量限制 和 流量守恒 ,则称这个 (f) 是一个可行流。
容量限制:流经边的流量小于等于边的容量,即:
流量守恒:除了源点汇点之外其他点不能存储流量。也就是说,流入的流量之和应该等于流出的流量之和,即:
我们完全不用考虑反向边。
对于一个可行流 (f) ,(|f|) 代表这个可行流的流量值,表示流从源点流向汇点的速率。我们定义:
就是单位时间内从源点流出的总流量减去从源点流入的总流量。
最大流
最大流,也叫最大可行流,一个流 (f) 是最大流当且仅当 (|f|) 最大。
残留网络
定义一个有向图 (G<V,E,W>) 对应一个可行流 (f) 的残留网络 (G_f<V_f,E_f,W_f>) ,其 (V_f=V , E_f=E+{(u,v)|(v,u)in E}),其每条边的容量 (c^{prime}(u,v)) 与原图及对应可行流 (f) 的关系如下:
可以看出,对于原网络的任意一个可行流都可以建立一个残留网络。
上图示:(红色为可行流,蓝色为容量)
这个网络的残留网络应为:(红色为反向边及其权值,蓝色为原图有的边及其权值)
残留网络的性质
-
若 (f) 为图 (G) 的一个可行流,(f^{prime}) 是其残留网络的一个可行流,则 (f)+(f^{prime}) 也是图 (G) 的一个可行流。
定义这里的流量相加的规则为:(|f+f^{prime}|=sum_{(u,v)in E}f(u,v)+f^{prime}(u,v)-f^{prime}(v,u)=|f|+|f^{prime}|)。
证明暂略。
-
推论:若对于图 (G) 的一个可行流 (f) ,其残留网络 (G_f) 中存在一个可行流 (f^{prime}) ,其 (|f^{prime}| > 0) 则 (f) 一定不是最大流。逆命题仍然成立。
证明暂略。
增广路径
在残留网络里面,从源点开始沿容量大于0的边走到汇点的简单路径称为增广路径,也叫流增广路径。
增广路径一定是原网络的一个可行流。
性质
- 对于图 (G) 的一个可行流 (f),若 (f) 的残留网络 (G_f) 中没有增广路径,则 (f) 是图 (G) 的一个最大流。
割
有向图 (G) 的割为点集 (V) 的一个划分方案 (<S,T>) 使得 (Scap T=varnothing,Scup T=V)。
割的容量
一个割 (<S,T>) 的容量 (C(S,T)) 为
最小割指的一般是最小容量割。
割的流量
一个割 (<S,T>) 在可行流 (f) 下的流量 (F(S,T)) 为
运算方式
接下来定义点集子集(不一定没有交集)之间的流量运算方式
对于点集 (X,Ysubsetneq V)
推出如下运算律:
(F(X,Y)=-F(Y,X))
(F(X,X)=0)
(F(Z,Xcup Y)=F(Z,X)+F(Z,Y))
(F(Xcup Y,Z)=F(X,Z)+F(Y,Z))
性质
-
对于任意割 (<S,T>) ,其流量一定小于等于容量。
定义式相加易得。
-
对于割 (<S,T>),其对应的可行流的值 (|f|=F(S,T))。
由流量守恒原则易得。
-
对于任意一个 (f) ,有 (|f|le C(S,T)) 对任意割成立。
推论:最大流流量小于等于最小割容量
最大流最小割定理
对于一个网络 (G) ,一个流 (f) 是最大流 (^①) ,等价于 (G) 的残留网络 (G_f) 中没有增广路 (^②),等价于存在一个割 (<S,T>) 使得 (|f|=C(S,T)^③) 。
证明:
FF方法
基于最大流最小割定理,我们可以得到如下方法求解最大流。
- 输入一个网络 (G)
- 确定一个可行流 (f),为当前可行流
- 在其残留网络(G_f)中寻找增广路径 (f^{prime})。
- 更新当前可行流为 (f+f^{prime})
- 转3,若找不到增广路,输出当前可行流。