题目大意

给定一个无源无汇的网络,边的容量有上下界限制,试构造一个合理的流量。

题目分析

求无源汇上下界的可行流模板题。

①增加一个附加源和汇\(S,T\)。

②把每个节点的\(\sum b_{u,i}\)和\(\sum b_{i,v}\)求出来,\(b\)是指下界。

③对于每个节点,若\(\sum b_{u,i}-\sum b_{i,v}>0\),则添一条从\(S\)到\(i\),容量为\(\sum b_{u,i}-\sum b_{i,v}\)的边。

若\(\sum b_{u,i}-\sum b_{i,v}<0\),则添一条从\(i\)到\(T\),容量为\(\sum b_{i,v}-\sum b_{u,i}\)的边。

④对于原网络中的点,连一条容量为 up-down 的边。

⑤求从\(S\)到\(T\)的最大流,若所有与\(S\)相连的边或与\(T\)相连的边都满载,则这是一个可行解,方案为④中所连边的剩余流量+\(b\)。

代码实现

#include<iostream>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<iomanip>
#include<cstdlib>
#define MAXN 0x7fffffff
typedef long long LL;
const int N=205*205;
using namespace std;
inline int Getint(){register int x=0,f=1;register char ch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}while(isdigit(ch)){x=x*10+ch-'0';ch=getchar();}return x*f;}
int n,m,S,T,num;
struct node{int next,to,pair,flow;}g[N<<1];
int h[N],cnt;
void AddEdge(int x,int y,int z){
g[++cnt].to=y,g[cnt].next=h[x],h[x]=cnt,g[cnt].flow=z,g[cnt].pair=cnt+1;
g[++cnt].to=x,g[cnt].next=h[y],h[y]=cnt,g[cnt].flow=0,g[cnt].pair=cnt-1;
}
int GAP[N],dis[N];
void Init(){
static int q[N];
int l=0,r=1;q[++l]=T,++GAP[dis[T]=1];
while(l<=r){
int x=q[l++];
for(int i=h[x];i;i=g[i].next){
int to=g[i].to;
if(!dis[to])++GAP[dis[to]=dis[x]+1],q[++r]=to;
}
}
}
int Dfs(int x,int Maxf){
if(x==T||!Maxf)return Maxf;
int ret=0;
for(int i=h[x];i;i=g[i].next){
int to=g[i].to;
if(g[i].flow&&dis[x]==dis[to]+1){
int dlt=Dfs(to,min(g[i].flow,Maxf-ret));
g[i].flow-=dlt;
g[g[i].pair].flow+=dlt;
ret+=dlt;
if(dis[S]==num+1||ret==Maxf)return ret;
}
}
if(!(--GAP[dis[x]]))dis[S]=num+1;
else GAP[++dis[x]]++;
return ret;
}
int SAP(){
Init();
int ans=Dfs(S,MAXN);
while(dis[S]<=num)ans+=Dfs(S,MAXN);
return ans;
}
struct Edge{int x,y,b,c;}s[N];
int inb[N],otb[N];
int main(){
n=Getint(),m=Getint(),S=0,T=n+m+1,num=T+1;
for(int i=1;i<=m;i++){
s[i].x=Getint(),s[i].y=Getint(),s[i].b=Getint(),s[i].c=Getint();
AddEdge(s[i].x,s[i].y,s[i].c-s[i].b);
inb[s[i].y]+=s[i].b,otb[s[i].x]+=s[i].b;
}
for(int i=1;i<=n;i++)
if(inb[i]>otb[i])AddEdge(S,i,inb[i]-otb[i]);
else AddEdge(i,T,otb[i]-inb[i]);
SAP();
bool flag=0;
for(int i=h[S];i;i=g[i].next)flag|=(g[i].flow>0);
cout<<((flag)?"NO":"YES");
return 0;
}

【SGU194】Reactor Cooling的更多相关文章

  1. 【zoj2314】Reactor Cooling 有上下界可行流

    题目描述 The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuc ...

  2. 【ZOJ2314】Reactor Cooling(有上下界的网络流)

    前言 话说有上下界的网络流好像全机房就我一个人会手动滑稽,当然这是不可能的 Solution 其实这道题目就是一道板子题,主要讲解一下怎么做无源无汇的上下界最大流: 算法步骤 1.将每条边转换成0~u ...

  3. 【SGU194&ZOJ2314】Reactor Cooling(有上下界的网络流)

    题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流 ...

  4. 【转】Reactor与Proactor两种模式区别

    转自:http://www.cnblogs.com/cbscan/articles/2107494.html 两种IO多路复用方案:Reactor and Proactor 一般情况下,I/O 复用机 ...

  5. 【转载】Reactor模式,或者叫反应器模式

    Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些.通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或 ...

  6. 【转载】Reactor模式和NIO

    当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作.他们都有一个共同的结构:1. Read request2. Decode request3. Proc ...

  7. acdream 1211 Reactor Cooling 【边界网络流量 + 输出流量】

    称号:acdream 1211 Reactor Cooling 分类:无汇的有上下界网络流. 题意: 给n个点.及m根pipe,每根pipe用来流躺液体的.单向的.每时每刻每根pipe流进来的物质要等 ...

  8. 【有上下界的网络流】ZOJ2341 Reactor Cooling(有上下界可行流)

     Description The terrorist group leaded by a well known international terrorist Ben Bladen is bulidi ...

  9. 【有上下界网络流】【ZOJ】2314 Reactor Cooling

    [算法]有上下界网络流-无源汇(循环流) [题解]http://www.cnblogs.com/onioncyc/p/6496532.html //未提交 #include<cstdio> ...

随机推荐

  1. 深入Dagger:JavaPoet的使用

    前言 最近在用Dagger开发应用,Dagger是google在square的基础上去反射的依赖注入框架. Dagger会根据定义的注解在编译阶段根据依赖注入的配置生成相应的代码,来减少运行期间反射的 ...

  2. window 下总是object_detection/protos/*.proto: No such file or directory

    这是因为目前的protoc3.5有Bug,换成3.4就好了https://github.com/google/protobuf/releases/tag/v3.4.0

  3. Web UI开发神器—Kendo UI for jQuery数据管理之过滤操作

    Kendo UI for jQuery最新试用版下载 Kendo UI目前最新提供Kendo UI for jQuery.Kendo UI for Angular.Kendo UI Support f ...

  4. vue 本地环境API代理设置和解决跨域

    写一个config.js文件,作为项目地址的配置. //项目域名地址 const url = 'https://exaple.com'; let ROOT; //由于封装的axios请求中,会将ROO ...

  5. js中获取basePath

    单独js文件中el不能获取,通过以下方式获取1 var location = (window.location+'').split('/'); var basePath = location[0]+' ...

  6. PHP ftp_alloc() 函数

    定义和用法 ftp_alloc() 函数为要上传到 FTP 服务器的文件分配空间. 如果成功,该函数返回 TRUE.如果失败,则返回 FALSE. 语法 ftp_alloc(ftp_connectio ...

  7. NX二次开发-基于MFC界面对话框与NX交互的开发

    打开VS2013 点击新建,选择MFC DLL 点击确定 点下一步 什么都不改,直接点完成 进来之后先编译一下,看是否编译成功 打开项目属性,更改这几处 $(UGII_BASE_DIR)\ugopen ...

  8. js类数组转数组的方法(ArrayLike)

    1. 什么是类数组ArrayLike(类数组  就是一个普通的  js对象) 类数组对象必须含有 length 属性,且元素属性名必须是数值或者可转换为数值的字符. 类数组对象不是数组对象,所以没有数 ...

  9. [ZJOI2011]看电影(组合数学/打表+高精)

    Description 到了难得的假期,小白班上组织大家去看电影.但由于假期里看电影的人太多,很难做到让全班看上同一场电影,最后大家在一个偏僻的小胡同里找到了一家电影院.但这家电影院分配座位的方式很特 ...

  10. CF D. Walking Between Houses (贪心)

    题意: 现在有n个房子排成一列,编号为1~n,起初你在第1个房子里,现在你要进行k次移动,每次移动一都可以从一个房子i移动到另外一个其他的房子j里(i != j),移动的距离为|j - i|.问你进过 ...