【无源汇上下界最大流】SGU 194 Reactor Cooling
题目链接:
http://acm.sgu.ru/problem.php?contest=0&problem=194
题目大意:
n个点(n<20000!!!不是200!!!RE了无数次),m条边(管子)(m范围好像没说,我开了10^6),每个点流入的和流出的液体要相等,每条边(管子)有上下界流量,问是否有解,有解YES无解NO,有解还要输出每条边的流量。
题目输入样例略坑,我以为要多组数据输入输出TEST #1 什么的。后来仔细看了Input发现只有一组吧应该,保险起见还是写了多组,但是不用读入TEST是肯定的。
题目思路:
【无源汇上下界最大流】
直接建图套最大流模版即可。
最近刚好在搞上下界问题,等到都做完了写个总结吧。
建图模型:(学习自Mr. Ant http://www.cnblogs.com/kane0526/archive/2013/04/05/3001108.html)
以前写最大流默认下界为0,而这里的下界却不为0,所以我们要进行再构造让每条边的下界为0,这样做是为了方便处理。
对于每条边(管子)有一个上界容量c和一个下界容量b,我们让这条边(管子)的容量下界变为0,上界为b-c。
可是这样做的话流量就不守恒了,为了再次满足流量守恒,增设一个超级源点S和一个超级终点T。
我们开设一个数组in[]来记录每个节点的流量情况。
in[i]=Σi入下界-Σi出下界(i节点所有入流下界之和-i节点所有出流下界之和)。
当in[i]大于0的时候,S到i连一条流量为in[i]的边。
当in[i]小于0的时候,i到T连一条流量为-in[i]的边。
最后对(S,T)求一次最大流即可,当所有附加边全部满流时(S的出边都满流时),有可行解。
//
//by coolxxx
//
#include<iostream>
#include<algorithm>
#include<string>
#include<iomanip>
#include<memory.h>
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>
#include<math.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define abs(a) ((a)>0?(a):(-(a)))
#define lowbit(a) (a&(-a))
#define sqr(a) (a)*(a)
#define swap(a,b) (a)^=(b),(b)^=(a),(a)^=(b)
#define eps 1e-8
#define MAX 0x7f7f7f7f
#define PI 3.1415926535897
#define N 20004
#define M 1000004
using namespace std;
int n,m,cas,lll,ans;
int S,T,nn;
int last[N],in[N],d[N],vd[N],low[N];
char s[N];
bool inq[N];
struct xxx
{
int next,to,f;
}e[M];
void add(int x,int y,int f)
{
e[++lll].next=last[x];
last[x]=lll;
e[lll].to=y;
e[lll].f=f;
}
void link(int x,int y,int f)
{
add(x,y,f);
add(y,x,);
}
void build()
{
int i,f,x,y,b,c;
lll=;ans=;
memset(low,,sizeof(low));
memset(in,,sizeof(in));
memset(last,,sizeof(last));
memset(e,,sizeof(e));
memset(d,,sizeof(d));
memset(vd,,sizeof(vd));
scanf("%d",&m);
for(i=;i<=m;i++)
{
scanf("%d%d%d%d",&x,&y,&b,&c);
in[x]-=b;in[y]+=b;
link(x,y,c-b);
low[i]=b;
}
S=n+;
T=n+;
nn=n+;
for(i=;i<=n;i++)
{
if(in[i]>)link(S,i,in[i]);
if(in[i]<)link(i,T,-in[i]);
}
}
int sap(int u,int f)
{
int i,tt,asp=,mix=nn-;
if(u==T)return f;
for(i=last[u];i;i=e[i].next)
{
if(e[i].f>)
{
if(d[u]==d[e[i].to]+)
{
tt=sap(e[i].to,min(f-asp,e[i].f));
asp+=tt;
e[i].f-=tt;
e[i^].f+=tt;
if(asp==f || d[S]==nn)
return asp;
}
mix=min(mix,d[e[i].to]);
}
}
if(asp!=)return asp;
if(!--vd[d[u]])d[S]=nn;
else vd[d[u]=mix+]++;
return asp;
}
int main()
{
#ifndef ONLINE_JUDGE
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
#endif
int i,j,f;
// while(~scanf("%s",s))
while(~scanf("%d",&n) && n)
{
build();
vd[]=nn;
while(d[S]<nn)
{
f=sap(S,MAX);
ans+=f;
}
for(i=last[S],f=;i;i=e[i].next)
{
if(e[i].f>)
{
f=;
break;
}
}
if(!f)
puts("NO");
else
{
puts("YES");
for(i=;i<=m;i++)
printf("%d\n",low[i]+e[i+i+].f);
}
}
return ;
} /*
// //
*/
【无源汇上下界最大流】SGU 194 Reactor Cooling的更多相关文章
- ZOJ 2314 - Reactor Cooling - [无源汇上下界可行流]
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2314 The terrorist group leaded by ...
- hdu 4940 Destroy Transportation system (无源汇上下界可行流)
Destroy Transportation system Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 ...
- zoj 2314 Reactor Cooling (无源汇上下界可行流)
Reactor Coolinghttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1314 Time Limit: 5 Seconds ...
- zoj2314 无源汇上下界可行流
题意:看是否有无源汇上下界可行流,如果有输出流量 题解:对于每一条边u->v,上界high,下界low,来说,我们可以建立每条边流量为high-low,那么这样得到的流量可能会不守恒(流入量!= ...
- ZOJ2314 Reactor Cooling(无源汇上下界可行流)
The terrorist group leaded by a well known international terrorist Ben Bladen is buliding a nuclear ...
- BZOJ.1927.[SDOI2010]星际竞速(无源汇上下界费用流SPFA /最小路径覆盖)
题目链接 上下界费用流: /* 每个点i恰好(最少+最多)经过一次->拆点(最多)+限制流量下界(i,i',[1,1],0)(最少) 然后无源汇可行流 不需要源汇. 注: SS只会连i',求SS ...
- zoj 3229 Shoot the Bullet(无源汇上下界最大流)
题目:Shoot the Bullet 收藏:http://www.tuicool.com/articles/QRr2Qb 把每一天看成一个点,每个女孩也看成一个点,增加源和汇s.t,源向每一天连上[ ...
- 有源汇上下界可行流(POJ2396)
题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...
- ZOJ 3229 Shoot the Bullet(有源汇上下界最大流)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 题目大意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给 ...
随机推荐
- HttpClient使用cookie
import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; ...
- Java 最简单的批处理
批处理Batch && PreparedStatement : import java.sql.*; public class TestBatch { public static vo ...
- 关于“SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问 ”
原因:在从远程服务器复制数据到本地时出现“SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatas ...
- 【转】 UINavigationItem UINavigationBar 关系分析
原文:http://blog.csdn.net/luoyeffcs/article/details/16106707 目录 1.关系分析 2.关系综述 3.概念点 4.疑问 1.关系分析 UIBarI ...
- JDBC标准事物编程模式
事物简介: 事物是一种数据库中保证交易可靠的机制,JDBC支持数据库中事物的概念,默认情况下事物是默认提交的. 事物的特性: 1.事物必须是原子工作单元,对于其数据的修改,要么都执行,要么都不执行2. ...
- linux定时执行python脚本
每天清晨 4:00:01,用python执行/opt/aa.py文件. 编辑定时任务: #crontab -e 加入: 0 4 * * * python /opt/aa.py 保存,退出即可. 如果执 ...
- Codeforces 543D Road Improvement(DP)
题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...
- 使用程序往Neo4j导入CSV报错
今天在用程序向Neo4j导入csv文件时,报以下错误: java.net.ConnectException: Connection refused: connect java.rmi.ConnectE ...
- js 表达式与运算符 详解(上)
表达式: 表达式是用于JavaScript脚本运行时进行计算的式子,可以包含常量.变量.运算符 <script> var r = 2 var pi = 3.14 var circle = ...
- JS 导出图片,toDataURL
//输出图片 function exportCanvasAsPNG(id, fileName) { //获取canvas元素 var canvasElement = document.getEleme ...