网络流算法资料.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络流 基础知识简介 问题模型 s地往t地运输原料,已知s、t分别是有向图G中的两点,每条有向边都有一定的流量Cij。Cij表示从i点到j点运输不能超过的运输量。图G可以称作一个网络,而s能够运输到t的最大运输量则是该网络的最大流 这里s和t分别称为源点和汇点 可行流 在网络的一个可行流中,即任意一个实际运输情况中,实际运输量必须满足一些关系: 1-实际运输量不能是负的 2-每条弧的实际运输量不能大于该弧的容量 3-除了起点Vs和重点Vt外,对其他定点来说指向Vi的弧上的运输量之和,应该等于所有从Vi出发的弧上的运输量之和 可改进路P 若给定一个可行流F=(Fij),我们把网络中Fij=Cij的弧称作饱和弧, FijCij的弧称作非饱和弧, Fij=0的弧称作零流弧, Fij0的弧称作非零流弧 若P是网络中联结源点s和汇点t的的一条路(不用管边的有向性),我们定义路的方向是从Vs到Vt,则路上的弧被分为两类-一类与路的方向一致,称为前向弧;另一类和路的方向相反,称为后向弧 可改进路P 如果对于P上的每一条前向弧都是非饱和弧,每一条后向弧都是非零流弧,则称P为一条可改进路。因为可以通过修正P上各弧的流量来使得总流量变得更大。修正的方法是: 1-不属于P的弧一概不变 2-对于P上的所有前向弧加上a,后向弧减去a。这里a是一个可改进量。 求网络的最大流 a既要尽量大,又要保证变化后0=Fij=Cij。因此a=min(min(C前向弧ij-F前向弧ij),min(F后向弧ij))。 如果不存在Vs到Vt的可改进路,则该网络已经形成了最大流。 那么求最大流的算法可以大致表示为:不断寻找可改进路P,并修改P,直到找不到P为止。这和用匈牙利算法求二分图最大匹配的思路是一致的。 下面介绍一种用标号法来寻找可改进路的算法。 求最大流的标号法 每个顶点的标号分为两个部分:记录是否标号的部分和记录是否检查的部分。 标号法流程: 1-先标记源点s为已标号未检查 2-找出一个已标号未检查的点i 3-寻找所有未标号的和i相连的点j,弧Fij必须满足可改进路中对弧的要求。记j为已标号未检查。 4-记i为已标号已检查,并重复2-4的过程,直到汇点t已标号。 求最大流的标号法 由此我们得到了一条有s到t的可改进路。 先修改可改进路,然后重复上述标号过程,直到找不出可改进路为止。 最后我们便得到了整个网络的最大流。 至于可改进路的记录和改进量a的计算等,可以在标号的过程中同时完成,这里可以参考程序。 最大流参考程序 Function ford : boolean; var i,j,a : integer; begin ford := false; fillchar(p,sizeof(p),0); p[s].pre := s; repeat for i := 1 to n do if (p[i].pre0)and(p[i].check=0) then break; if Not((p[i].pre0)and(p[i].check=0)) then exit; for j := 1 to n do if (p[j].pre=0)and(c[i,j]0)or(c[j,i]0) then 最大流参考程序 begin if (f[i,j]c[i,j]) then p[j].pre := i; if (f[j,i]0) then p[j].pre := -i; end; p[i].check := 1; until p[t].pre 0; i := t; a := maxint; repeat j := i; i := abs(p[j].pre); if p[j].pre0 then if (f[j,i]a) then a := f[j,i]; if p[j].pre0 then if (c[i,j]-f[i,j]a) then a := c[i,j] - f[i,j]; until i = s; 最大流参考程序 i := t; repeat j := i; i := abs(p[j].pre); if p[j].pre0 then f[j,i] := f[j,i] - a; if p[j].pre0 then f[i,j] := f[i,j] + a; until i = s; ford:=true; end; 主程序中调用while ford do;即可求得该网络的最大流。 容量

您可能关注的文档

文档评论(0)

1112111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档