初读最大流

初读最大流

[链接文章]
这里写链接内容
链接的这篇文章是我学习最大流时获益最大的文章,思路清晰,表达简单易懂。我对上面这篇文章的理解就是我写的这篇笔记,我这里用到的图也是直接或间接来源于上面那篇文章,只是在整理我自己的思路,不知道这样是不是侵权………
首先,什么是最大流?
通俗一些的理解就是:把源点1看做是水龙头,水流通过两两之间的水管流入汇点4的单位时间最大量,当然,为了不让水管爆裂,水管通过的水流量不能超过水管的最大负载。这里写图片描述
求解最大流的两种方法
一、Ford-Fulkerson解法
2F方法依赖于三种重要思想:残留网络、增广路径和割
什么是残留网络?
残留网络是指给定网络和一个流,其对应还可以容纳的流组成的网络。
图片是copy上面链接博客主的图片

这里写图片描述
什么是增广路径?
已知一个流网络G和f,增广路径p是其残留网络Gf中从s到t的一条简单路径。也就是向这条路径压入流量,可以增加整个网络的流值。
反向边:
这里写图片描述
反向边其实是给了我们一个选择增广路径的后悔的机会。
如上图所示:我们首先选择路径1-2-3-4,这样可以增加的流值是1,之后得到的残留网络中,1已经没有路径走到4了,也就是说只能增加流值1.然而我们重新看图一,我们可以先选路径1-2-4,增加流值1,然后选择路径1-3-4,再次增加流值1,也就是说在最开始的残留网络里我们是可以增加流值2的,这就与我们选择走路径1-2-3-4发生了矛盾。
如果我们添加了反向边,那么走完1-2-3-4路径之后得到的残留网络图是第三个图,那么我们可以在这个残留网络里继续找到一条路径1-3-2-4,同样增加流值1,加和就是流值2。其实反向边是给我们选择增广路径时提供了一次反悔的机会,走1-2-3-4和1-3-2-4这两条路径,实际上我们走的是1-2-4和1-3-4这两条路,中间的2-3和3-2我们分别走了一次,流量相互抵消。
流网络的割
这里写图片描述
将流网络一分为二,源点在一部分,汇点在另一部分,一刀切分的时候我们是把几条路径给切断了,那么在这些切断的路径里,从源点所在部分流向汇点所在部分的路径的最大负载之和就是割的容量,可以看出,不同的切分导致的割的容量是不一样的。
当前穿过割的净流量就是指目前通过我们切断的路径源点流向汇点的流量。很明显,在某一时间点,从源点流出的水流量是一定的,也就是说从源点流出的到达汇点的水在某一时间点,无论你切断哪几条路径,他都是确定的,即当前穿过割的净流量是相同的。
割的容量c(u,w)+c(v,x)=26
当前穿过割的净流量f(u,w)+f(v,x)-f(w,v)=19
最大流最小割
最大流最小割定理:最大流的流量等于最小割的流量
延伸理解:如果在一个流网络图中,我们找到一个流量,他的值等于该图的一个割的容量,这个割的容量肯定是大于等于最小割的容量,也就是说你找到的这个流量大于等于最小割的容量。根据最大流最小割定理,这个流量一定就是最大值了。
那么我们就很容易证明当残留网络Gf中不包含增广路径时,f是G的最大流。
假设Gf中不包含增广路径,即Gf不包含从s到v的路径,定义S={v:Gf中从s到v存在一条通路},也就是Gf中s能够有通路到达的点的集合,显然这个集合不包括t,因为s到t没有通路。这时,我们令T=V-S。那么(S,T)就是一个割。那么,对于顶点u属于S,v属于T,有f(u,v)=c(u,v)。否则(u,v)就存在残余流量,因而s到u加上u到v就构成一条s到v的通路,所以v就必须属于S,矛盾。因此这时就表明当前流f是等于当前割的容量的,因此f就是最大流。
2F方法的实现算法
2F方法是一种迭代的方法,开始时,对所有的u,v属于V,f(u,v)=0(这里f(u,v)代表u到v的边当前流量),即初始状态时流的值为0.在每次迭代中,可以通过寻找一个增广路径来增加流值。增广路径可以看做是从源点s到汇点t之间的一条路径,沿该路径可以压入更多的流。反复进行这一过程,直到增广路径都被找出为止。
EK算法实际上就是采用广度优先搜索来实现对增广路径的计算。
Dinic算法是分阶段的在层次网络中增广。
顶点的层次是从源点到顶点u的最短路径长度(该长度仅仅是路径上边的数目,与容量无关)
层次网络:对残留网络进行分层后,删去比汇点层次更高的顶点和与汇点同层的顶点,并删去这些顶点相关联的弧,再删去从某层顶点指向同层顶点和底层顶点的弧,所剩余的各条弧的容量与残留网络中的容量相同,这样得到的网络就是层次网络。
这里写图片描述
这里写图片描述
Dinic算法具体步骤:
(1)构造残留网络和层次网络,若汇点不在层次网络中,则算法结束。
(2)在层次网络中使用一次DFS过程进行增广,DFS执行完毕,该阶段的增广也执行完毕。
(3)转步骤(1)
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值