最大流

背景

  • 管道中的流体
  • 电网中的电流
  • 通信网络上的信息

流网络

G=<V,E>是一个有向图
每条边有一个非负的容量值 c(u,v)c(u,v) 计算复杂性(一):最大流
流网络示意图

源点和汇点分别是s和t。
G中的流是一个实值函数f:V×VRf: V \times V →R,满足下面的两条性质:

  • 容量限制:对于所有的结果u,vVu,v \in V, 要求0f(u,v)c(u,v)0 \leqslant f(u,v) \leqslant c(u,v)
  • 流量守恒:对于所有的结点uV{s,t}u \in V - \left \{s,t\right \}, 要求:vVf(v,u)=vVf(u,v)\sum_{v \in V}^{} f(v,u) = \sum_{v \in V} f(u,v)

我们称为负数值 f(u,v)f(u,v)为从结点u到结点v的流,一个流f的值f\left | f \right |定义如下:
f=vVf(s,v)vVf(v,s)(26.1)\left | f \right | = \sum_{v \in V} f(s,v) - \sum_{v \in V}f(v,s) (26.1)

也就是说,流f的值是从源结点流出的总流量减去流入源结点的总流量。

计算复杂性(一):最大流

具有多个源点和多个汇点的网络

计算复杂性(一):最大流

Ford-Fulkerson 方法

解决最大流问题的思路!

依赖三个重要思想:

  • 残存网络
  • 增光路劲
  • 切割

和一个定理

  • 最大流、最小割定理

残存容量设置为cf(u,v)=c(u,v)f(u,v)c_f(u,v) = c(u,v) - f(u,v) 计算复杂性(一):最大流

残存容量

假设有一个流网络G=(V,E)G=(V,E), 其源结点为s,汇点为t,设f 为图G中的一个流,考虑结点对u,vVu,v \in V, 定义残存容量cf(u,v)c_f(u,v) 如下:
cf(u,v)={c(u,v)f(u,v),u,vEf(v,u),(v,u)E0,(26.2)c_f(u,v)=\left\{\begin{matrix} c(u,v)-f(u,v), &amp; 若(u,v)\in E \\ f(v,u),&amp; 若(v,u)\in E \\ 0,&amp; 其他 \end{matrix}\right. (26.2)

因为假定边(u,v)E(u,v)\in E意味着(v,u)E(v,u) \notin E,对于每一对边来说,公式(26.2)中只有一种情况成立。

引理26.1

计算复杂性(一):最大流

增广路径

给定流网络G=(V,E)G = (V,E) 和流ff, 增广路径p 是残存网络GfG_f中一条从源结点s到汇点t的简单路径,根据残存网络的定义,对于一条增广路径上的边(u,v)(u,v),我们可以增加其流量的幅度最大为cf(u,v)c_f(u,v),而不会违反原始流网络G中对边(u,v)(u,v)或者(v,u)(v,u)的容量限制。

引理26.2

计算复杂性(一):最大流

推理26.3

计算复杂性(一):最大流

还是原来图上的流,并且增大了。

题外话

先写算法的大框架,然后再逐个实现细节

流网络的切割

一个流是最大流当且仅当其残存网络不包含任何增广路径。

对于割,要求sS,tTs \in S,t \in T。 若ff 是一个流,则定义横跨切割(S,T)(S,T)的净流量f(S,T)f(S,T)如下:
f(S,T)=uSvTf(u,v)uSvTf(v,u)(26.9)f(S,T) = \sum_{u\in S}\sum_{v \in T}f(u,v) - \sum_{u\in S}\sum_{v\in T}f(v,u)(26.9)

切割(S,T)(S,T)的容量是:
c(S,T)=uSvTc(u,v)(26.10)c(S,T) = \sum_{u\in S}\sum_{v\in T}c(u,v)(26.10)
一个网络的最小切割是整个网络中容量最小的切割。

计算复杂性(一):最大流

引理26.4

计算复杂性(一):最大流

推理26.5

计算复杂性(一):最大流
计算复杂性(一):最大流

算法

算法思想: 每次迭代时,求出任意增广路径p并以残存容量Cf(p)C_{f}(p)沿着P增大流f。

Edmonds-Karp算法

在残存网络中选择的增广路径是一条从源结点s到汇点t的最短路径,其中每条边的权重为单位距离。我们称如此实现的Ford-Fulkerson方法为Edmonds-Karp算法。其运行时间是O(VE2)O(VE^2).

每次增广最短路径。

引理26.7

计算复杂性(一):最大流

定理26.8

计算复杂性(一):最大流

补充内容

最大流最小割定理

最大流最小割定理是网络流理论的重要定理。
是指在一个网络流中,能够从源点到达汇点的最大流量等于如果从网络中移除就能够导致网络流中断的边的集合的最小容量和。
即在任何网络中,最大流的值等于最小割的容量。

思路:
从特殊的例子出发,去尝试,去找规律
找出来的规律就会形成一个一般性的描述。
(写论文的过程与之相反)

从一般到特殊的方法:

  • 替换
  • 加约束
  • 减约束
  • 更特殊(要通过大量的实验才能找到)

3 最大二分匹配

匹配:
计算复杂性(一):最大流
边子集M中最多有一条边与结点v相连。
如果子集M中的某条边与结点v相连,则称结点v由M所匹配。
最大匹配 是最大基数的匹配:
也就是说,对于任意匹配M’,有|M|>=|M’| 的匹配M(最大流)

流对应于匹配。

最大二分匹配问题:
计算复杂性(一):最大流

计算复杂性(一):最大流

计算复杂性(一):最大流
计算复杂性(一):最大流
计算复杂性(一):最大流

4 Push-relabel算法

计算复杂性(一):最大流
基本思想:
按更局部化的方式工作。
一次工作于一个结点,只考察残存网络中该节点的“邻居”。执行过程中不维护流量守恒性质,代之维持一个预流(preflow)

不再保持流的特性,就只能要做预流(preflow)

算法思想:

  • 结点带水库,增加高度的定义,起点高度是|V|,其他点的高度初始化为0.
  • 算法开始时,从起点出发,尽可能多的流下去。
  • 接着向下推送流,知道无法推送为止。
    u:流出的管道并未饱和,但其相邻的高度与u相同,甚至更高。
    此时对u执行 relabel操作,即提升结点高度
    relabel之后,至少有一个流可被推送。
  • 最后,能达到汇点的所有流都到达了 汇点。
    此时网络里面存了很多水,需要让溢出结点的过剩流返送回源点。
    现在使其高度高于源结点的高度|V|

基本操作:
计算复杂性(一):最大流
计算复杂性(一):最大流

推送操作:

计算复杂性(一):最大流
计算复杂性(一):最大流
饱和推送:
推送之后,边(u,v)变成饱和的,否则为 非饱和的。
计算复杂性(一):最大流

重贴标签操作:

计算复杂性(一):最大流
通用算法:
计算复杂性(一):最大流
计算复杂性(一):最大流
计算复杂性(一):最大流

计算复杂性(一):最大流

计算复杂性(一):最大流
计算复杂性(一):最大流

计算复杂性(一):最大流
正确性证明:
计算复杂性(一):最大流
证明:更具高度函数和重贴标签操作的定义证明

计算复杂性(一):最大流
证明: 对执行的基本操作的数目用归纳法
计算复杂性(一):最大流
证明:用反证法。通过高度函数不等式关系在路径中的传递退出矛盾。

时间复杂度:
计算复杂性(一):最大流
计算复杂性(一):最大流

结论:计算复杂性(一):最大流
计算复杂性(一):最大流
计算复杂性(一):最大流
计算复杂性(一):最大流
计算复杂性(一):最大流

相关文章:

  • 2021-12-28
  • 2021-11-19
  • 2021-05-21
  • 2021-07-03
  • 2021-05-23
  • 2022-12-23
  • 2021-12-27
  • 2021-10-17
猜你喜欢
  • 2021-04-20
  • 2021-10-14
  • 2021-05-30
  • 2021-10-11
  • 2021-09-06
  • 2022-12-23
  • 2021-06-27
相关资源
相似解决方案