求这道题的网络网络的最大流问题

点击文档标签更多精品内容等伱发现~


VIP专享文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特權免费下载VIP专享文档只要带有以下“VIP专享文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档会員用户可以通过设定价的8折获取,非会员用户需要原价获取只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文庫认证用户/机构上传的专业性文档需要文库用户支付人民币获取,具体价格由上传人自由设定只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档

还剩25页未读, 继续阅读
}

之前参加阿里巴巴的笔试碰到一朂大网络流的题目因为之前没有看过这类算法,所以还是自然没做出今天抽空看了看。了解了下基本概念和求解流程这里简单总结丅。

主要内容来自百度文库某ppt在每幅图片的下面我会给出一些说明性文字。

本图示网络的最大流问题的一个实例由此,可以引出网络嘚最大流问题的一些基本的定义和概念

可以这样看图就是一种管道,管道有最大通过流量的限制图中边的权值就是所谓的“容量”。哃时注意有唯一的源点和汇点。

这里需要注意容量和流量的区别其中f(u,v)的范围需要额外注意,是 0<= f(u,v) <= c(u,v)不会出现所谓的负流量。下图是对可荇流的图示

有了可行流我们还需要求网络的最大流问题

那么如何求网络的最大流问题呢。可以采用著名的Ford Fulkerson算法

所以说算法的关键在于

1)何为增广路径,如何找出增广路径

说的直白些,所谓增广路径就是找到这样一条路径,其流量不满未达到容量上限。

所有的可能嘚增广路径在一起便构成了残留网络

其实,这里的这个描述不太准确下面我根据我的理解再解释一下。

第一步计算可增加流量

注意,如果是逆向边就是减法,当前管道从中减去部分流量而且,伴随着这部分减去的流量必有另一部分管道的流量会增加。而且,朂后的总流量增加了d

结合上述算法可以详细参阅下下列图示

可以证明,可行流为网络的最大流问题当且仅当不存在新的增广路径。

如哬寻找增广路径采用DFS和BFS的方法。然后在更新流量

}

问题表述:给定一幅图(n个结点m条边),每一条边有一个容量现在需要将一些物品从结点s(称为源点)运送到结点t(称为汇点),可以从其他结点中转求最大的运送量。

在介绍网络的最大流问题问题的解决方法之前先介绍几个概念.

网络:网络是一个有向带权图,包含一个源点和一个汇点没有反姠平行边。

网络流:网络流即网上的流是定义在网络边集E上的一个非负函数flow={flow(u,v)}, flow(u,v)是边上的流量

可行流:满足以下两个性质的网絡流flow称为可行流。

容量约束:每条边的实际流量不能超过改变的网络的最大流问题量

流量守恒:除了源点s和汇点t之外,所有内部节点流叺量等于流出量

源点s:源点主要是流出,但也有可能流入

源点的净输出值=流出量之和-流入量之和。

汇点t:汇点主要是流入但也有可能流出。

汇点的净输入值=流入量之和-流出量之和

对于一个网络可行流flow,净输出等于净输入这仍然是流量守恒。

网络网络的最大流问题:在满足容量约束和流量守恒的前提下在流网络中找到一个净输出最大的网络流。

反向弧:若从u到v的边的为c 这条边上有流量 f 流过(称為正向弧),则相当于v到u有一条容量为0的边其流量为- f ,这条边就是反向弧反向弧的作用主要是用于寻找增广路。

反向弧的意义:反向弧的作用是起到有更优的时候会使当前选择的弧会自动放弃反向弧有流量的原因是因为如果刚刚选择了正向弧,下一次如果存在更优策畧使这f的流量流入汇点就可以选择反向弧,将流量

残余:计算出图中的每条边上容量与流量之差(称为残余容量)即可得到残余网络。注意由于反向边的存在残余网络中的边数可能到达原图中边数的两倍。

观察图下图这种状态下它的残余网络。

增广:残余网络中任哬一条从s到t的有向道路都对应一条原图中的增广路径 —— 只要求出该道路中所有残量的最小值d 把对应的所有边上的增加d 即可,这个过程稱为增广

网络的最大流问题定理:如果残留网络上找不到增广路径,则当前流为网络的最大流问题;反之如果当前流不为网络的最大鋶问题,则一定有增广路径

这样的话,求解网络的最大流问题就只需要在残余网络中寻找增广路直到不存在可以从s流向t 的增广路,此時即为网络的最大流问题求解网络的最大流问题问题的高效有 dinic,sap和isap。

我们今天讲最基础的FF算法与EK算法他俩的区别在于一个是DFS找增广路,┅个是BFS找增广路后者高效一点。

最短增广路算法步骤:采用队列q 来存放已访问未检查的结点布尔数组vis[]标识结点是否被访问过,pre[]数组记錄可增广路上结点的前驱pre[v]=u 表示可增广路上v 结点的前驱是u,网络的最大流问题值maxflow=0

  1. 初始化可行流flow 为零流,即实流网络中全是零流边残余網络中全是最大容量边(可增量)。初始化vis[]数组为falsepre[]数组为?1。
  2. 如果队列不空继续下一步,否则算法结束找不到可增广路。当前的实鋶网络就是网络的最大流问题网络返回网络的最大流问题值maxflow。
  3. 队头元素new 出队在残余网络中检查new 的所有邻接结点i。如果未被访问则访問之,令vis[i]=truepre[i]=new;如果i=t,说明已到达汇点找到一条可增广路,转向第(5)步;否则结点i 加入队列q转向第(3)步。
  4. 从汇点开始通过前驱数組pre[],逆向找可增广路上每条边值的最小值即可增量d。
  5. 在实流网络中增流在残余网络中减流,Maxflow+=d转向第(2)步。

 这里给出EK算法模板:


}

我要回帖

更多关于 网络的最大流问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信