题意:

给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质。

并且满足每根pipe一定的流量限制,范围为[Li,Ri].即要满足每时刻流进来的不能超过Ri(最大流问题),同时最小不能低于Li。

n<=200

思路:

From HZWER

上界用ci表示,下界用bi表示。

下界是必须流满的,那么对于每一条边,去掉下界后,其自由流为ci– bi。

主要思想:每一个点流进来的流=流出去的流

对于每一个点i,令

Mi= sum(i点所有流进来的下界流)– sum(i点所有流出去的下界流)

如果Mi大于0,代表此点必须还要流出去Mi的自由流,那么我们从源点连一条Mi的边到该点。

如果Mi小于0,代表此点必须还要流进来Mi的自由流,那么我们从该点连一条Mi的边到汇点。

如果求S->T的最大流,看是否满流(S的相邻边都流满)。

满流则有解,否则无解。

以下是我的理解,用来说明算法的正确性:

首先不能根据给定的条件直接建图,因为不满足流量平衡

于是我们建立一些从源点连出与连入汇点的辅助边使平衡成立

但最终方案如果还是需要辅助边的话就说明无法调整原来的流量使平衡成立

所以只需要判断源点(我觉得汇点也应该判断,但只判源点也能过)相连的边上如果还有流量就无法构造出一组可行解

  1. var head,vet,next,len,fan,a:array[..]of longint;
  2. gap:array[..]of longint;
  3. dis,sum:array[..]of longint;
  4. n,m,i,j,x,y,z,tot,source,src,s,cas,v:longint;
  5.  
  6. procedure add(a,b,c:longint);
  7. begin
  8. inc(tot);
  9. next[tot]:=head[a];
  10. vet[tot]:=b;
  11. len[tot]:=c;
  12. head[a]:=tot;
  13.  
  14. inc(tot);
  15. next[tot]:=head[b];
  16. vet[tot]:=a;
  17. len[tot]:=;
  18. head[b]:=tot;
  19. end;
  20.  
  21. function min(x,y:longint):longint;
  22. begin
  23. if x<y then exit(x);
  24. exit(y);
  25. end;
  26.  
  27. function dfs(u,aug:longint):longint;
  28. var e,v,t,val,flow:longint;
  29. begin
  30. if u=src then exit(aug);
  31. e:=head[u]; flow:=; val:=s-;
  32. while e<> do
  33. begin
  34. v:=vet[e];
  35. if len[e]> then
  36. begin
  37. if dis[u]=dis[v]+ then
  38. begin
  39. t:=dfs(v,min(aug-flow,len[e]));
  40. len[e]:=len[e]-t;
  41. len[fan[e]]:=len[fan[e]]+t;
  42. flow:=flow+t;
  43. if dis[source]>=s then exit(flow);
  44. if aug=flow then break;
  45. end;
  46. val:=min(val,dis[v]);
  47. end;
  48. e:=next[e];
  49. end;
  50. if flow= then
  51. begin
  52. dec(gap[dis[u]]);
  53. if gap[dis[u]]= then dis[source]:=s;
  54. dis[u]:=val+;
  55. inc(gap[dis[u]]);
  56. end;
  57. exit(flow);
  58. end;
  59.  
  60. function maxflow:longint;
  61. var ans:longint;
  62. begin
  63. fillchar(gap,sizeof(gap),);
  64. fillchar(dis,sizeof(dis),);
  65. gap[]:=s; ans:=;
  66. while dis[source]<s do ans:=ans+dfs(source,maxlongint);
  67. exit(ans);
  68. end;
  69.  
  70. function isok:boolean;
  71. var u,e:longint;
  72. begin
  73. u:=source; e:=head[u];
  74. while e<> do
  75. begin
  76. if len[e]> then exit(false);
  77. e:=next[e];
  78. end;
  79. exit(true);
  80. end;
  81.  
  82. begin
  83. assign(input,'zoj2314.in'); reset(input);
  84. assign(output,'zoj2314.out'); rewrite(output);
  85. readln(cas);
  86. for i:= to do
  87. if i and = then fan[i]:=i+
  88. else fan[i]:=i-;
  89. for v:= to cas do
  90. begin
  91. for i:= to s do head[i]:=;
  92. for i:= to n do sum[i]:=;
  93. s:=; tot:=;
  94. read(n,m);
  95. for i:= to m do
  96. begin
  97. read(x,y,a[i],z);
  98. sum[y]:=sum[y]+a[i];
  99. sum[x]:=sum[x]-a[i];
  100. add(x,y,z-a[i]);
  101. end;
  102. source:=n+; src:=n+; s:=n+;
  103. for i:= to n do
  104. if sum[i]< then add(i,src,-sum[i])
  105. else add(source,i,sum[i]);
  106. source:=n+; src:=n+; s:=n+;
  107. maxflow;
  108. if isok then
  109. begin
  110. writeln('YES');
  111. for i:= to m do writeln(a[i]+len[i<<]);
  112. end
  113. else writeln('NO');
  114. writeln;
  115. end;
  116. close(input);
  117. close(output);
  118. end.

【SGU194&ZOJ2314】Reactor Cooling(有上下界的网络流)的更多相关文章

  1. ZOJ 2314 Reactor Cooling 带上下界的网络流

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 题意: 给n个点,及m根pipe,每根pipe用来流躺液体的, ...

  2. 【zoj2314】Reactor Cooling 有上下界可行流

    题目描述 The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuc ...

  3. SGU 194 Reactor Cooling (无源上下界网络流)

    The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...

  4. ZOJ2314 Reactor Cooling(有上下界的网络流)

    The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...

  5. 【ZOJ2314】Reactor Cooling(有上下界的网络流)

    前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ...

  6. SGU 194. Reactor Cooling(无源汇有上下界的网络流)

    时间限制:0.5s 空间限制:6M 题意: 显然就是求一个无源汇有上下界的网络流的可行流的问题 Solution: 没什么好说的,直接判定可行流,输出就好了 code /* 无汇源有上下界的网络流 * ...

  7. ACM/ICPC 之 有流量上下界的网络流-Dinic(可做模板)(POJ2396)

    //有流量上下界的网络流 //Time:47Ms Memory:1788K #include<iostream> #include<cstring> #include<c ...

  8. ZOJ 2314 有上下界的网络流

    problemCode=2314">点击打开链接 题意:给定m条边和n个节点.每条边最少的流量和最多的流量.保证每一个节点的出入流量和相等,问能够形成吗,能够则输出每条边的流量 思路: ...

  9. poj_2396 有上下界的网络流

    题目大意 一个mxn的矩阵,给出矩阵中每一行的和sh[1,2...m]以及每一列的数字的和目sv[1,2...n],以及矩阵中的一些元素的范围限制,比如a[1][2] > 1, a[2][3] ...

  10. 【BZOJ2502】清理雪道 有上下界的网络流 最小流

    [BZOJ2502]清理雪道 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道),弧的方向代表斜坡下降 ...

随机推荐

  1. domain admin域管理员

    当计算机加入到域后,默认将"Domain Admins"组赋予了本地系统管理员的权限.也就是说,在计算机添加到域,成为域的成员主机的过程中,系统将会自动把"Domain ...

  2. APP增量更新

    增量更新的概念: 当我们手机上安装的app版本与服务器的最新版本不一致的时候,传统做法是重新下载安装一个最新版的apk文件,不过这种方式比较耗流量,不利于用户体验.增量更新就是只下载当前app版本与最 ...

  3. 记录一下java在后端用request来判断请求类型

    这几天看代码,看到这么一个操作. String requestType = request.getHeader("X-Requested-With");  于是各种查找   这里记 ...

  4. Java多线程——线程的创建方式

    Java多线程——线程的创建方式 摘要:本文主要学习了线程的创建方式,线程的常用属性和方法,以及线程的几个基本状态. 部分内容来自以下博客: https://www.cnblogs.com/dolph ...

  5. MySQL多表

    一.外键 1.外键:链接两张表的字段,通过主表的主键和从表的外键来描述主外键关系,呈现的是一对多的关系.例如:商品类别(一)对商品(多),主表:商品类别表,从表:商品表. 2.外键的特点:从表外键的值 ...

  6. iOS Programming Camera 2

    iOS Programming Camera  2  1.1 Creating BNRImageStore The image store will fetch and cache the image ...

  7. vs2015 qt5.8新添加文件时出现“无法找到源文件ui.xxx.h”

    转载请注明出处:http://www.cnblogs.com/dachen408/p/7147135.html vs2015 qt5.8新添加文件时出现“无法找到源文件ui.xxx.h” 暂时解决版本 ...

  8. C++ 类、对象、class

    一.对象初始化 1.不能在类声明中对数据成员初始化,因为类只是一个抽象类型,不占存储空间,无处容纳数据. 2.若某类的数据成员都是public,则可以像结构体一样初始化,如 Time t={12,21 ...

  9. Pycharm 设置python文件自动生成头部信息模板

    设置头部信息路径: 打开File—Settings—Editor—File and Code Templates—Python Script 输入要自动生成的头部信息模板 这样,新建py文件就会自动生 ...

  10. Linux之基础命令——打包压缩

    tar(备份与打包) linux中tar命令相当于win下的多个文件压缩成一个压缩文件. -c:创建新的备份文件 -x:还原压缩的备份文件 -f:需要备份归档的文件名 -j:使用bzip2解压缩 -z ...