有源汇有上下界最大流 (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 (有改动 ...
随机推荐
- 关闭visual studio code 智能提示功能
对于程序初学者来说,应该少用IDE的提示功能,因为这样有助于记住一些常用的函数等功能.这也是为什么戏称喜欢用notepad++(windows)或者vim编辑器(Linux)来开发代码是大神的原因,而 ...
- MySQL的去重+列的表达式
MySQL的去重+列的表达式 1. 去重 作用:去除SELECT查询出来的结果中重复的数据,重复的数据只显示一条. SELECT * FROM `repeat_num` ...
- APP和web设计区别
1.web在给定了核心功能后,还可以往页面再添加小需求如banner.快捷工具条.分页等. APP界面设计时,则偏向精简,尽可能明显的展示核心功能. 2.APP中需要考虑ISO和Andriod两种交互 ...
- Mapped Statements collection does not contain value for xxx
这是我第二次遇到的这个问题了,总结下. 第一次的问题是 mybatis的sqlSessionFactory的mapperLocations,配置的是这个路径下的所有映射文件,但是我没写的没有在该路径下 ...
- 题解【洛谷P1083】[NOIP2012]借教室
题面 二分到哪一个申请人要修改订单,可以差分\(+\)前缀和达到\(\Theta(n)\)的\(\text{check}\). 具体细节见代码. #include <bits/stdc++.h& ...
- 【C语言】求s(n)=a+aa+aaa+...+aa...a的值
原理:比如a=2,s(1)=2,s(2)=2+2*10+2,s(3)=2+2*10+2+(2*10+2)*10+2 ..... 规律: item=item*10+a sum=sum+item 代码 ...
- 微信小程序weui的使用
大家好,我是前端菜鸟,大家可以叫我惊蛰,今天给大家分享一下在微信小程序中对weui的引入和使用,其他的也不再赘述,文中有不对的还请指正,谢谢. 直入主题: 1.下载weui 进入GitHub http ...
- 左边div固定宽度,右边div自适应撑满剩下的宽度--实现方法汇总
神奇的事 其实有的方法(float.position.margin.flex)是有border像素的差 代码如下: <!DOCTYPE html><html><head ...
- HCTF2018-admin[条件竞争]
附上网上师傅的wp 学习链接: https://www.jianshu.com/p/f92311564ad0 按照师傅的wp复现一下: 源代码审计,去看路由里的login函数和change函数都在没 ...
- macOS系统下安装ChromeDriver
1.对应的chrome浏览器需要安装对应的驱动,对应列表如下: chromedriver版本 支持的chrome版本 v2.43 v69-71 v2.42 v68-70 v2.41 v ...