假设初始流为每条边的下界。但这样可能流量会不守恒,我们需要在上面加上一个附加流使流量守恒。只要让每个点开始的出/入流量与原初始流相等就可以求出附加流了。那么新建超源S超汇T,令degree[i]表示流入i的边的下界之和-从i流出的边的下界之和。

  若degree[i]>0,则表示需要有额外degree[i]的流量流入i来达到流量平衡,那么从S向i连上界为degree[i]的边。

  若degree[i]<0,则表示需要有额外degree[i]的流量从i流出来达到流量平衡,那么从i向T连上界为-degree[i]的边。

  跑最大流就可以求出附加流。显然maxflow<=sigma(degree[i])。如果maxflow=sigma(degree[i]),那么有可行流。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. int read()
  9. {
  10. int x=,f=;char c=getchar();
  11. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  12. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  13. return x*f;
  14. }
  15. #define N 210
  16. #define M 50000
  17. #define S 0
  18. #define T 201
  19. #define inf 1000000000
  20. int n,m,t=-,p[N],degree[N],l[M],tot=;
  21. int cur[N],d[N],q[N],ans=;
  22. struct data{int to,nxt,cap,flow;
  23. }edge[M];
  24. void addedge(int x,int y,int z)
  25. {
  26. t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=,p[x]=t;
  27. t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=,edge[t].flow=,p[y]=t;
  28. }
  29. bool bfs()
  30. {
  31. memset(d,,sizeof(d));d[S]=;
  32. int head=,tail=;q[]=S;
  33. do
  34. {
  35. int x=q[++head];
  36. for (int i=p[x];~i;i=edge[i].nxt)
  37. if (d[edge[i].to]==-&&edge[i].flow<edge[i].cap)
  38. {
  39. d[edge[i].to]=d[x]+;
  40. q[++tail]=edge[i].to;
  41. }
  42. }while (head<tail);
  43. return ~d[T];
  44. }
  45. int work(int k,int f)
  46. {
  47. if (k==T) return f;
  48. int used=;
  49. for (int i=cur[k];~i;i=edge[i].nxt)
  50. if (d[k]+==d[edge[i].to])
  51. {
  52. int w=work(edge[i].to,min(f-used,edge[i].cap-edge[i].flow));
  53. edge[i].flow+=w,edge[i^].flow-=w;
  54. if (edge[i].flow<edge[i].cap) cur[k]=i;
  55. used+=w;if (used==f) return f;
  56. }
  57. if (used==) d[k]=-;
  58. return used;
  59. }
  60. void dinic()
  61. {
  62. while (bfs())
  63. {
  64. memcpy(cur,p,sizeof(p));
  65. ans+=work(S,inf);
  66. }
  67. }
  68. int main()
  69. {
  70. #ifndef ONLINE_JUDGE
  71. freopen("loj115.in","r",stdin);
  72. freopen("loj115.out","w",stdout);
  73. const char LL[]="%I64d";
  74. #else
  75. const char LL[]="%lld";
  76. #endif
  77. n=read(),m=read();
  78. memset(p,,sizeof(p));
  79. for (int i=;i<=m;i++)
  80. {
  81. int x=read(),y=read(),low=read(),high=read();
  82. addedge(x,y,high-low);
  83. degree[y]+=low,degree[x]-=low;
  84. l[i]=low;
  85. }
  86. for (int i=;i<=n;i++)
  87. if (degree[i]>) addedge(S,i,degree[i]),tot+=degree[i];
  88. else if (degree[i]<) addedge(i,T,-degree[i]);
  89. dinic();
  90. if (ans<tot) cout<<"NO";
  91. else
  92. {
  93. cout<<"YES\n";
  94. for (int i=;i<=m;i++)
  95. printf("%d\n",edge[i-<<].flow+l[i]);
  96. }
  97. return ;
  98. }

LOJ115 无源汇有上下界可行流(上下界网络流)的更多相关文章

  1. 【LOJ115】无源汇有上下界可行流(模板题)

    点此看题面 大致题意: 给你每条边的流量上下界,让你判断是否存在可行流.若有,则还需输出一个合法方案. 大致思路 首先,每条边既然有一个流量下界\(lower\),我们就强制它初始流量为\(lower ...

  2. LOJ [#115. 无源汇有上下界可行流](https://loj.ac/problem/115)

    #115. 无源汇有上下界可行流 先扔个板子,上下界的东西一点点搞,写在奇怪的合集里面 Code: #include <cstdio> #include <cstring> # ...

  3. ZOJ 2314 - Reactor Cooling - [无源汇上下界可行流]

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 The terrorist group leaded by ...

  4. 2018.08.20 loj#115. 无源汇有上下界可行流(模板)

    传送门 又get到一个新技能,好兴奋的说啊. 一道无源汇有上下界可行流的模板题. 其实这东西也不难,就是将下界变形而已. 准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源 ...

  5. hdu 4940 Destroy Transportation system (无源汇上下界可行流)

    Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 ...

  6. zoj 2314 Reactor Cooling (无源汇上下界可行流)

    Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds ...

  7. [loj#115] 无源汇有上下界可行流 网络流

    #115. 无源汇有上下界可行流 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据   题 ...

  8. zoj2314 无源汇上下界可行流

    题意:看是否有无源汇上下界可行流,如果有输出流量 题解:对于每一条边u->v,上界high,下界low,来说,我们可以建立每条边流量为high-low,那么这样得到的流量可能会不守恒(流入量!= ...

  9. loj#115. 无源汇有上下界可行流

    \(\color{#0066ff}{ 题目描述 }\) 这是一道模板题. \(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \ ...

  10. Zoj 2314 Reactor Cooling(无源汇有上下界可行流)

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

随机推荐

  1. 利用arduino制作瓦力万年历-1.0

    转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 直接先上图: 主要实现: 1.使用了arduino uno R3,因为瓦力内部空间有限,如果 ...

  2. Linux下NTP服务器配置

    简介 原理 配置ntp服务器 进行同步 一.简介 在计算时间的时候,最准确的计算应该是使用『原子震荡周期』所计算的物理时钟了( Atomic Clock, 也被称为原子钟 ),这也被定义为标准时间(I ...

  3. MSComm控件与Win32 API操作串口有何区别?

    MSComm控件与Win32 API操作串口有何区别? [问题点数:50分,结帖人shell_shell]   收藏帖子 回复 我是一个小兵,在战场上拼命!   结帖率 83.33% 我以前用MSCo ...

  4. Shiro的认证授权

    shiro安全框架入门整理 package com.shiro.test; import org.apache.shiro.SecurityUtils; import org.apache.shiro ...

  5. Sql Server插入数据并返回自增ID,@@IDENTITY,SCOPE_IDENTITY和IDENT_CURRENT的区别(转载)

    预备知识:SQL Server的IDENTITY关键字IDENTITY关键字代表的是一个函数,而不是identity属性.在access里边没有这个函数,所以在access不能用这个语句.语法:ide ...

  6. Python 学习 第一篇:数据类型(数字,集合,布尔类型,操作符)

    Python语言最常用的对象是变量和常量,常量的值是字面意思,其值是不可变的,变量的值是可变的,例如,123,"上海"是常量,而a=1,a=2,其中a是变量名.内置的核心数据类型有 ...

  7. ABP+AdminLTE+Bootstrap Table权限管理系统第三节--abp分层体系,实体相关及ABP模块系统

    返回总目录:ABP+AdminLTE+Bootstrap Table权限管理系统一期 ABP模块系统 说了这么久,还没有详细说到abp框架,abp其实基于DDD(领域驱动设计)原则的细看分层如下: 再 ...

  8. PHP从入门到精通(五)

    字符串三种声明方式 1."":双引号中可以解析变量"{$a}",双引号中可以使用任何转义字符:2.'':单引号中不可以解析变量,单引号中不可以使用转义字符(但是 ...

  9. 雅思听听app

    最近本人呢,正在紧张的备战雅思考试,因为英语基础很弱,尤其是听力,所以老师推荐了雅思听听这个app,说是特别好使,用了一个多月的,总体来说感觉还是很nice的,但是还有一些小毛病,不过这小毛病瑕不掩瑜 ...

  10. 《移山之道》Reading Task——by12061154Joy

    最近因为作业的原因所以接触到了这本书,给我最特别的感觉就是很新鲜,主要是因为这本书是以故事展开的,大概是我读的书太少,基本没有看到过专业书的知识体系是用故事串讲起来的,这样帮助读者理解了一些概念并且不 ...