有源汇有上下界最大流 (ZQU1591)
题意:现在的网络有一个源点s和汇点t,求出一个流使得源点的总流出量等于汇点的总流入量,其他的点满足流量守恒,而且每条边的流量满足上界和下界限制.
思路:要满足每一个点的流量守恒,我们可以尝试像无源汇上下界可行流一样,跑一次dinic先构造出这样一个的可行流。在保证他可行的情况下,利用残余流量
从s到t再跑一次dinic即可; 这个时候跑的dinic 在上一次跑的时候,从t到s就有了一定的流量,所以他的反向边,也就是s到t在跑第二次dinic的时候,就已经保存了
上一次跑dinic的值,所以这一次跑,会将剩下的参与流量尽可能的流向t 来求出最大流。
那为什么这样子可行呢?
我们在第一次跑的时候,就已经保证了从超级源点到超级汇点的值(也就是S,T)是不变的了;
也就是在保证可行流的情况下,再进行操作,保证最大而已。
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<math.h>
#include<queue>
using namespace std;
const int maxn=;
const int inf=0x3f3f3f3f;
int head[maxn],level[maxn]; //前者为邻接表必要数据,后者为dinic的层 数据
int limit[maxn]; //limit为该点的流量 小于0的时候是流出多
int num; //邻接表
int cur[maxn];
void init()
{
num=- ;
memset(head,-,sizeof(head));
}
struct node
{
int v,w,next;
}G[];
int bfs(int s,int t)
{
queue<int>q;
q.push(s);
memset(level,-,sizeof(level));
level[s]=;
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=head[u];i!=-;i=G[i].next){
int v=G[i].v;
if(G[i].w>&&level[v]==-){
level[v]=level[u]+;
q.push(v);
}
}
}
return level[t];
}
int dfs(int s,int t,int f)
{
if(s==t) return f;
int ans=;
for(int i=cur[s];i!=-;i=G[i].next){
cur[s]=i; //当前弧优化;
int v=G[i].v;
if(G[i].w>&&level[s]+==level[v]){
int d=dfs(v,t,min(G[i].w,f-ans));
if(d>){
G[i].w-=d;
G[i^].w+=d;
ans+=d;
if(ans==f) return ans;
}
}
}
if(ans==) level[s]=;
return ans;
}
int dinic(int s,int t)
{
int ans=;
while(){
int temp=bfs(s,t);
if(temp==-) break;
memcpy(cur,head,sizeof(cur));
ans+=dfs(s,t,inf);
}
return ans;
}
void build(int u,int v,int w)
{
num++;
G[num].v=v;
G[num].w=w;
G[num].next=head[u];
head[u]=num; num++;
G[num].v=u;
G[num].w=;
G[num].next=head[v];
head[v]=num;
}
int main()
{
init();
int n,m,s,t;
scanf("%d%d%d%d",&n,&m,&s,&t);
for(int i=;i<=m;i++){
int u,v,w1,w2;
scanf("%d%d%d%d",&u,&v,&w1,&w2);
limit[u]-=w1;
limit[v]+=w1;
build(u,v,w2-w1);
}
build(t,s,inf);
//其实这里应该有上面的limit的变化 只是因为这里的w1为0,所以省略不写。
int S=;int T=n+;
int sum=;
for(int i=;i<=n;i++){
if(limit[i]<) build(i,T,-limit[i]);
if(limit[i]>) build(S,i,limit[i]),sum+=limit[i];
}
if(dinic(S,T)!=sum) printf("please go home to sleep\n");
else printf("%d\n",dinic(s,t));
return ;
}
有源汇有上下界最大流 (ZQU1591)的更多相关文章
- LOJ116 - 有源汇有上下界最大流
原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...
- 【Loj116】有源汇有上下界最大流(网络流)
[Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...
- loj #116. 有源汇有上下界最大流
题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- [poj] 2396 [zoj] 1994 budget || 有源汇的上下界可行流
poj原题 zoj原题 //注意zoj最后一行不要多输出空行 现在要针对多赛区竞赛制定一个预算,该预算是一个行代表不同种类支出.列代表不同赛区支出的矩阵.组委会曾经开会讨论过各类支出的总和,以及各赛区 ...
- 【LOJ116】有源汇有上下界最大流(模板题)
点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ...
- LibreOJ #116. 有源汇有上下界最大流
二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...
- Shoot the Bullet(有源汇带上下界最大流)
有源汇带上下界最大流 在原图基础上连一条汇点到源点流量为inf的边,将有源汇网络流转化为无源汇网络流用相同方法判断是否满流,如果满流再跑一边源点到汇点的最大流就是答案 例题:Shoot the Bul ...
- 【模板】有源汇有上下界最大流(网络流)/ZOJ3229
先导知识 无源汇有上下界可行流 题目链接 https://vjudge.net/problem/ZOJ-3229 https://www.luogu.com.cn/problem/P5192 (有改动 ...
随机推荐
- pandas 读取excel时,遇到数字变为科学计数法了, 怎么破?? 别慌 这样来处理
# 指定字段以string 方式读取 df = pd.read_excel("./test.xlsx", converters={"id": str})
- numpy学习(四)
练习篇(Part 4) 41. How to sum a small array faster than np.sum? (★★☆) arr = np.arange(10) print(np.add. ...
- Linux常用命令: zip、unzip 压缩和解压缩命令
zip基本用法是: zip [参数] [打包后的文件名] [打包的目录路径] 常用参数: -a 将文件转成ASCII模式 -F 尝试修复损坏的压缩文件 -h 显示帮助界面 -m 将文件压缩之后,删除源 ...
- 最长公共子串2(LCS2) lg SP1812
题意:n个字符串(n<=10)求最长公共子串的长度 前置技能点:https://www.cnblogs.com/wenci/p/10432932.html (两个字符串求最长公共子串的长度) 既 ...
- navicat连接mysql8.0+版本报错2059
ERROR 2059 : Authentication plugin 'caching_sha2_password' cannot be loaded 问题: 连接Docker启动的mysql出现:E ...
- MySQL 分组并多行拼接 group_concat 用法
数据源 user name age 小红 18 小明 18 小芳 19 ------------------------------------------------------------ ...
- 出现“无法在发送 HTTP 标头之后进行重定向”问题
如题,在Response.Redirect之后会偶尔出现“无法在发送HTTP标头之后进行重定向”问题. 是因为,已经在出现错误的代码之前进行过一次重定向了.仔细检查代码即可. 解决方法:按照逻辑移除多 ...
- centos7中 yum的安装
自己误将yum卸载, 在重装时由于依赖问题一直报错: error: Failed dependencies: /usr/bin/python is needed by yum-3.4.3-16 ...
- yolov3 讲解
参考博客:https://blog.csdn.net/litt1e/article/details/88907542
- 通过css修改input的边框
input{ border:1px solid #d2d2d2; background-color:transparent; } 可以看到主要是把背景色调成透明的颜色,从而来进行边框的设置