最大流算法研讨.ppt

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
最大流算法研讨

最大流算法 问题:问从S到T的最大水流量是多少? 一、网络流的定义 有唯一的一个源点S(入度为0:出发点) 有唯一的一个汇点 T(出度为0:结束点) 图中每条弧 (u, v) 都有一非负容量 c ( u, v ) 1、可行流 ◆每条弧 ( u, v )上 给定一个实数f(u,v),满足:有 0 = f ( u, v ) = c( u, v ),则f(u,v)称为弧( u, v )上的流量。 ◆如果有一组流量满足条件: 源点s : 流出量 = 整个网络的流量 汇点t : 流入量 =整个网络的流量 中间点:总流入量 = 总流出量 那么整个网络中的流量成为一个可行流。 2、最大流 在所有的可行流中, 流量最大的一个流的流量 如: 图2中可行流7也是最大流。 最大流可能不只一个。 二、最大流算法 步骤: (1)如果存在增广路径,就找出一条增广路径 (2)然后沿该条增广路径进行更新流量 (增加流量) 1、增广路径 从 s 到 t 的一条简单路径,若边 ( u, v ) 的方向与该路径的方向一致,称 ( u, v ) 为正向边,方向不一致时称为逆向边。 2、沿增广路径增广 1) 先设d为为正无穷(可增加流,余流量) 若( u, v ) 是正向边 d = min ( d, c ( u, v ) – f (u, v ) ) 若( u, v ) 是逆向边 d = min ( d, f ( u, v ) ) 2 ) 对与该增广路径上的边 若( u, v ) 是正向边,f ( u, v ) = f ( u, v ) + d; 若( u, v ) 是逆向边,f ( u, v ) = f ( u, v ) – d;       增广后,总流量增加了d 定理: 可行流 f 为最大流,当且仅当不存在关于f 的增广路径 证:若 f 是最大流,但图中存在关于 f 的增广路径,则可以沿该增广路径增广,得到的是一个更大的流,与f 是最大流矛盾。所以,最大流不存在增广路径。 ◆Ford-Fulkerson方法(增广流)求最大流 (福特-福克森) 步骤: (1)如果存在增广路径,就找出一条增广路径 DFS,BFS (2)然后沿该条增广路径进行更新流量 (增加流量) 优化 残留网络 d 的设置: 若存在 ( u, v ) 则 d ( u, v ) = c ( u, v ) – f ( u, v ) d ( v, u ) = f ( u, v ) d ( u, v ) 是 从 u 到 v 能增加的最大流量 理解: (u,v) 的流量为f(u,v),作为正向边还可以增加的量是c ( u, v ) – f ( u, v ),作为逆向边,还可以增加的流量为: f ( u, v )。 增广路上正向边流量增加,逆向边增加流量减少。 深搜找增广路径过程 function find( k:integer ):boolean; if k=n then exit(true); for i:=1 to n do if (b[i]= -1) and (d[k,i]0) then [ b[i]:=k; if find(i) then exit(true); // 此处b[i]不需要变回-1] exit(false); // b[1]=0; b[2~ n]= -1; 主函数中调用find(1) 广搜找增广路径过程 function bfsbfs:boolean; a 是广搜队列 for i:=1 to n do b[i]:=-1; b 是前驱 b[1]:=0; a[1]:=1; open:=0; closed:=1; while openclosed do [ inc(open); k:=a[open]; for i:=1 to n do

文档评论(0)

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

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

1亿VIP精品文档

相关文档