图论:有源汇有上下界最小流
这次就是最小流了
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
图论:有源汇有上下界最小流相关推荐
- LOJ - #117. 有源汇有上下界最小流(有源汇有上下界的最小流)
题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的有向图,每条边都有一个流量限制 [ lower , upper ],给定源点 s 和汇点 t ,求出源点到汇点的最小流 题目分析:参考我的 ...
- 有源汇有上下界最大流/最小流 配题(HDU 3157)
因为是有源汇所以设源点为 s,汇点为 t. 有源汇有上下界最大流: 连接一条 t 指向 s 的边,容量为 INF. 通过上述步骤,现在图变成了无源汇网络. 引入超级源点 S,超级汇点 T. 连接一条 ...
- LOJ - #116. 有源汇有上下界最大流(有源汇有上下界的最大流)
题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的有向图,每条边都有一个流量限制 [ lower , upper ],给定源点 s 和汇点 t ,求出源点到汇点的最大流 题目分析:参考博客 ...
- Loj#116-[模板]有源汇有上下界最大流
正题 题目链接:https://loj.ac/p/116 题目大意 nnn个点mmm条边的一张图,每条边有流量上下限制,求源点到汇点的最大流. 解题思路 先别急着求上面那个,考虑一下怎么求无源点汇点的 ...
- LOJ116 有源汇有上下界最大流(上下界网络流)
考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流.此时该inf边的流量即为原图中该可行流的流量.因为可以假装把加上去的那些边的流量放回原图. 此时再从原来的源向原来的 ...
- [bzoj3698]XWW的难题 有源汇的上下界最大流
3698: XWW的难题 Time Limit: 10 Sec Memory Limit: 128 MB [Submit][Status][Discuss] Description XWW是个影响力 ...
- 有汇源上下界最大流和最小流
有汇源上下界最大流 有源汇上下界最大流最小流理解 题目 理解 #include<bits/stdc++.h> using namespace std; const int N=610,M= ...
- HDU 3157 Crazy Circuits(有源汇上下界最小流)
HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...
- CodeForces - 1252L Road Construction(基环树+有源汇有上下界的最大流)
题目链接:点击查看 题目大意:给出 n 个节点,再给出 n 个出边,保证所有的边能将 n 个点连通,每条出边可以用 m[ i ] 种材料选择其一建造,然后有 k 个工人,每个工人只可以使用一种材料建造 ...
最新文章
- 最小二乘法多元线性回归_回归系列(二)| 最小二乘法真有那么复杂吗?
- 基于visual Studio2013解决C语言竞赛题之1027 YN
- C++之TR1::function
- C# 之 HttpResponse 类
- js执行环境作用域和闭包_JavaScript中执行上下文,提升,作用域和闭包的终极指南
- 玩转Python大数据分析 《Python for Data Analysis》的读书笔记-第08页
- [zt]扫盲,什么叫MAD(a11s)
- 全国各省二氧化碳排放量统计数据(1995-2016年)
- 【Java基础】ArraylistLinkedList机制,failfastfailsafe
- KIS专业版-即时库存查询自定义开发
- Flash闪存的有关术语
- 如何在shell中实现 backspace
- 如何做好自媒体矩阵,0成本获取流量必备
- 做前端的:你有没有觉得很吃力?
- spark专业术语解释
- JavaSE_第4章 数组
- 什么是video codec? video codec在实际业务的应用。
- Java基础学习之Servlet 运用学习
- 《新文学》风吹过,雨无痕
- 军衔系统与服务器人数,经验越打越少?CSGO个人资料军衔(等级)介绍
热门文章
- cif t t操作流程图_Danish:STATA 操作正态检验、卡方检验和T检验
- 这台计算机没有连接到网络怎么办,如果计算机连接到路由器并且没有互联网,该怎么办...
- wxpython菜单的位置_wx.grid 怎么加菜单呀!
- 数据挖掘实践(金融风控)——task3:特征工程
- 模型堆叠(Stacking)和模型融合的原理与实现以及一个库heamy的介绍
- android peopleactivity.java,Android面试基础篇---Activity(上)
- python代码读取外部变量_在Python中从外部文件中写入和读取特定的变量
- 信息熵,条件熵,相对熵,交叉熵
- 联合索引会创建几个索引_【1033期】分别谈谈联合索引生效和失效的条件
- c++ 拷贝构造函数 讲解