0%

最大流

最大流

有一个源结点和一个汇点,从源结点向汇点“运输”货物。在不违反任何路径容量限制的条件下,从源结点到汇点运送货物的最大速率是多少——这一问题的抽象称为最大流问题

流具有三个需要注意的点!!

1、对于图中非s和t的普通结点,流进量等于流出量

2、我们非常关心总运输流量,比如这个下水道系统,究竟从s点到t点最多能运输多少立方米的水?我们把它记成|f|,这个|f|极其重要,是我们研究的目的所在。

3、当然,每条边是有运输上限的,就像某条公路车流是有上限的一样,若运输量无穷无尽,我们的研究也就没有意义了。我们将从u点到v点的运输上限,或者说是运载能力记为c(u,v)。对于从u点到v点的流量,记作f(u,v)。显然对所有边(u,v)我们有f(u,v)<=c(u,v)。
参考文章

流网络

流网络G=(V,E)是一个有向图,其中每条边(u,v)∈E均有一个非负能量c(u,v)≥0。如果(u,v)∉E,则假定c(u,v)=0。流网络中有两个特点的顶点,源点s和汇点t,假定每个顶点均处于从源点到汇点的某条路径上,就是说,对每个顶点v∈V,存在一条路径s->v->t,因此图G是连通图,且|E|≥|V|-1。

带权有向图:网络

结点:表示城市

有向边:表示运输路径和物流的方向

权重:表示运量限制

流:一条从源点到汇点的路径即路径上的流量——这种用来表示”流(flow)”的图称为“流网络”

流网络遵循以下基本性质:

(1)流量守恒:除源结点和汇点外,其它结点上物料只是“流过”,即物料进入的速率等于离开的速率;

(2)物料的生成速率和接收速率恒定且足够快、足够多,满足需要(包括源结点的输出和所有结点的输入);

(3)每条边上的容量是物料通过该边的最大速率,不能突破

流网络是一个有向图,边上定义有容量函数c:

(1) 有一个源结点s和汇点t;

(2) 有向边表示流向;

(3) 每条边上有一个非负的容量值;如果(u,v)∉E,则假定c(u,v)=0;

(4) 如果边集合E中包含(u,v)边,则图中不包含其反向边(u,v)

(5) 图中不允许有自循环

(6) 流网络是连通图,每个结点都在从s到t的某条路径上;

(7) 除源结点外,每个结点至少有一条流入的边;

(8) 除汇点外,每个结点至少有一条流出的边;

(9) |E|>=|V|-1

标准流网络

(1)无反向边:也称为反向平行边。一个有向图中,(v,u)、(u,v)互为反向平行边

(2)只有单一的源结点和汇点。

非标准流网络

不满足上述要求的流网络是非标准的流网络。对于非标准的流网络可转化为标准流网络。

方法:

1)添加反向平行边

2)多个源结点和多个汇点。加入一个超级源结点s。加入一个超级汇点t。

Ford-Fulkerson方法

通过不断增加可行流值的方式找到最大流:

(1)从流值为0的初始流开始;

(2)通过某种方法,对流值进行增加;

(3)当确认无法再增加流值时,就得到最大流;

首先这个算法有个重要的工具:残存网络。残存网络其实就是具有残存容量的图。算法导论上有个普遍公式来定义残存容量:

翻译一下公式,说明的就是对于两点间的残存容量定义为:
1.如果这两点连线原来就是原图的边,那么它的残存容量等于运载上限-运输流量。(就是目前你还能增加的流量的量
2.如果这两点的反向连线是原图的边,那么它的残存容量等于那条边的运输流量。(表示目前用的运输流量,一旦该运输流量等于运载上限,运算结束
3.其他情况是0,当做没连通。

接下来我们看看残存网络对我们的帮助
1.残存网络中没有从s到t的路径时,最大流等于最小割容量。(没有路径就说明s到t的连线有一段已经达到了最大运载上限了,就是残存容量为0
2.残存网络中有从s到t的路径时,最大流不等于最小割容量。

最大流算法应用:寻找最大二分匹配

https://yq.aliyun.com/articles/242142