Loj#116-[模板]有源汇有上下界最大流
正题
题目链接:https://loj.ac/p/116
题目大意
\(n\)个点\(m\)条边的一张图,每条边有流量上下限制,求源点到汇点的最大流。
解题思路
先别急着求上面那个,考虑一下怎么求无源点汇点的上下界可行流。
可以考虑先把下限流满,这样就会出现有的点流量不均衡的问题,考虑每个点除了下限以外还有附加流量,这些附加流量会最多占能每条边\(r-l\)这么多的流量,可以先建立一张每条流量都是\(r-l\)的图。
定义一个点的\(d_i\)为该点的入度减去出度(流入的流量减去流出的流量),然后对于一个点如果它的\(d_i\)大于\(0\),那么它需要向其他点补充流量,建立一个超级源点\(S\)向它连边,流量为\(d_i\)。同理如果一个点的\(d_i\)小于\(0\)就连向超级汇点\(T\)。
这样就搞定了无源点汇点的上下界可行流问题了。
然后考虑有源汇点\(s,t\)怎么办,那么也就是\(t\)可以无限接受,\(s\)可以无限输送。那么如果\(t\)向\(s\)连一条\(inf\)的边,那么就可以保证\(s,t\)的功能又能保证流量守恒了。
之后直接和无源点汇点的一样做就好了。
然后要求最大流,先跑一次有没有可行的再考虑流量能够浮动的范围,此时我们需要在刚刚的残量网络上找从\(s\)到\(t\)的增广路来增大\(s\)到\(t\)的流量,那么删掉刚刚\(t->s\)的边然后跑\(s->t\)的最大流就好了。
最小流的话就是从\(t->s\)跑最大流
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=210,inf=1e9;
struct node{
int to,next,w;
}a[41000];
int n,m,tot,in[N],out[N],d[N];
int ls[N],cur[N],dep[N];
queue<int> q;
void addl(int x,int y,int w){
a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;
a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
return;
}
bool bfs(int s,int t){
while(!q.empty())q.pop();q.push(s);
memset(dep,0,sizeof(dep));dep[s]=1;
for(int i=1;i<=t;i++)cur[i]=ls[i];
while(!q.empty()){
int x=q.front();q.pop();
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if(dep[y]||!a[i].w)continue;
q.push(y);dep[y]=dep[x]+1;
if(y==t)return 1;
}
}
return 0;
}
int dinic(int x,int flow,int t){
if(x==t)return flow;
int rest=0,k;
for(int &i=cur[x];i;i=a[i].next){
int y=a[i].to;
if(dep[x]+1!=dep[y]||!a[i].w)continue;
rest+=(k=dinic(y,min(flow-rest,a[i].w),t));
a[i].w-=k;a[i^1].w+=k;
if(rest==flow)return rest;
}
if(!rest)dep[x]=0;
return rest;
}
int main()
{
int ans=0,sum=0,s,t,S,T;
scanf("%d%d%d%d",&n,&m,&S,&T);
s=n+1;t=s+1;tot=1;
for(int i=1;i<=m;i++){
int x,y,l,u;
scanf("%d%d%d%d",&x,&y,&l,&u);
addl(x,y,u-l);d[y]+=l;d[x]-=l;
}
for(int i=1;i<=n;i++)
if(d[i]>0)addl(s,i,d[i]),sum+=d[i];
else addl(i,t,-d[i]);
addl(T,S,inf);
while(bfs(s,t))
ans+=dinic(s,inf,t);
if(ans!=sum)
return puts("please go home to sleep");
ans=a[tot].w;a[tot].w=a[tot^1].w=0;
while(bfs(S,T))
ans+=dinic(S,inf,T);
printf("%d\n",ans);
}
Loj#116-[模板]有源汇有上下界最大流的更多相关文章
- LOJ.116.[模板]有源汇有上下界最大流(Dinic)
题目链接 http://blog.csdn.net/just_sort/article/details/75448403 有源汇有上下界网络流 通过添加一条(T->S,[0,INF])的边变成无 ...
- LOJ.117.[模板]有源汇有上下界最小流(Dinic)
题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...
- LOJ.115.[模板]无源汇有上下界可行流(Dinic)
题目链接 参考:http://blog.csdn.net/clove_unique/article/details/54884437 http://blog.csdn.net/wu_tongtong/ ...
- loj #116. 有源汇有上下界最大流
题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...
- LibreOJ #116. 有源汇有上下界最大流
二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...
- 【模板】有源汇有上下界最大流(网络流)/ZOJ3229
先导知识 无源汇有上下界可行流 题目链接 https://vjudge.net/problem/ZOJ-3229 https://www.luogu.com.cn/problem/P5192 (有改动 ...
- loj #117. 有源汇有上下界最小流
题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...
- 【LOJ116】有源汇有上下界最大流(模板题)
点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ...
- 【Loj116】有源汇有上下界最大流(网络流)
[Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...
- LOJ116 - 有源汇有上下界最大流
原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...
随机推荐
- 实现动态加载一个 JavaScript 资源
var script = document.createElement("script"); var head = document.getElementsByTagName(&q ...
- vue 实现 leaflet的测绘,测距,测面
参考1:https://blog.csdn.net/lonly_maple/article/details/83658608 参考2:https://blog.csdn.net/xtfge0915/a ...
- MVVMLight学习笔记(七)---Messenger使用
一.概述 Messenger中文解释为信使的意思,顾名思义,在MvvmLight中,它的主要作用是用于View和ViewModel.ViewModel和ViewModel之间的通信. 考虑以下场景: ...
- SpringMVC的拦截器和过滤器的区别
一 简介 (1)过滤器: 依赖于servlet容器.在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次.使用过滤器的目的是用来做一些过滤操作,获取我们 ...
- Go测试--main测试
目录 简介 示例 简介 子测试的一个方便之处在于可以让多个测试共享Setup和Tear-down.但这种程度的共享有时并不满足需求,有时希望在整个测试程序做一些全局的setup和Tear-down,这 ...
- 阿里云服务器上部署java项目(安装jdk,tomcat)
安装JDK a.执行下面的yum指令安装,无线配置环境变量. 1.yum -y update #首先更新一下YUM源2.yum list Java* ---------#列出所有的JDK 3.yum ...
- Ubuntu 16.04 Install NVidia Driver (download from nvidia official site)
sudo apt-get update sudo apt-mark hold libreoffice sudo apt-get update && sudo apt-get upgra ...
- seo高手教你seo优化排名该怎么做
seo高手教你seo优化排名该怎么做 第一节:如何在本地搭建服务器环境 本节课程主要是讲如何利用 Xampp在本地搭建服务器环境 .网站使用asp和php比较常见,当然,就目前而言,使用php搭建网站 ...
- ELK数据迁移,ES快照备份迁移
通过curl命令或者kibana快照备份,恢复的方式进行数据迁移 环境介绍 之前创建的ELK 因为VPC环境的问题,需要对ELK从新部署,但是还需要保留现有的数据,于是便有了这篇文档. 10.0.20 ...
- 前端路由原理之 hash 模式和 history 模式
什么是路由? 个人理解路由就是浏览器 URL 和页面内容的一种映射关系. 比如你看到我这篇博客,博客的链接是一个 URL,而 URL 对应的就是我这篇博客的网页内容,这二者之间的映射关系就是路由. 其 ...