LOJ116 有源汇有上下界最大流(上下界网络流)
考虑有源汇上下界可行流:由汇向源连inf边,那么变成无源汇图,按上题做法跑出可行流。此时该inf边的流量即为原图中该可行流的流量。因为可以假装把加上去的那些边的流量放回原图。
此时再从原来的源向原来的汇跑最大流。超源超汇相关的边已经流满不会再退流,则下界可以满足,并且在此基础上增广是可以保证原图的流量平衡的。求出的最大流即为原图最大流。因为显然原图最大流=可行流流量+原图新增流量,而可行流流量等于汇到源流量,这部分在跑最大流的时候被退流并计入答案。
#include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; int read() {int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f; } #define N 210 #define M 50000 #define S 0 #define T 201 #define inf 1000000000 int n,m,w,v,t=-1,p[N],degree[N],l[M],tot=0; int cur[N],d[N],q[N],ans=0; struct data{int to,nxt,cap,flow; }edge[M]; void addedge(int x,int y,int z) {t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=0,p[x]=t;t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=0,edge[t].flow=0,p[y]=t; } bool bfs(int s,int t) {memset(d,255,sizeof(d));d[s]=0;int head=0,tail=1;q[1]=s;do{int x=q[++head];for (int i=p[x];~i;i=edge[i].nxt)if (d[edge[i].to]==-1&&edge[i].flow<edge[i].cap){d[edge[i].to]=d[x]+1;q[++tail]=edge[i].to;}}while (head<tail);return ~d[t]; } int work(int k,int f,int t) {if (k==t) return f;int used=0;for (int i=cur[k];~i;i=edge[i].nxt)if (d[k]+1==d[edge[i].to]){int w=work(edge[i].to,min(f-used,edge[i].cap-edge[i].flow),t);edge[i].flow+=w,edge[i^1].flow-=w;if (edge[i].flow<edge[i].cap) cur[k]=i;used+=w;if (used==f) return f;}if (used==0) d[k]=-1;return used; } void dinic(int s,int t) {while (bfs(s,t)){memcpy(cur,p,sizeof(p));ans+=work(s,inf,t);} } int main() { #ifndef ONLINE_JUDGEfreopen("loj116.in","r",stdin);freopen("loj116.out","w",stdout);const char LL[]="%I64d"; #elseconst char LL[]="%lld"; #endifn=read(),m=read(),w=read(),v=read();memset(p,255,sizeof(p));for (int i=1;i<=m;i++){int x=read(),y=read(),low=read(),high=read();addedge(x,y,high-low);degree[y]+=low,degree[x]-=low;l[i]=low;}for (int i=1;i<=n;i++)if (degree[i]>0) addedge(S,i,degree[i]),tot+=degree[i];else if (degree[i]<0) addedge(i,T,-degree[i]);addedge(v,w,inf);dinic(S,T);if (ans<tot) cout<<"please go home to sleep";else ans=0,dinic(w,v),cout<<ans;return 0; }
转载于:https://www.cnblogs.com/Gloid/p/9420520.html
LOJ116 有源汇有上下界最大流(上下界网络流)相关推荐
- Shoot the Bullet(ZOJ3229)(有源汇上下界最大流)
描述 ensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utop ...
- 有源汇上下界最小费用可行流 ---- P4553 80人环游世界(拆点 + 有源汇上下界最小费用可行流)
题目链接 题目大意: 解题思路: 又是一道裸题 . 首先它要求第iii个点只经过ViViVi那么我们就拆点ai,ai+na_i,a_{i+n}ai,ai+n一个点为入点,一个为出点这条边的流量范围 ...
- 有源汇上下界最小费用可行流 ---- P4043 [AHOI2014/JSOI2014]支线剧情(模板)
题目链接 题目大意: 解题思路: 有源汇上下界最小费用可行流模板题目来着 先建出一个有源汇上下界可行流的图,然后注意建图的时候要把每条边的下界的费用提前加到ans里面 然后再对图跑费用流,就是补齐费用 ...
- HDU 3157 Crazy Circuits(有源汇上下界最小流)
HDU 3157 Crazy Circuits 题目链接 题意:一个电路板,上面有N个接线柱(标号1~N),还有两个电源接线柱 + -.给出一些线路,每一个线路有一个下限值求一个能够让全部部件正常工作 ...
- CodeForces - 1252L Road Construction(基环树+有源汇有上下界的最大流)
题目链接:点击查看 题目大意:给出 n 个节点,再给出 n 个出边,保证所有的边能将 n 个点连通,每条出边可以用 m[ i ] 种材料选择其一建造,然后有 k 个工人,每个工人只可以使用一种材料建造 ...
- 洛谷 - P5192 Zoj3229 Shoot the Bullet|东方文花帖|【模板】有源汇上下界最大流(有源汇有上下界的最大流)
题目链接:点击查看 题目大意:一共有 n 天,每天可以拍最多 D[ i ] 张照片,每天可以选择 C[ i ] 个少女进行拍照,每个少女的编号为 T[ i ][ j ] ,每个少女需要拍摄照片的区间为 ...
- LOJ - #116. 有源汇有上下界最大流(有源汇有上下界的最大流)
题目链接:点击查看 题目大意:给出一个 n 个点和 m 条边的有向图,每条边都有一个流量限制 [ lower , upper ],给定源点 s 和汇点 t ,求出源点到汇点的最大流 题目分析:参考博客 ...
- 上下界网络流-无源汇可行流与有源汇最大流
上下界网络流 2021.9.3 无源汇上下界可行流 之前的最大流讨论一般为有源无下届情况,那么无源汇有上下界可行流应如何求解? 首先要做的是消除下边界,应如何做?在有下届情形下,流网络中的任意一条边的 ...
- BZOJ.3698.XWW的难题(有源汇上下界最大流ISAP)
题目链接 按套路行列作为两部分,连边 \(S->row->column->T\). S向代表行的元素连边cap(A[i][n])(容量上下界为上下取整),代表列的元素向T连边cap( ...
最新文章
- 程序员的浪漫,你值得拥有!
- 类型参数的约束(C# 编程指南)
- Windows Server 2008常见的安全设置
- leetcode算法题--二叉树中的伪回文路径
- 高德地图和百度地图接口封装遇到的问题(一):重复添加实时路况图层后无法移除
- Three.js中显示坐标轴、平面、球体、四方体
- Elasticsearch学习笔记1
- snmp自动化安装脚本
- Docker搭建便捷的开发者环境
- 如何看待不会写代码的架构师?
- 一年Android工作经验,一举拿下百度、网易、美团、小米、快手等Offer面经
- python模块之subprocess
- 小米手机android9换字体,教你免费修改小米手机字体
- 腾讯电脑管家卸载后的残留信息有哪些
- 旧手机别扔,手把手教你DIY一台Linux服务器
- DELL服务器硬件报错及对应的解决方法(R710)
- SpringBoot项目使用RestTemplate发送请求踩坑记录
- 我优化了李笑来的MarkdownHere,附css样式代码,文章排版再也不用愁了
- 转-基于OpenGL的3D天空仿真
- 阿里云OCR本地图片文字识别
热门文章
- 微信 python 2020_2020年最新的Python操控微信教程
- minio 并发数_c#(asp.net)线程配置总结
- css类选择器或逻辑,深入理解CSS中选择器的逻辑处理
- php树莓派魔镜,用树莓派和显示器制作一面“魔镜”
- python打开浏览器后带cookie_Python爬虫使用浏览器的cookies:browsercookie
- openMVG跑自定义数据出错
- 基于tcp connect的端口扫描程序
- mysql启动时报错:Starting MySQL ERROR The server quit without updating PID file
- 面向对象 抽象(abstract)
- java的或等于_Java中的“小于或等于”比较运算符是__________: !=|||=|=