其他分享
首页 > 其他分享> > 网络流

网络流

作者:互联网

"流网络"

定义流网络为一个有向,联通,无自环,无反向边的图 \(G(V,E)\)。

定义每条边有一个容量 \(c(u,v)\),满足 \(c(u,v)\geq 0\)。

定义流网络 \(G\) 的源点和汇点为两个点 \(s,t\in V\),除了 \(s\),每个点 \(u\in V\) 的入度都至少为 \(1\)。

定义流网络 \(G\) 中的一个流 \(f\) 为一个函数 \(f:V\times V\rightarrow R\),其具有这样的性质:

  1. 若 \((u,v)\notin E\),则 \(f(u,v)=0\)。

  2. (容量限制)对于所有的边 \((u,v)\in E\),有 \(0\leq f(u,v)\leq c(u,v)\)。

  3. (流量守恒)除了 \(s,t\),对于所有的点 \(u\in V\),有

    \[\sum_{v\in V}f(u,v)=\sum_{v\in V}f(v,u) \]

定义一个流网络上的流 \(f\) 的值

\[|f|=\sum_{v\in V}f(s,v)-\sum_{v\in V}(v,s) \]

流网络 \(G\) 中不允许存在反平行边即 \((u,v),(v,u)\) 同时存在。

最大流

最大流问题中,我们给定一个流网络 \(G\) 与其中的源点汇点 \(s,t\),求一个值最大的流 \(f\)。

残存网络

给定流网络 \(G\) 与一个流 \(f\),\(f\) 可能不是 \(G\) 上的最大流,这意味着我们需要对一些边的流量进行修改,可能增加或者缩减。我们将在流 \(f\) 的基础上可以继续修改的边取出,组成一张新图即为 \(G\) 的残存网络 \(G_f\)。

为了表示对一条边 \((u,v)\) 上流量的增加,我们在 \(G_f\) 中加入 \((u,v)\),并令其残存容量 \(c_f(u,v)=c(u,v)-f(u,v)\),即 \((u,v)\) 剩余的容量。当 \(c(u,v)=f(u,v)\) 时,此时 \(c_f(u,v)=0\),已没有剩余容量可供增加,我们就不加入这条边。

为了表示对一条边 \((u,v)\) 上流量的缩减,我们在 \(G_f\) 中加入其反边 \((v,u)\),并令其残存容量 \(c_f(v,u)=f(u,v)\),即缩减的流量最多抵消其原流量 \(f(u,v)\)。当 \(f(u,v)=0\) 时,已没有流量可以缩减,我们就不加入这条边。

称这样构造出的新流网络 为流 \(f\) 所诱导的残存网络 \(G_f\)。

利用残存网络来改变流 \(f\)

给定流网络 \(G\) 与一个流 \(f\),\(f\) 所诱导的残存网络为 \(G_f\),并且我们有 \(G_f\) 上的一个流 \(f'\),我们可以用 \(f'\) 来改变 \(f\)。

\(f'\) 对 \(f\) 的递增为一个函数 \(f\uparrow f':V\times V\rightarrow R\),其定义为

\[(f\uparrow f')(u,v)=\begin{cases} f(u,v)+f'(u,v)-f'(v,u)&\text{if}\ (u,v)\in E\\ 0&\ \text{otherwise} \end{cases}\]

其含义为 \(f'\) 对 \(f\) 改变的流量为原流量加上正向边流出的流量再减去反向边流回的流量。

接下来我们将证明 \(f\uparrow f'\) 也为 \(G\) 中的一个流,其值 \(|f\uparrow f'|=|f|+|f'|\)。

首先证明 \(f\uparrow f'\) 满足容量限制。

注意到,若 \((u,v)\in E\),则 \(c_f(v,u)=f(u,v)\),而 \(f'(v,u)\leq c_f(v,u)\),于是有 \(f'(v,u)\leq f(u,v)\)。那么

\[\begin{aligned}(f\uparrow f')(u,v)&=f(u,v)+f'(u,v)-f'(v,u)\\ &\geq f(u,v)+f'(u,v)-f(u,v)\\ &=f'(u,v)\\ &\geq 0 \end{aligned}\]

\[\begin{aligned}(f\uparrow f')(u,v)&=f(u,v)+f'(u,v)-f'(v,u)\\ &\leq f(u,v)+f'(u,v)\\ &\leq f(u,v)+c_f(u,v)\\ &=f(u,v)+c(u,v)-f(u,v)\\ &=c(u,v) \end{aligned}\]

综上我们有 \(0\leq (f\uparrow f')(u,v)\leq c(u,v)\),即 \(f\uparrow f'\) 满足容量限制。

接下来证明 \(f\uparrow f'\) 满足流量守恒。

\[\begin{aligned}&\sum_{v\in V}(f\uparrow f')(u,v)\\ =&\sum_{v\in V}(f(u,v)+f'(u,v)-f'(v,u))\\ =&\sum_{v\in V}f(u,v)+\sum_{v\in V}f'(u,v)-\sum_{v\in V}f'(v,u)\\ \end{aligned}\]

又由于 \(f\) 与 \(f'\) 都满足流量守恒,所以上式可以直接改写

\[\begin{aligned} =&\sum_{v\in V}f(v,u)+\sum_{v\in V}f'(v,u)-\sum_{v\in V}f'(u,v)\\ =&\sum_{v\in V}(f(v,u)+f'(v,u)-f'(u,v))\\ =&\sum_{v\in V}(f\uparrow f')(v,u) \end{aligned}\]

最后证明 \(|f\uparrow f'|=|f|+|f'|\)。

设 \(V_1=\{v:(s,v)\in E\}\),\(V_2=\{v:(v,s)\in E\}\)。由于 \(G\) 中不存在反平行边,所以我们有 \(V_1\cap V_2=\emptyset\)。

\[\begin{aligned} |f\uparrow f'|&=\sum_{v\in V}(f\uparrow f')(s,v)-\sum_{v\in V}(f\uparrow f')(v,s)\\ &=\sum_{v\in V_1}(f\uparrow f')(s,v)-\sum_{v\in V_2}(f\uparrow f')(v,s)\\ &=\sum_{v\in V_1}(f(s,v)+f'(s,v)-f'(v,s))-\sum_{v\in V_2}(f(v,s)+f'(v,s)-f'(s,v))\\ &=\sum_{v\in V_1}f(s,v)+\sum_{v\in V_1}f'(s,v)-\sum_{v\in V_1}f'(v,s)-\sum_{v\in V_2}f(v,s)-\sum_{v\in V_2}f'(v,s)+\sum_{v\in V_2}f'(s,v)\\ &=\sum_{v\in V_1}f(s,v)-\sum_{v\in V_2}f(v,s)+\sum_{v\in V_1\cup V_2}f'(s,v)-\sum_{v\in V_1\cup V_2}f'(v,s)\\ \end{aligned}\]

显然第一项 \(v\) 的取值集合可以从 \(V_1\) 改为 \(V\),设 \(V'=V-V_1\),那么 \(V'=\{v:(s,v)\notin E\}\),第一项的变化量为

\[\sum_{v\in V'}f(s,v)=\sum_{\{v:(s,v)\notin E\}}=0 \]

同理第二项 \(v\) 的取值集合也可以变为 \(V\)。

所以原式变为

\[\begin{aligned} &\sum_{v\in V}f(s,v)-\sum_{v\in V}f(v,s)+\sum_{v\in V}f'(s,v)-\sum_{v\in V}f'(v,s)\\ =&|f|+|f'| \end{aligned}\]

增广路径

给定流网络 \(G\) 与一个流 \(f\),一条增广路径 \(p\) 是残存网络 \(G_f\) 中的一条从 \(s\) 至 \(t\) 的简单路径,这一条路径上的所有边的容量都未满,于是我们可以增加这条路径上所有边的容量,而这个变化量的最大值为这条路径上残存容量最小的边的容量,称这个最大值为路径 \(p\) 的残存容量

\[c_f(p)=\min\{c_f(u,v):(u,v)\in p\} \]

我们可以通过 \(G_f\) 中的一条增广路径 \(p\) 来构造出 \(G_f\) 上的一个流 \(f_p\)。

我们这样定义一个函数 \(f_p:V\times V\rightarrow R\):

\[f_p(u,v)=\begin{cases} c_f(p)&\text{if}\ (u,v)\in p\\ 0&\text{otherwise} \end{cases}\]

那么 \(f_p\) 即为 \(G_f\) 上的一个流。

流网络的切割

对流网络 \(G\) 的一个切割 \((S,T)\) 将点集 \(V\) 划分为两部分 \(S\) 及 \(T=V-S\),使得 \(s\in S,t\in T\)。

给定流 \(f\),定义横跨切割 \((S,T)\) 的净流量为

\[f(S,T)=\sum_{u\in S,v\in T}f(u,v)-\sum_{u\in S,v\in T}f(v,u) \]

定义切割 \((S,T)\) 的容量为

\[c(S,T)=\sum_{u\in S,v\in T}c(u,v) \]

接下来证明一个性质:若流 \(f\) 给定,则对于任何切割 \((S,T)\),其横跨切割的净流量 \(f(S,T)\) 都相等,其值为 \(|f|\)。

首先对于任意节点 \(u\in V-\{s,t\}\),根据流量守恒有

\[\begin{aligned} \sum_{v\in V}f(u,v)&=\sum_{v\in V}f(v,u)\\ \sum_{v\in V}f(u,v)-\sum_{v\in V}f(v,u)&=0\\ \end{aligned}\]

然后对 \(|f|\) 进行一些变式

\[\begin{aligned} |f|&=\sum_{v\in V}f(s,v)-\sum_{v\in V}f(v,s)+\sum_{u\in S-\{s\}}(\sum_{v\in V}f(u,v)-\sum_{v\in V}f(v,u))\\ &=\sum_{v\in V}f(s,v)-\sum_{v\in V}f(v,s)+\sum_{u\in S-\{s\}}\sum_{v\in V}f(u,v)-\sum_{u\in S-\{s\}}\sum_{v\in V}f(v,u)\\ &=\sum_{v\in V}f(s,v)-\sum_{v\in V}f(v,s)+\sum_{v\in V}\sum_{u\in S-\{s\}}f(u,v)-\sum_{v\in V}\sum_{u\in S-\{s\}}f(v,u)\\ &=\sum_{v\in V}(f(s,v)+\sum_{u\in S-\{s\}}f(u,v))-\sum_{v\in V}(f(v,s)+\sum_{u\in S-\{s\}}f(v,u))\\ &=\sum_{v\in V}\sum_{u\in S}f(u,v)-\sum_{v\in V}\sum_{u\in S}f(v,u)\\ \end{aligned}\]

由于 \(V=S\cup T\) 且 \(S\cap T=\emptyset\),所以我们可以将原式继续分解

\[\begin{aligned} |f|&=\sum_{v\in V}\sum_{u\in S}f(u,v)-\sum_{v\in V}\sum_{u\in S}f(v,u)\\ &=\sum_{v\in S}\sum_{u\in S}f(u,v)+\sum_{v\in T}\sum_{u\in S}f(u,v)-\sum_{v\in S}\sum_{u\in S}f(v,u)-\sum_{v\in T}\sum_{u\in S}f(v,u)\\ \end{aligned}\]

注意第一项和第三项,它们正好相互抵消,于是我们直接得到

\[\begin{aligned} |f|&=\sum_{v\in T}\sum_{u\in S}f(u,v)-\sum_{v\in T}\sum_{u\in S}f(v,u)\\ &=\sum_{u\in S,v\in T}f(u,v)-\sum_{u\in S,v\in T}f(v,u)\\ &=f(S,T) \end{aligned}\]

有了这个结论,我么可以用切割的容量来限制一个流的值。

下面利用上面的结论证明:任意流 \(f\) 的值不超过 \(G\) 的任意切割的容量。

\[\begin{aligned} |f|&=f(S,T)\\ &=\sum_{u\in S,v\in T}f(u,v)-\sum_{u\in S,v\in T}f(v,u)\\ &\leq \sum_{u\in S,v\in T}f(u,v)\\ &\leq \sum_{u\in S,v\in T}c(u,v)\\ &=c(S,T) \end{aligned}\]

最大流最小切割定理

给定流网络 \(G\),设其最大流为 \(f_{\max}\),最小切割容量为 \(c_{\min}(S,T)\) 那么 \(|f_{\max}|=c_{\min}(S,T)\)。

上一小节结尾其实已经说明了 \(|f_{\max}|\leq c_{\min}(S,T)\),接下来我们直接证明这个等号成立。

首先,考虑残存网络 \(G_f\),其中一定不存在任何增广路径 \(p\),否则我们用 \(f_p\) 递增 \(f_{\max}\),得到 \(f_{\max}\uparrow f_p\),而 \(|f_{\max}\uparrow f_p|>|f_{\max}|+|f_p|>|f_{\max}|\),与 \(f_{\max}\) 是最大流矛盾。

设点集 \(S\) 为 \(G_{f_{\max}}\) 中所有 \(s\) 可达的点,\(T=V-S\),那么有 \(s\in S\),\(t\in T\),这样构成了 \(G\) 的一个切割 \((S,T)\)。

那么,对于任何一对点 \(u \in S,v\in T\),假若 \((u,v)\in E\),则 \(f_{\max}(u,v)=c(u,v)\),否则这条边将会有剩余容量,意味着 \((u,v)\in E_{f_{\max}}\),与 \(S\) 的定义矛盾。假若 \((v,u)\in E\),则 \(f_{\max}(v,u)=0\),否则这条边将可以缩减流量,意味着反边 \((u,v)\in E_{f_{\max}}\),与 \(S\) 的定义矛盾。假若 \((u,v),(v,u)\notin E\),显然 \(f_{\max}(u,v)=c(u,v)=0\)。

所以我们有

\[\begin{aligned} f_{\max}(S,T)&=\sum_{u\in S,v\in T}f_{\max}(u,v)-\sum_{u\in S,v\in T}f_{\max}(v,u)\\ &=\sum_{u\in S,v\in T}c(u,v)-\sum_{u\in S,v\in T}0\\ &=c(S,T) \end{aligned}\]

因为流量值与净流量相等,所以 \(|f_{\max}|=f_{\max}(S,T)\),结合 \(|f_{\max}|\) 小于等于任何 \(c(S,T)\),易知此时的切割 \((S,T)\) 为最小割。

\(\bold{Ford-Fulkerson}\) 方法

\(\text{Ford-Fulkerson}\) 方法即利用增广路径不断地增加流 \(f\) 的值。

具体地,我们首先根据当前的流 \(f\) 找出一条增广路径 \(p\),然后令 \(f\rightarrow f\uparrow f_p\),这样不断迭代下去直到 \(G_f\) 中不存在增广路径。

根据最大流最小割定理的证明过程,容易得出这个方法的正确性。

大部分最大流算法都是基于此方法,区别在于第一步寻找增广路径的过程。

\(\bold{Edmonds-Karp}\) 算法

\(\text{Edmonds-Karp}\) 算法利用 \(\text{BFS}\) 来寻找增广路径,其时间复杂度为 \(O(nm^2)\)。

考虑对每个边 \((u,v)\in E\) 赋一个为 \(1\) 的权值,

标签:begin,end,max,sum,网络,uparrow,aligned
来源: https://www.cnblogs.com/yukari1735/p/16491112.html