【有源汇上下界最大流】ZOJ 3229 Shoot the Bullet
题目链接:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3229
题目大意:
n天给m个女孩拍照(1<=n<=365,1<=m<=1000),每个女孩X在n天里总共至少拍Gx张照片。
第k天可以给Ck个女孩拍照,当天总共最多拍Dk张照片,每个女孩这天被拍的数量在[Li,Ri]。
满足要求的条件下尽量多拍照。
求是否有可行解,没有输出-1,有的话输出最大流以及每天对该天能拍照的女孩的拍照数量(巨坑。。怪我没读清题意。wa了好久)。
数据输入:
最多40组数据,多组数据,第一行两个数n和m,第二行m个数Gx。
接下来输入n天的信息,第一行为每天的Ck,Dk,接下来C行输入今天可以拍的女孩编号T(从0开始),L,R。
题目思路:
【有源汇上下界最大流】
设源s和汇t,s向第i天连(0,Di)的边,第i天向当天的Ck个女孩连(Li,Ri)的边,最后每个女孩向t连(Gi,∞)的边。
这样这题就转化成有上下界的最大流了。
接下来设超级源S和超级汇T,将有上下界的图转成无上下界的图。
从S到T跑一边最大流,如果每条S的出边都满流则有解,否则无解。
有解的情况下把S和T删掉(听说不删也可以?),从s到t跑一边最大流,即为答案(别忘了加上下界)。
建图方法:
设每条边上界为c,下界为b,将每条边的上界改为c-b。
我们开设一个数组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 INF 20000
#define PI 3.1415926535897
#define N 2004
#define M 2000004
using namespace std;
int n,m,cas,lll,ans;
int S,T,nn,s,t;
int last[N],in[N],d[N],vd[N],day[];
int low[M];
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,j,f,x,y,b,c;
lll=;ans=;
scanf("%d",&m);
s=n+m+;t=n+m+;
for(i=;i<=m;i++)
{
scanf("%d",&x);//Gx
//link(n+i,t,MAX-x);
in[n+i]-=x;in[t]+=x;
}
for(i=;i<=n;i++)
{
scanf("%d%d",&x,&day[i]);//C D
//link(s,i,f);
for(j=;j<=x;j++)
{
scanf("%d%d%d",&y,&b,&c);
y++;
link(i,n+y,c-b);
in[i]-=b;in[n+y]+=b;
low[++low[]]=b;
}
}
S=t+;
T=t+;
nn=n+m+;
for(i=;i<=n+m+;i++)
{
if(in[i]>)link(S,i,in[i]);
if(in[i]<)link(i,T,-in[i]);
}
for(i=;i<=m;i++)link(n+i,t,MAX);
for(i=;i<=n;i++)link(s,i,day[i]);
link(t,s,MAX);
}
int sap(int u,int f,int T)
{
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),T);
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;
}
void maxflow(int S,int T)
{
int f;
memset(d,,sizeof(d));
memset(vd,,sizeof(vd));
vd[]=nn;
while(d[S]<nn)
{
f=sap(S,MAX,T);
ans+=f;
}
}
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();
maxflow(S,T);
for(i=last[S],f=;i;i=e[i].next)
{
if(e[i].f>)
{
f=;
break;
}
}
if(!f)
puts("-1");
else
{
last[S]=last[T]=;
ans=;
maxflow(s,t);
printf("%d\n",ans);
for(i=;i<=low[];i++)
printf("%d\n",low[i]+e[(i<<)^].f);
}
low[]=;
memset(in,,sizeof(in));
memset(last,,sizeof(last));
puts("");
}
return ;
} /*
// //
*/
【有源汇上下界最大流】ZOJ 3229 Shoot the Bullet的更多相关文章
- ZOJ 3229 Shoot the Bullet(有源汇上下界最大流)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 题目大意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给 ...
- zoj 3229 Shoot the Bullet(有源汇上下界最大流)
Shoot the Bullethttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 Time Limit: 2 Second ...
- 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情
题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...
- POJ2396 Budget [有源汇上下界可行流]
POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...
- 有源汇上下界可行流(POJ2396)
题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...
- BZOJ_2502_清理雪道_有源汇上下界最小流
BZOJ_2502_清理雪道_有源汇上下界最小流 Description 滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道), ...
- 【Loj117】有源汇上下界最小流(网络流)
[Loj117]有源汇上下界最小流(网络流) 题面 Loj 题解 还是模板题. #include<iostream> #include<cstdio> #include< ...
- 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]
题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...
- Shoot the Bullet(ZOJ3229)(有源汇上下界最大流)
描述 ensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utop ...
随机推荐
- 11.1 morning
完美的序列(sequence)Time Limit:1000ms Memory Limit:64MB题目描述LYK 认为一个完美的序列要满足这样的条件:对于任意两个位置上的数都不相同.然而并不是所有的 ...
- sql 减去分钟
SQL SERVER:SELECT DATEADD( minute,-10,GETDATE()) ORACLE:SELECT to_char(sysdate -interval '10' minute ...
- hadoop集群环境搭建之zookeeper集群的安装部署
关于hadoop集群搭建有一些准备工作要做,具体请参照hadoop集群环境搭建准备工作 (我成功的按照这个步骤部署成功了,经实际验证,该方法可行) 一.安装zookeeper 1 将zookeeper ...
- vs2013下的WCFRest 模板开发WCF
在vs2013下使用wcfRestservice40 是安装不成功的,尝试多遍,都是这样.查看以前vs2012做的wcfrest,经过调教,终于在vs2013下也可以了! 1.新建wcf服务应用程序 ...
- Android开发---支付宝功能接口(支付功能)(转载!)
最近在做一个关于购物商城的项目,项目里面付款这块我选的是调用支付宝的接口,因为用的人比较多. 在网上搜索了以下,有很多这方面的教程,但大部分教程过于陈旧,而且描述的过于简单.而且支付宝提供的接口一直在 ...
- jquery,javascript -设置某一ul下的li下的 a的属性
//javascriptvar ul = document.getElementById('ul); var as = ul.getElementsByTagName('a'); for(var i ...
- retain two decimal digits.
package kju.o; import static kju.print.Printer.*; import java.text.*; class MathDemo { public static ...
- sql yog注册码
Name: AnyRegistration Code: 26f359fc-e3f6-4727-8af1-72a1a4a0819d
- Oracle (内连接)
例如: 表xuesheng id name 1, Jack 2, Tom 3, Kity 4, nono 表kaoshi id grade 1, 56 2, 76 11, 89 内连接(显示两表匹配的 ...
- java开发规范总结_命名规范
规范需要平时编码过程中注意,是一个慢慢养成的好习惯 1.文件 1.属性文件后缀为properties,并且符合java中i18n的规范: 2.对于各产品模块自己的配置文件必须放置在自己模块的con ...