正题

题目链接: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-[模板]有源汇有上下界最大流的更多相关文章

  1. LOJ.116.[模板]有源汇有上下界最大流(Dinic)

    题目链接 http://blog.csdn.net/just_sort/article/details/75448403 有源汇有上下界网络流 通过添加一条(T->S,[0,INF])的边变成无 ...

  2. LOJ.117.[模板]有源汇有上下界最小流(Dinic)

    题目链接 有源汇有上下界最小流 Sol1. 首先和无源汇网络流一样建图,求SS->TT最大流: 然后连边(T->S,[0,INF]),再求一遍SS->TT最大流,答案为新添加边的流量 ...

  3. LOJ.115.[模板]无源汇有上下界可行流(Dinic)

    题目链接 参考:http://blog.csdn.net/clove_unique/article/details/54884437 http://blog.csdn.net/wu_tongtong/ ...

  4. loj #116. 有源汇有上下界最大流

    题目链接 有源汇有上下界最大流,->上下界网络流 注意细节,重置cur和dis数组时,有n+2个点 #include<cstdio> #include<algorithm> ...

  5. LibreOJ #116. 有源汇有上下界最大流

    二次联通门 : LibreOJ #116. 有源汇有上下界最大流 /* LibreOJ #116. 有源汇有上下界最大流 板子题 我也就会写写板子题了.. 写个板子第一个点还死活过不去... 只能打个 ...

  6. 【模板】有源汇有上下界最大流(网络流)/ZOJ3229

    先导知识 无源汇有上下界可行流 题目链接 https://vjudge.net/problem/ZOJ-3229 https://www.luogu.com.cn/problem/P5192 (有改动 ...

  7. loj #117. 有源汇有上下界最小流

    题目链接 有源汇有上下界最小流,->上下界网络流 注意细节,边数组也要算上后加到SS,TT边. #include<cstdio> #include<algorithm> ...

  8. 【LOJ116】有源汇有上下界最大流(模板题)

    点此看题面 大致题意: 给你每条边的流量上下界,让你先判断是否存在可行流.若存在,则输出最大流. 无源汇上下界可行流 在做此题之前,最好先去看看这道题目:[LOJ115]无源汇有上下界可行流. 大致思 ...

  9. 【Loj116】有源汇有上下界最大流(网络流)

    [Loj116]有源汇有上下界最大流(网络流) 题面 Loj 题解 模板题. #include<iostream> #include<cstdio> #include<c ...

  10. LOJ116 - 有源汇有上下界最大流

    原题链接 Description 模板题啦~ Code //有源汇有上下界最大流 #include <cstdio> #include <cstring> #include & ...

随机推荐

  1. datetime和timestamp的区别

    时间日期数据类型总概况 MySQL中有多种表示时间日期的数据类型,主要有YEAR.TIME.DATE.DATETIME.TIMESTAMP等.每一种数据类型都有存储的时间日期格式.以及取值范围,因此在 ...

  2. [SWMM]汇水区特征宽度的计算方法

    SWMM模型产流计算中,有一个比较重要的参数就是子汇水区的特征宽度(width),这个参数对地表汇流时间和峰值有一定的影响.子汇水区特征宽度的计算方法有很多,这里介绍比较常用的两种: (1)采用面积除 ...

  3. 在vue中引入版本为"echarts": "^5.1.2"图表

    1. npm install echarts --save 2. 在main.js文件中 import echarts from 'echarts' Vue.prototype.$echarts =  ...

  4. Promise.race()

    Promise.race([ ])---race竞赛,只要有一个决议了,就返回一个promise实例(对应resolve()或reject( )中参数值: 1.与Promise.all()对应的,还有 ...

  5. 阿里云服务器上部署java项目(安装mysql)

    安装mysql步骤如下: 1.安装MySQL官方的yum repository: wget -i -c http://dev.mysql.com/get/mysql57-community-relea ...

  6. [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区

    [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区 目录 [源码解析] 深度学习流水线并行 PipeDream(2)--- 计算分区 0x00 摘要 0x01 前言 1.1 P ...

  7. Qt5-调试器安装

    这周末正好有空,我好好研究了下如何给Qt安装调试器.我们在windows下一般安装两种Qt版本,一种是基于Visual Stuido编译器的(MSVC),另一种是基于g++的MinGW.使用后者一般调 ...

  8. MyBatis-Plus 代码生成器模板

    MyBatis-Plus 代码生成器模板 maven 依赖 <!--Mysql--> <dependency> <groupId>mysql</groupId ...

  9. web服务器之Ser-U和NFS

    1. Ser-U加载页面目录/文件列表 2. Ser-U下载文件 3. NFS服务器加载目录/文件列表 4. NFS服务器下载文件 4. 对比分析 Ser-U服务器在传输服务器端的目录时,使用的为xm ...

  10. 手把手教你 Docker Compose的安装和使用

    一.Docker Compose是什么? Docker Compose是一个工具,用于定义和运行多容器应用程序的工具: Docker Compose通过yml文件定义多容器的docker应用: Doc ...