题目链接

有源汇有上下界最大流,->上下界网络流

注意细节,重置cur和dis数组时,有n+2个点

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cmath>
  5. #include<iostream>
  6.  
  7. using namespace std;
  8.  
  9. const int N = ;
  10. const int INF = 1e9;
  11.  
  12. struct Edge {
  13. int to,nxt,c;
  14. }e[];
  15. int head[N],dis[N],cur[N],M[N];
  16. int q[],L,R;
  17. int n,m,S,T,tot = ,Sum;
  18.  
  19. inline char nc() {
  20. static char buf[],*p1 = buf,*p2 = buf;
  21. return p1==p2&&(p2=(p1=buf)+fread(buf,,,stdin),p1==p2)?EOF:*p1++;
  22. }
  23. inline int read() {
  24. int x = ,f = ;char ch = nc();
  25. for (; ch<''||ch>''; ch=nc()) if(ch=='-') f=-;
  26. for (; ch>=''&&ch<=''; ch=nc()) x=x*+ch-'';
  27. return x * f;
  28. }
  29. void add_edge(int u,int v,int c) {
  30. e[++tot].to = v,e[tot].c = c,e[tot].nxt = head[u],head[u] = tot;
  31. }
  32. bool bfs() {
  33. for (int i=; i<=n+; ++i) // n+2
  34. cur[i] = head[i],dis[i] = -;
  35. L = ,R = ;
  36. q[++R] = S;
  37. dis[S] = ;
  38. while (L <= R) {
  39. int u = q[L++];
  40. for (int i=head[u]; i; i=e[i].nxt) {
  41. int v = e[i].to;
  42. if (dis[v] == - && e[i].c > ) {
  43. dis[v] = dis[u] + ;
  44. q[++R] = v;
  45. if (v == T) return true;
  46. }
  47. }
  48. }
  49. return false;
  50. }
  51. int dfs(int u,int flow) {
  52. if (u == T) return flow;
  53. int used = ;
  54. for (int &i=cur[u]; i; i=e[i].nxt) {
  55. int v = e[i].to;
  56. if (dis[v] == dis[u] + && e[i].c > ) {
  57. int tmp = dfs(v,min(e[i].c,flow-used));
  58. if (tmp > ) {
  59. e[i].c -= tmp;e[i^].c += tmp;
  60. used += tmp;
  61. if (used == flow) break;
  62. }
  63. }
  64. }
  65. if (used != flow) dis[u] = -;
  66. return used;
  67. }
  68. int dinic(int s,int t) {
  69. S = s,T = t;
  70. int ans = ;
  71. while (bfs()) ans += dfs(S,INF);
  72. return ans;
  73. }
  74. int main () {
  75. freopen("1.txt","r",stdin);
  76. n = read(),m = read();
  77. int s = read(),t = read();
  78. int ss = n+,tt = n+;
  79. for (int i=; i<=m; ++i) {
  80. int u = read(),v = read(),b = read(),c = read();
  81. add_edge(u,v,c-b);
  82. add_edge(v,u,);
  83. M[u] -= b;M[v] += b;
  84. }
  85. for (int i=; i<=n; ++i) {
  86. if (M[i] > ) add_edge(ss,i,M[i]),add_edge(i,ss,),Sum += M[i];
  87. if (M[i] < ) add_edge(i,tt,-M[i]),add_edge(tt,i,);
  88. }
  89. add_edge(t,s,INF);
  90. add_edge(s,t,);
  91. if (dinic(ss,tt) != Sum) {
  92. puts("please go home to sleep");
  93. return ;
  94. }
  95. int ans = e[tot].c;
  96. e[tot].c = ;e[tot ^ ].c = ;
  97. ans += dinic(s,t);
  98. printf("%d\n",ans);
  99. return ;
  100. }

loj #116. 有源汇有上下界最大流的更多相关文章

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

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

  2. LibreOJ #116. 有源汇有上下界最大流

    二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...

  3. loj #117. 有源汇有上下界最小流

    题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...

  4. Loj#116-[模板]有源汇有上下界最大流

    正题 题目链接:https://loj.ac/p/116 题目大意 \(n\)个点\(m\)条边的一张图,每条边有流量上下限制,求源点到汇点的最大流. 解题思路 先别急着求上面那个,考虑一下怎么求无源 ...

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

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

  6. LOJ.117.[模板]有源汇有上下界最小流(Dinic)

    题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...

  7. 【Loj116】有源汇有上下界最大流(网络流)

    [Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...

  8. LOJ116 - 有源汇有上下界最大流

    原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...

  9. [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流

    poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...

随机推荐

  1. linux awk 内置函数实例

    awk内置函数,主要分4种:算数函数.字符串函数.时间函数.一般函数 一.算术函数 以下算术函数执行与 C 语言中名称相同的子例程相同的操作: 函数名 说明 atan2( y, x ) 返回 y/x ...

  2. sqli-labs less 5-6

    sqli-labs less 5-6 从源代码中可以看到,运行返回结果正确的时候只返回you are in....,不会返回数据库当中的信息了,以前的union联合查询就不能用了,开始尝试盲注. 简单 ...

  3. Linux下IP SAN共享存储操作记录

    一.简单介绍SAN,即存储区域网络(storage area network and SAN protocols),它是一种高速网络实现计算机与存储系统之间的数据传输.常见的分类是FC-SAN和IP- ...

  4. Docker容器学习梳理 - 容器间网络通信设置(Pipework和Open vSwitch)

    自从Docker容器出现以来,容器的网络通信就一直是被关注的焦点,也是生产环境的迫切需求.容器的网络通信又可以分为两大方面:单主机容器上的相互通信,和跨主机的容器相互通信.下面将分别针对这两方面,对容 ...

  5. restfull环境搭建-helloword(三)

    原文地址:http://only81.iteye.com/blog/1689537 This section creates a CRUD (Create, Read, Update, Delete) ...

  6. vue-cli中的check-versions.js配置文件包括semver,chalk,shell插件的解释

    本文介绍vue-cli脚手架build目录中check-versions.js的配置 本文件是用来检测node和npm版本的 直接上代码加注释 // 下面的插件是chalk插件,他的作用是在控制台中输 ...

  7. Python-str-操作-6

    #字符串的索引与切片 s = 'ABCDLSESRF' #索引 s1 = s[0] print(s1) s2 = s[2] print(s2) s3 = s[-1] print(s3) s4 = s[ ...

  8. react/React Native 在 import 导入时,有的带花括号{},有的不带原理解析

    在使用import引用模块时,如何正确使用{} 例如:有两个文件,home.js.user.js 一:不使用{}: 当需要在home.js中引入user.js的时候 //home.js 文件中impo ...

  9. JavaScript术语:shim 和 polyfill

    转自:https://www.html.cn/archives/8339 在学习和使用 JavaScript 的时候,我们会经常碰到两个术语:shim 和 polyfill.它们有许多定义和解释,意思 ...

  10. 作业20171102 beta1 成绩

    申诉 对成绩有疑问或不同意见的同学,请在群里[@杨贵福]. 申诉时间截止2017年12月12日 17:00. 成绩 scrum01 scrum02 scrum03 scrum04 scrum05 sc ...