传送门

这题真有意思。。。

先是有一个点T的我怀疑人生。

然后学大佬们封装了我的dinic就莫名其妙的过了???

所以说锅给谁好呢?

给dinic吧。。。

解法就是先求出一段可行流,然后从t到s加一条容量为inf的边将能缩回去的都缩回去。

代码:

  1. #include<bits/stdc++.h>
  2. #define ll long long
  3. #define inf 0x3f3f3f3f
  4. #define N 100005
  5. #define M 2000010
  6. using namespace std;
  7. #define rep(i,st,ed) for(register int i=st,i##end=ed;i<=i##end;++i)
  8. #define drep(i,st,ed) for(register int i=st,i##end=ed;i>=i##end;--i)
  9. inline int read(){
  10. int ans=0;
  11. char ch=getchar();
  12. while(!isdigit(ch))ch=getchar();
  13. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  14. return ans;
  15. }
  16. ll ans;
  17. int S,T;
  18. struct Node{int v,next,c;};
  19. struct Max_Flow{
  20. int n,cur[N],first[N],d[N],cnt;
  21. Node e[M];
  22. inline void add_edge(int u,int v,int c){e[++cnt].v=v,e[cnt].next=first[u],e[cnt].c=c,first[u]=cnt;}
  23. inline void add(int u,int v,int c){add_edge(u,v,c),add_edge(v,u,0);}
  24. inline bool bfs(){
  25. rep(i,1,n)d[i]=-1;
  26. queue<int>q;
  27. q.push(S),d[S]=0;
  28. while(!q.empty()){
  29. int x=q.front();
  30. q.pop();
  31. for(int i=first[x];i;i=e[i].next){
  32. int v=e[i].v;
  33. if(e[i].c&&d[v]==-1){
  34. d[v]=d[x]+1;
  35. if(v==T)return true;
  36. q.push(v);
  37. }
  38. }
  39. }
  40. return false;
  41. }
  42. inline int dfs(int x,int f){
  43. if(x==T||!f)return f;
  44. int flow=f,tmp;
  45. for(int &i=cur[x];i;i=e[i].next){
  46. int v=e[i].v;
  47. if(e[i].c&&d[v]==d[x]+1){
  48. tmp=dfs(v,min(e[i].c,flow));
  49. if(!tmp)d[v]=-1;
  50. e[i].c-=tmp,e[i^1].c+=tmp,flow-=tmp;
  51. if(!flow)return f;
  52. }
  53. }
  54. return f-flow;
  55. }
  56. inline void solve(){while(bfs()){rep(i,1,n)cur[i]=first[i];ans+=dfs(S,inf);}}
  57. }Dinic;
  58. int sum[N];
  59. int main(){
  60. Dinic.cnt=1;
  61. int n=read(),m=read(),ss=read(),tt=read();
  62. S=n+1,T=n+2,Dinic.n=T;
  63. rep(i,1,m){
  64. int u=read(),v=read(),down=read(),up=read();
  65. sum[u]-=down,sum[v]+=down,Dinic.add(u,v,up-down);
  66. }
  67. rep(i,1,n){
  68. if(sum[i]>0)Dinic.add(S,i,sum[i]);
  69. if(sum[i]<0)ans+=sum[i],Dinic.add(i,T,-sum[i]);
  70. }
  71. Dinic.solve(),Dinic.add(tt,ss,inf),Dinic.solve();
  72. if(ans){cout<<"please go home to sleep";return 0;}
  73. cout<<Dinic.e[Dinic.cnt].c;
  74. return 0;
  75. }

2018.08.20 loj#117. 有源汇有上下界最小流(模板)的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. sgu 176 Flow construction(有源汇的上下界最小流)

    [题目链接] http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=11025 [模型] 有源汇点的上下界最小流.即既满足上下界又满足 ...

  7. Flow construction SGU - 176 有源汇有上下界最小流 二分法和回流法

    /** 题目:Flow construction SGU - 176 链接:https://vjudge.net/problem/SGU-176 题意: 有源汇有上下界的最小流. 给定n个点,m个管道 ...

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

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

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

    给出每条边的下界 求最小流 板题 提供两个板子代码 虽然这个题 第一个比较快 但在loj上https://loj.ac/problem/117 的板题  第一个1700+ms 第二个才600+ms   ...

随机推荐

  1. spring quartz 任务注入spring service

    SchedulerFactoryBean+AdaptableJobFactory+QuartzJobBean package schedule.quartz5; import org.quartz.S ...

  2. bootstrap 移动自适应界面

    移动设备优先 在 Bootstrap 2 中,我们对框架中的某些关键部分增加了对移动设备友好的样式.而在 Bootstrap 3 中,我们重写了整个框架,使其一开始就是对移动设备友好的.这次不是简单的 ...

  3. 第一模块第一章 review

    ---恢复内容开始--- 练习题: 1.简述编译型与解释型语言的区别,且分别列出你知道的那些属于编译型,哪些属于解释型 机器语言:由于计算机内部只能接受二进制代码,因此,用二进制代码0和1描述的指令称 ...

  4. XSS学习小结

    一.什么是XSS? XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了. 这里我们主要注 ...

  5. nginx的配置文件解析

    worker_processes ;#工作进程的个数,一般与计算机的cpu核数一致 events { worker_connections ;#单个进程最大连接数(最大连接数=连接数*进程数) } h ...

  6. nginx-----惹不起的端口修改

    1,查看端口是否被占用 打开CMD,输入输入netstat -aon | findstr :80 出现: TCP    0.0.0.0:80             0.0.0.0:0        ...

  7. 'Microsoft.VisualStudio.Editor.Implementation.EditorPackage' package did not load correctly

    Visual Studio 2012 Ultimate Removing "C:\Users\UserName\AppData\Local\Microsoft\VisualStudio\11 ...

  8. spring AOP 注解配置

    applicationContext-resource.xml: <?xml version="1.0" encoding="UTF-8"?>< ...

  9. Linux初学时的一些常用命令(3)

    管道 |  重要的一个概念,其作用是将一个命令的输出用作另一个命令的输入 例如:  在ifconfig的结果里查找 192.168字符串  ifconfig | grep 192.168 查找和jav ...

  10. oracle 基本信息

    查看Oracle是32位还是64位的方法: 方法一:使用sqlplus 64位: [oracle@qs-wg-db2 ~]$ sqlplus / as sysdba;   SQL*Plus: Rele ...