传送门

又get到一个新技能,好兴奋的说啊。

一道无源汇有上下界可行流的模板题。

其实这东西也不难,就是将下界变形而已。

准确来说,就是对于每个点,我们算出会从它那里强制流入与流出的流量,然后与超级源点,汇点连边,这样我们就成功去掉了下界的限制,上界从r变成了r-l,这样子跑一边最大流,看一下是不是每一条强制流完的边都流完了,如果有边没有流完,说明无法保证流出全部下界,否则的话就可以流完所有下界,又因为是要求可行流,所以只要下界留完了随便输出就行了。

代码:

  1. #include<bits/stdc++.h>
  2. #define N 705
  3. #define M 500005
  4. using namespace std;
  5. inline int read(){
  6. int ans=0;
  7. char ch=getchar();
  8. while(!isdigit(ch))ch=getchar();
  9. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  10. return ans;
  11. }
  12. inline void write(int x){
  13. if(x>9)write(x/10);
  14. putchar((x%10)^48);
  15. }
  16. int n,m,s,t,first[N],d[N],cnt=0,m_[N],low[M],tot[M];
  17. struct Node{int v,next,c;}e[M];
  18. inline void add(int u,int v,int c){e[cnt].v=v,e[cnt].c=c,e[cnt].next=first[u],first[u]=cnt++;}
  19. inline bool bfs(){
  20. queue<int>q;
  21. memset(d,-1,sizeof(d));
  22. q.push(s),d[s]=0;
  23. while(!q.empty()){
  24. int x=q.front();
  25. q.pop();
  26. for(int i=first[x];~i;i=e[i].next){
  27. int v=e[i].v;
  28. if(d[v]!=-1||e[i].c<=0)continue;
  29. d[v]=d[x]+1;
  30. if(v==t)return true;
  31. q.push(v);
  32. }
  33. }
  34. return false;
  35. }
  36. inline int dfs(int x,int f){
  37. if(x==t||!f)return f;
  38. int flow=f;
  39. for(int i=first[x];~i;i=e[i].next){
  40. int v=e[i].v;
  41. if(flow&&d[v]==d[x]+1&&e[i].c>0){
  42. int tmp=dfs(v,min(e[i].c,flow));
  43. if(!tmp)d[v]=-1;
  44. e[i].c-=tmp,e[i^1].c+=tmp,flow-=tmp;
  45. }
  46. }
  47. return f-flow;
  48. }
  49. inline bool check(){
  50. for(int i=first[s];~i;i=e[i].next)if(e[i].c>0)return false;
  51. for(int i=first[t];~i;i=e[i].next)if(e[i^1].c>0)return false;
  52. return true;
  53. }
  54. int main(){
  55. memset(first,-1,sizeof(first));
  56. n=read(),m=read(),s=0,t=n+1;
  57. for(int i=1;i<=m;++i){
  58. int u=read(),v=read();
  59. low[i]=read();
  60. int mx=read();
  61. add(u,v,mx-low[i]),add(v,u,0),m_[u]-=low[i],m_[v]+=low[i];
  62. }
  63. int tmp=cnt;
  64. for(int i=1;i<=n;++i){
  65. if(m_[i]>0)add(s,i,m_[i]),add(i,s,0);
  66. if(m_[i]<0)add(i,t,-m_[i]),add(t,i,0);
  67. }
  68. int ans=0;
  69. while(bfs())ans+=dfs(s,0x3f3f3f3f);
  70. if(!check()){cout<<"NO";return 0;}
  71. cout<<"YES"<<'\n';
  72. for(int i=0;i<=tmp-1;i+=2)cout<<e[i^1].c+low[(i+2)/2]<<'\n';
  73. return 0;
  74. }

2018.08.20 loj#115. 无源汇有上下界可行流(模板)的更多相关文章

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

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

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

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

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

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

  4. 2018.08.20 loj#116. 有源汇有上下界最大流(模板)

    传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...

  5. 2018.08.20 loj#117. 有源汇有上下界最小流(模板)

    传送门 这题真有意思... 先是有一个点T的我怀疑人生. 然后学大佬们封装了我的dinic就莫名其妙的过了??? 所以说锅给谁好呢? 给dinic吧... 解法就是先求出一段可行流,然后从t到s加一条 ...

  6. LibreOJ #115. 无源汇有上下界可行流

    二次联通门 : LibreOJ #115. 无源汇有上下界可行流 /* LibreOJ #115. 无源汇有上下界可行流 板子题 我也就会写写板子题了.. */ #include <cstdio ...

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

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

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

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

  9. 无源汇有上下界可行流(ZQU 1590)

    无源汇有上下界可行流(也就是循环流) 模型:一个网络,求出一个流,使得每条边的流量必须>=Li且<=Hi, 每个点必须满足总流入量=总流出量(流量守恒)(这个流的特点是循环往复,无始无终) ...

随机推荐

  1. spring集成多个rabbitMQ

    转自:https://blog.csdn.net/zz775854904/article/details/81092892 MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用 ...

  2. 4.struts2的配置文件优先级

    转自:https://wenku.baidu.com/view/84fa86ae360cba1aa911da02.html 在struts2中一些配置(比如常量)可以同时在struts-default ...

  3. apiCloud事件发送与监听

    apiCloud事件发送与监听 1.sendEvent 将任意一个自定义事件广播出去,该事件可在任意页面通过 addEventListener 监听收到. sendEvent({params}) 2. ...

  4. Haskell语言学习笔记(50)Extra

    Extra 安装 extra 模块. $ cabal install extra Installed extra-1.6 Prelude> :m +Extra Prelude Extra> ...

  5. Haskell语言学习笔记(47)Arrow(2)

    Function, Monad, Arrow f :: Int -> (Int, Int) f = \x -> let y = 2 * x z1 = y + 3 z2 = y - 5 in ...

  6. ssh 免密码登录,以及 本地和远端用户名不一致 问题

    ssh 远程登录 ssh -l u1 u1@192.168.0.7 ssh u1@192.168.0.7 每次远程都要输入 用户名,密码 比较麻烦.所以比较好的是免密码登录 1.安装ssh服务器 su ...

  7. neo4j 学习-1

    Neo4j 子句 ```MATCH (:Person { name: 'an' })-[r]->(:Persion) RETURN type(r) // 返回关系的类型 如:r 就是 'KNOW ...

  8. PHP与apache配置

    在apache 的安装路径中找到 \conf\httpd.conf文件 在 LoadModule最后面添加如下代码: PHPIniDir "D:\PHP"LoadModule ph ...

  9. 《你不知道的JavaScript下卷》知识点笔记

    1. [1, 2, 3] == [1, 2, 3] 返回false [1, 2, 3] == “1, 2, 3” 返回true 2. 如果 < 比较的两个值都是字符串, 就像在b < c中 ...

  10. linux下面得小数计算

    可以通过命令行向awk中传递参数. 这样子传递进去的参数,在awk命令中可以访问.每一项都必须作为单一的一个参数来解释.所以,等号之间不能有空格. 比如说我们传递进去一个学生名字,想查这个学生的得分. ...