这次就是最小流了

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 typedef long long ll;
  4 const ll INF=0x3f3f3f3f3f3f3f3f;
  5 const int N=50200;
  6
  7 struct node{
  8     ll t,cap,flow,next;    //cap容量,flow流量
  9 }e[N*12];
 10 int head[N],vis[N],cnt;
 11 void add(int u,int v,ll cap)   //u->v容量为cap
 12 {
 13     e[cnt]=node{v,cap,0,head[u]};
 14     head[u]=cnt++;
 15     e[cnt]=node{u,0,0,head[v]};   //容量为0的反向边
 16     head[v]=cnt++;
 17 }
 18 int d[N];    //bfs深度
 19 bool bfs(int s,int t)   //O(n+m)
 20 {
 21     memset(d,0,sizeof(d));
 22     queue<int>q;
 23     q.push(s);
 24     d[s]=1;
 25     while(!q.empty())
 26     {
 27         int u=q.front();q.pop();
 28         for(int i=head[u];~i;i=e[i].next)
 29         {
 30             int v=e[i].t;
 31             if(d[v]==0&&e[i].cap-e[i].flow>0)
 32             {
 33                 d[v]=d[u]+1;
 34                 q.push(v);
 35             }
 36         }
 37     }
 38     return d[t]>0;     //存在增广路
 39 }
 40 ll dfs(int s,int t,ll minedge)
 41 {
 42     if(s==t)return minedge;
 43     ll flow=0;    //从当前s点流出的流量
 44     for(int &i=vis[s];~i;i=e[i].next)
 45     {
 46         int v=e[i].t;
 47         if(d[v]==d[s]+1&&e[i].cap-e[i].flow>0)   //层次关系&&有剩余流量
 48         {
 49             ll temp=dfs(v,t,min(minedge-flow,e[i].cap-e[i].flow));
 50             e[i].flow+=temp;    //流量增加
 51             e[i^1].flow-=temp;    //反向边流量减少
 52             flow+=temp;    //flow已分配的流量
 53             if(flow==minedge)return flow;  //已达到祖先的最大流,无法再大,剪枝
 54         }
 55     }
 56     if(flow==0)d[s]=0;   //此点已无流,标记掉
 57     return flow;
 58 }
 59 ll dinic(int s,int t)   //一定要建立反向边cap=0
 60 {
 61     ll maxflow=0;
 62     while(bfs(s,t))   //有增广路
 63     {
 64         memcpy(vis,head,sizeof(head));
 65         maxflow+=dfs(s,t,INF);
 66     }
 67     return maxflow;
 68 }
 69
 70
 71 ll bout[N],low[N*10];
 72 int main()
 73 {
 74     int n,m,s,t,u,v;
 75     ll b,c;
 76     while(cin>>n>>m>>s>>t)
 77     {
 78         memset(head,-1,sizeof(head));
 79         cnt=0;
 80         memset(bout,0,sizeof(bout));
 81         for(int i=0;i<m;i++)
 82         {
 83             scanf("%d%d%lld%lld",&u,&v,&b,&c);
 84             add(u,v,c-b);
 85             bout[u]+=b;
 86             bout[v]-=b;
 87             low[i]=b;
 88         }
 89         int ss=n+1,tt=n+2;
 90         ll sum=0;
 91         for(int i=1;i<=n;i++){
 92             if(bout[i]>0)sum+=bout[i],add(i,tt,bout[i]);
 93             if(bout[i]<0)add(ss,i,-bout[i]);
 94         }
 95         ll res=dinic(ss,tt);
 96         add(t,s,INF);
 97         res+=dinic(ss,tt);
 98         if(sum==res)
 99         {
100             printf("%lld\n",e[cnt-2].flow);
101         }
102         else printf("please go home to sleep\n");
103     }
104 }

转载于:https://www.cnblogs.com/aininot260/p/9623869.html

图论:有源汇有上下界最小流相关推荐

  1. LOJ - #117. 有源汇有上下界最小流(有源汇有上下界的最小流)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的有向图,每条边都有一个流量限制 [ lower , upper ],给定源点 s 和汇点 t ,求出源点到汇点的最小流 题目分析:参考我的 ...

  2. 有源汇有上下界最大流/最小流 配题(HDU 3157)

    因为是有源汇所以设源点为 s,汇点为 t. 有源汇有上下界最大流: 连接一条 t 指向 s 的边,容量为 INF. 通过上述步骤,现在图变成了无源汇网络. 引入超级源点 S,超级汇点 T. 连接一条 ...

  3. LOJ - #116. 有源汇有上下界最大流(有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的有向图,每条边都有一个流量限制 [ lower , upper ],给定源点 s 和汇点 t ,求出源点到汇点的最大流 题目分析:参考博客 ...

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

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

  5. LOJ116 有源汇有上下界最大流(上下界网络流)

    考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...

  6. [bzoj3698]XWW的难题 有源汇的上下界最大流

    3698: XWW的难题 Time Limit: 10 Sec  Memory Limit: 128 MB [Submit][Status][Discuss] Description XWW是个影响力 ...

  7. 有汇源上下界最大流和最小流

    有汇源上下界最大流 有源汇上下界最大流最小流理解 题目 理解 #include<bits/stdc++.h> using namespace std; const int N=610,M= ...

  8. HDU 3157 Crazy Circuits(有源汇上下界最小流)

    HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...

  9. CodeForces - 1252L Road Construction(基环树+有源汇有上下界的最大流)

    题目链接:点击查看 题目大意:给出 n 个节点,再给出 n 个出边,保证所有的边能将 n 个点连通,每条出边可以用 m[ i ] 种材料选择其一建造,然后有 k 个工人,每个工人只可以使用一种材料建造 ...

最新文章

  1. 最小二乘法多元线性回归_回归系列(二)| 最小二乘法真有那么复杂吗?
  2. 基于visual Studio2013解决C语言竞赛题之1027 YN
  3. C++之TR1::function
  4. C# 之 HttpResponse 类
  5. js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南
  6. 玩转Python大数据分析 《Python for Data Analysis》的读书笔记-第08页
  7. [zt]扫盲,什么叫MAD(a11s)
  8. 全国各省二氧化碳排放量统计数据(1995-2016年)
  9. 【Java基础】ArraylistLinkedList机制,failfastfailsafe
  10. KIS专业版-即时库存查询自定义开发
  11. Flash闪存的有关术语
  12. 如何在shell中实现 backspace
  13. 如何做好自媒体矩阵,0成本获取流量必备
  14. 做前端的:你有没有觉得很吃力?
  15. spark专业术语解释
  16. JavaSE_第4章 数组
  17. 什么是video codec? video codec在实际业务的应用。
  18. Java基础学习之Servlet 运用学习
  19. 《新文学》风吹过,雨无痕
  20. 军衔系统与服务器人数,经验越打越少?CSGO个人资料军衔(等级)介绍

热门文章

  1. cif t t操作流程图_Danish:STATA 操作正态检验、卡方检验和T检验
  2. 这台计算机没有连接到网络怎么办,如果计算机连接到路由器并且没有互联网,该怎么办...
  3. wxpython菜单的位置_wx.grid 怎么加菜单呀!
  4. 数据挖掘实践(金融风控)——task3:特征工程
  5. 模型堆叠(Stacking)和模型融合的原理与实现以及一个库heamy的介绍
  6. android peopleactivity.java,Android面试基础篇---Activity(上)
  7. python代码读取外部变量_在Python中从外部文件中写入和读取特定的变量
  8. 信息熵,条件熵,相对熵,交叉熵
  9. 联合索引会创建几个索引_【1033期】分别谈谈联合索引生效和失效的条件
  10. c++ 拷贝构造函数 讲解