有上下界网络流问题.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
有上下界网络流问题.docx

有上下界网络流问题1.无源汇最大流2.有源汇最大流3.有源汇最小流1.无源汇最大流问题sgu194题意:  给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质。并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li。例如:46(4个点,6个pipe) 1213(1-2上界为3,下界为1) 2313 3413 4113 1313 4213可行流: 再如:所有pipe的上界为2下界为1的话,就不能得到一种可行流。 题解:上界用ci表示,下界用bi表示。下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci–bi。主要思想:每一个点流进来的流=流出去的流对于每一个点i,令Mi=sum(i点所有流进来的下界流)–sum(i点所有流出去的下界流)如果Mi大于0,代表此点必须还要流出去Mi的自由流,那么我们从源点连一条Mi的边到该点。如果Mi小于0,代表此点必须还要流进来Mi的自由流,那么我们从该点连一条Mi的边到汇点。如果求S-T的最大流,看是否满流(S的相邻边都流满)。满流则有解,否则无解。 2.有源汇最大流zoj3229题意:经过构图之后得到这样的问题,源点s,汇点t,有些边有上下界[Li,Ri].求s-t的最大流。题解:满足所有下界的情况下,判断是否存在可行流,方法可以转化成上面无源汇上下界判断方法。只要连一条T→S的边,流量为无穷,没有下界,那么原图就得到一个无源汇的循环流图。接下来的事情一样:原图中的边的流量设成自由流量ci–bi。新建源点SS汇点TT,求Mi,连边。然后求SS→TT最大流,判是否满流。判定有解之后然后求最大流,信息都在上面求得的残留网络里面。满足所有下界时,从s→t的流量为多少?后悔边s→t的边权!然后在残留网络中s→t可能还有些自由流没有流满,再做一次s→t的最大流,所得到的最大流就是原问题的最大流(内含两部分:残留的自由流所得到的流+后悔边s→t)。 3.有源汇最小流题意:经过构图之后得到这样的问题,源点s,汇点t,有些边有上下界[Li,Ri].求s-t的最小流。题解:同样先转换为无源汇网络流问题,添加t→s边权为无穷。那么最小流不就是在满足所有下界的情况的流么。即上面提到的,求得SS→TT的最大流之后,其后悔边s→t的边权即为最小流。但是wa了,下面看一个wa的例子: 最后求得SS→TT的最大流之后,得到后悔边s→t的边权为200,实际上该网络最小流只要100:s→1:1001→3:2003→2:2002→1:1002→t:100问题出在原图中存在环,循环流,而我们没有利用,导致流增大了。解决方法:先不加t→s边权为无穷的边,求SS→TT的最大流,如果还没有流满则再加t→s边权为无穷的边,再求一次最大流得到后悔边s→t就是原问题的最小流了。 zoj_3229_AC_code:/*求有源汇的最大流问题*/memset(in,0,sizeof(in));/*初始化出度,入度,用于求Mi*/memset(out,0,sizeof(out)); M=n+m+2;/*初始化网络,设置源点汇点*/s=0;t=M-1;cnt=-1;memset(mat,0,sizeof(mat));for(inti=1;i=n;i++){/*添加自由流*/  for(intj=1;j=C[i];j++){     addEdge(i,n+T[i][j],R[i][j]-L[i][j],0);      in[n+T[i][j]]+=L[i][j];      out[i]+=L[i][j];   }}for(inti=1;i=n;i++){   addEdge(s,i,D[i],0);}for(inti=1;i=m;i++){   addEdge(n+i,t,INF-G[i],0);   in[t]+=G[i];   out[n+i]+=G[i];} addEdge(t,s,INF,0);/*添加一条t→s的边,权值为INF*/M+=2;s=M-1;t=s-1;/*添加SS,TT*/ sum=0;/*满流变量*/ for(inti=0;iM;i++){/*根据Mi连边*/   if(in[i]out[i]){      addEdge(s,i,in[i]-out[i],0);      sum+=in[i]-out[i];   }else{      addEdge(i,t,out[i]-in[i],0);   }} intmaxflow=dinic();/*求SS→Tt的最大流*/ if(sum!=maxflow){/*不满流则输出-1*/ 

文档评论(0)

dmz158 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档