【网络流】网络流基本概念
网络流涉及到的概念好多 \(qwq\) ,梳理一下。
流网络
流网络是一个有向图,包含点集和边集。即 \(G=(V,E)\) 。
对于边 \(e:u\rightarrow v\) (也可以记为 \((u,v)\) ),有属性 \(c(u,v)\) ,称为容量。可以将其比喻为水管在单位时间可以流过的最大水量。
而图 \(G\) 中有两个特殊的点,称为源点和汇点,通常记为 \(s\) , \(t\) ,可以将源点比喻为无限的水源,将汇点比喻为能够容纳无穷的水的容器。
可行流
我们记 \(f(u,v)\) 为边 \(e:u\rightarrow v\) 当前的流量,流量需要满足两个约束:
- 容量限制:即 \(0 \leq f(u,v) \leq c(u,v)\)
- 流量守恒:除了源点、汇点,其他点流入的流量等于流出的流量,正式地说: \(\sum_{(u,x) \in E} f(u,x) = \sum_{(x,v)\in E)} f(x,v)\)
流量值
用单位时间流出源点的流量来刻画,记为 \(|f|=\sum_{(s,x) \in E} f(s,x) – \sum_{(y,s)\in E)}f(y,s)\) 。
最大流
又称为最大可行流,即对于 \(G\) 中可行流构成的集合中,流量值最大的元素。
残留网络
又称为残量网络,注意,残留网络总是针对原图 \(G=(V,E)\) 中的某一个可行流而言的,因此,可以残留网络看成是可行流的一个函数,通常记为 \(G_f\) 。
\(G_f=(V_f,E_f)\) ,其中 \(V_f=V\) , \(E_f=E和E中所有的反向边\) 。
残留网络中的容量记为 \(c'(u,v)\) ,定义为:
\begin{matrix}
c(u,v)-f(u,v) && (u,v) \in E \\
f(v,u) && (v,u) \in E
\end{matrix}
\right.
\]
增广路径
如果从源点 \(s\) 出发沿着残留网络中容量大于 \(0\) 的边走,可以走到汇点 \(t\) ,那么将走过的边所组成的路径称为增广路径。
原网络可行流+残留网络可行流也是原网络的一个可行流
正式地说, \(f+f’\) 属于 \(G\) 的一个可行流,且有 \(|f+f’|=|f|+|f’|\) 。
割
是网络中顶点的一个划分,把所有顶点划分成两个顶点集合 \(S\) 和 \(T\) ,其中源点 \(s\) 属于 \(S\) ,汇点 \(t\) 属于 \(T\) ,而且有 \(S \cup T=V\) ,\(S \cap T=\emptyset\) ,记为 \([S,T]\) 。
割的容量
\(c(S,T)=\sum_{u\in S}\sum_{v\in T}c(u,v)\)
最小割
\(G\) 中所有割组成的集合中,容量最小的元素。
割的流量
\(f(S,T)=\sum_{u\in S}\sum_{v\in T}f(u,v) – \sum_{u\in T}\sum_{v\in S}f(u,v)\)
任意割的流量 \(\leq\) 容量
正式地说,即 \(\forall [S,T]\) ,\(f(S,T)\leq c(S,T)\) 。
证明:(待补充)
最大流最小割定理
- \(f\) 是最大流
- \(G_f\) 不存在增广路
- \(\exists [S,T]\) ,满足 \(|f|=c(S,T)\)
最大流最小割定理指的是:上面的三个命题是等价的。(也就是说可以互推)。
证明:
-
先证明 1 可以推得 2 :
反证即可,如果 \(G_f\) 存在增广路,那么原图 \(G\) 中存在流量大于 \(0\) 的可行流 \(|f’|\) ,那么 \(f+f’\) 也是可行流,且流量为 \(|f|+|f’|>|f|\) ,矛盾。 -
下证 2 可以推得 3 :
我们将对于 \(G_f\) 中从 \(s\) 出发沿着容量大于 \(0\) 的边可以到达的点全部放入集合 \(S\) 中,然后令 \(T=V-S\) 。
那么对于点 \(x \in S\) ,\(y \in T\) ,边 \((x,y)\) 一定有 \(f(x,y)=c(x,y)\) 。
而对于点 \(x \in T\) ,\(y \in S\) 。必然有 \(f(x,y)=0\) 。因而割可以被构造出来。 -
最后证明 3 可以推得 1 :
因为 \(|f|\leq 最大流 \leq c(S,T)\) ,而由 3 可知 \(|f|=c(S,T)\) ,故上式取等,即有 \(f\) 是最大流。
最大流FF方法
基于这样的思路:
- 寻找增广路
- 利用增广路更新残留网络
一直这样做,直到找不到增广路,那么即可求得最大流。