正题

题目链接:https://loj.ac/p/116


题目大意

\(n\)个点\(m\)条边的一张图,每条边有流量上下限制,求源点到汇点的最大流。


解题思路

先别急着求上面那个,考虑一下怎么求无源点汇点的上下界可行流。

可以考虑先把下限流满,这样就会出现有的点流量不均衡的问题,考虑每个点除了下限以外还有附加流量,这些附加流量会最多占能每条边\(r-l\)这么多的流量,可以先建立一张每条流量都是\(r-l\)的图。

定义一个点的\(d_i\)为该点的入度减去出度(流入的流量减去流出的流量),然后对于一个点如果它的\(d_i\)大于\(0\),那么它需要向其他点补充流量,建立一个超级源点\(S\)向它连边,流量为\(d_i\)。同理如果一个点的\(d_i\)小于\(0\)就连向超级汇点\(T\)。

这样就搞定了无源点汇点的上下界可行流问题了。

然后考虑有源汇点\(s,t\)怎么办,那么也就是\(t\)可以无限接受,\(s\)可以无限输送。那么如果\(t\)向\(s\)连一条\(inf\)的边,那么就可以保证\(s,t\)的功能又能保证流量守恒了。

之后直接和无源点汇点的一样做就好了。

然后要求最大流,先跑一次有没有可行的再考虑流量能够浮动的范围,此时我们需要在刚刚的残量网络上找从\(s\)到\(t\)的增广路来增大\(s\)到\(t\)的流量,那么删掉刚刚\(t->s\)的边然后跑\(s->t\)的最大流就好了。

最小流的话就是从\(t->s\)跑最大流


code

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<queue>
  5. using namespace std;
  6. const int N=210,inf=1e9;
  7. struct node{
  8. int to,next,w;
  9. }a[41000];
  10. int n,m,tot,in[N],out[N],d[N];
  11. int ls[N],cur[N],dep[N];
  12. queue<int> q;
  13. void addl(int x,int y,int w){
  14. a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;
  15. a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
  16. return;
  17. }
  18. bool bfs(int s,int t){
  19. while(!q.empty())q.pop();q.push(s);
  20. memset(dep,0,sizeof(dep));dep[s]=1;
  21. for(int i=1;i<=t;i++)cur[i]=ls[i];
  22. while(!q.empty()){
  23. int x=q.front();q.pop();
  24. for(int i=ls[x];i;i=a[i].next){
  25. int y=a[i].to;
  26. if(dep[y]||!a[i].w)continue;
  27. q.push(y);dep[y]=dep[x]+1;
  28. if(y==t)return 1;
  29. }
  30. }
  31. return 0;
  32. }
  33. int dinic(int x,int flow,int t){
  34. if(x==t)return flow;
  35. int rest=0,k;
  36. for(int &i=cur[x];i;i=a[i].next){
  37. int y=a[i].to;
  38. if(dep[x]+1!=dep[y]||!a[i].w)continue;
  39. rest+=(k=dinic(y,min(flow-rest,a[i].w),t));
  40. a[i].w-=k;a[i^1].w+=k;
  41. if(rest==flow)return rest;
  42. }
  43. if(!rest)dep[x]=0;
  44. return rest;
  45. }
  46. int main()
  47. {
  48. int ans=0,sum=0,s,t,S,T;
  49. scanf("%d%d%d%d",&n,&m,&S,&T);
  50. s=n+1;t=s+1;tot=1;
  51. for(int i=1;i<=m;i++){
  52. int x,y,l,u;
  53. scanf("%d%d%d%d",&x,&y,&l,&u);
  54. addl(x,y,u-l);d[y]+=l;d[x]-=l;
  55. }
  56. for(int i=1;i<=n;i++)
  57. if(d[i]>0)addl(s,i,d[i]),sum+=d[i];
  58. else addl(i,t,-d[i]);
  59. addl(T,S,inf);
  60. while(bfs(s,t))
  61. ans+=dinic(s,inf,t);
  62. if(ans!=sum)
  63. return puts("please go home to sleep");
  64. ans=a[tot].w;a[tot].w=a[tot^1].w=0;
  65. while(bfs(S,T))
  66. ans+=dinic(S,inf,T);
  67. printf("%d\n",ans);
  68. }

Loj#116-[模板]有源汇有上下界最大流的更多相关文章

  1. LOJ.116.[模板]有源汇有上下界最大流(Dinic)

    题目链接 http://blog.csdn.net/just_sort/article/details/75448403 有源汇有上下界网络流 通过添加一条(T->S,[0,INF])的边变成无 ...

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

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

  3. LOJ.115.[模板]无源汇有上下界可行流(Dinic)

    题目链接 参考:http://blog.csdn.net/clove_unique/article/details/54884437 http://blog.csdn.net/wu_tongtong/ ...

  4. loj #116. 有源汇有上下界最大流

    题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...

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

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

  6. 【模板】有源汇有上下界最大流(网络流)/ZOJ3229

    先导知识 无源汇有上下界可行流 题目链接 https://vjudge.net/problem/ZOJ-3229 https://www.luogu.com.cn/problem/P5192 (有改动 ...

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

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

  8. 【LOJ116】有源汇有上下界最大流(模板题)

    点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ...

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

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

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

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

随机推荐

  1. C# volatile 的使用

    class Program { private static volatile bool bChanged; static void Main(string[] args) { Thread t1 = ...

  2. 【java虚拟机】jvm调优原则

    转自:https://www.cnblogs.com/xiaopaipai/p/10522794.html 合理规划jvm性能调优 JVM性能调优涉及到方方面面的取舍,往往是牵一发而动全身,需要全盘考 ...

  3. javacc在stanfordnlp中的应用

    总结: 这个javacc感觉比较复杂,在于stanfordnlp中 p.p1 { margin: 0; font: 11px Monaco } CoreMapExpressionExtractor这个 ...

  4. Verilog实例数组

    编写 Verilog 代码多年,至今才无意中发现了一种奇怪的语法,估计见过的这种的写法的人,在 FPGA 开发者中不会超过 20% 吧. 直接来看代码吧.先定义了一个简单的模块,名为 mod. mod ...

  5. 了解Prometheus

    了解Prometheus 标签(空格分隔): 监控 介绍 Prometheus是用来收集和存储服务器的实时数据(比如:CPU.硬盘.服务响应.日志等),通过其丰富的运算函数,可以计算得到很多的服务性能 ...

  6. T-SQL - query01_创建数据库|创建表|添加数据|简单查询

    时间:2017-09-29  整理:byzqy 本篇以"梁山好汉花名册"为例,记录MS SQLServer T-SQL语句的使用,包含命令: 创建数据库 | 删除数据库 创建表 | ...

  7. vscode 1.32.x按下鼠标左键无法拖曳选择,而旧一点的版本1.30.2可以

    最近升级vscode后,无法通过鼠标左键选择文本,恢复到旧版本1.30.2就可以了. 另外:1.32.x和1.31.1都不正常 进一步测试发现:在中文输入法下(无论中英输入模式),都有问题:切换到纯英 ...

  8. Linux 单实例oracle安装步骤

    一.查看逻辑盘大小,执行 lsblk 二.查看硬盘及分区信息 ,执行 fdisk -l 三.将物理硬盘分区初始化为物理卷,以便LVM使用 ,创建pv pvcreate /dev/sdb 四.查看物理卷 ...

  9. MySQL双主+Keepalived高可用

    原文转自:https://www.cnblogs.com/itzgr/p/10233932.html作者:木二 目录 一 基础环境 二 实际部署 2.1 安装MySQL 2.2 初始化MySQL 2. ...

  10. Python3-sqlalchemy-orm

    1 #-*-coding:utf-8-*- 2 #__author__ = "logan.xu" 3 4 5 import sqlalchemy 6 from sqlalchemy ...