zoj 3229 Shoot the Bullet(有源汇上下界最大流)
Shoot the Bullethttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442
Time Limit: 2 Seconds Memory Limit: 32768 KB Special Judge
Gensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utopia where humans and other beings such as fairies, youkai(phantoms), and gods live peacefully together. Shameimaru Aya is a crow tengu with the ability to manipulate wind who has been in Gensokyo for over 1000 years. She runs the Bunbunmaru News - a newspaper chock-full of rumors, and owns the Bunkachou - her record of interesting observations for Bunbunmaru News articles and pictures of beautiful danmaku(barrange) or cute girls living in Gensokyo. She is the biggest connoisseur of rumors about the girls of Gensokyo among the tengu. Her intelligence gathering abilities are the best in Gensokyo!

During the coming n days, Aya is planning to take many photos of m cute girls living in Gensokyo to write Bunbunmaru News daily and record at least Gx photos of girl x in total in the Bunkachou. At the k-th day, there are Ck targets, Tk1, Tk2, ..., TkCk. The number of photos of target Tki that Aya takes should be in range [Lki, Rki], if less, Aya cannot write an interesting article, if more, the girl will become angry and use her last spell card to attack Aya. What's more, Aya cannot take more than Dk photos at the k-th day. Under these constraints, the more photos, the better.
Aya is not good at solving this complex problem. So she comes to you, an earthling, for help.
Input
There are about 40 cases. Process to the end of file.
Each case begins with two integers 1 <= n <= 365, 1 <= m <= 1000. Then m integers, G1, G2, ..., Gm in range [0, 10000]. Then n days. Each day begins with two integer 1 <= C <= 100, 0 <= D <= 30000. Then C different targets. Each target is described by three integers, 0 <= T < m, 0 <= L <= R <= 100.
Output
For each case, first output the number of photos Aya can take, -1 if it's impossible to satisfy her needing. If there is a best strategy, output the number of photos of each girl Aya should take at each day on separate lines. The output must be in the same order as the input. If there are more than one best strategy, any one will be OK.
Output a blank line after each case.
Sample Input
2 3
12 12 12
3 18
0 3 9
1 3 9
2 3 9
3 18
0 3 9
1 3 9
2 3 9 2 3
12 12 12
3 18
0 3 9
1 3 9
2 3 9
3 18
0 0 3
1 3 6
2 6 9 2 3
12 12 12
3 15
0 3 9
1 3 9
2 3 9
3 21
0 0 3
1 3 6
2 6 12
Sample Output
36
6
6
6
6
6
6 36
9
6
3
3
6
9 -1
题意:n天给m个女孩拍照,每个女孩至少要拍gi张,每一天要给c个不同的女孩拍照,每一天最多拍d张,每一天每个女孩最少拍L张,最多拍R张
问能否完成拍照,若能输出最多拍多少张,同时输出每一天每个女孩拍多少张
否则,输出-1 有源汇上下界最大流
源点向每一天连[0,d]的边,每个女孩向汇点连[gi,inf]的边,每一天向每个女孩连[L,R]的边 本题无法评测。。,所以代码不知对错
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define N 1500
#define M 1500000
#define inf 2e9
using namespace std;
int n,m,src,dec,S,T,sum;
int tot,front[N],to[M],next[M],cap[M];
int lev[N],cur[N],a[N];
int ans[N],low[][];
queue<int>q;
void add(int u,int v,int w)
{
to[++tot]=v; next[tot]=front[u]; front[u]=tot; cap[tot]=w;
to[++tot]=u; next[tot]=front[v]; front[v]=tot; cap[tot]=;
}
bool bfs(int s,int t)
{
for(int i=;i<=n+m+;i++) cur[i]=front[i],lev[i]=-;
while(!q.empty()) q.pop();
q.push(s);
lev[s]=;
int now;
while(!q.empty())
{
now=q.front(); q.pop();
for(int i=front[now];i;i=next[i])
if(cap[i]>&&lev[to[i]]==-)
{
lev[to[i]]=lev[now]+;
if(to[i]==t) return true;
q.push(to[i]);
}
}
return false;
}
int dfs(int now,int t,int flow)
{
if(now==t) return flow;
int delta,rest=;
for(int & i=cur[now];i;i=next[i])
{
if(lev[to[i]]>lev[now]&&cap[i]>)
{
delta=dfs(to[i],t,min(flow-rest,cap[i]));
if(delta)
{
cap[i]-=delta; cap[i^]+=delta;
rest+=delta; if(rest==flow) break;
}
}
}
if(rest!=flow) lev[now]=-;
return rest;
}
int dinic(int s,int t)
{
int tmp=;
while(bfs(s,t))
tmp+=dfs(s,t,inf);
return tmp;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
tot=; sum=;
memset(a,,sizeof(a));
memset(front,,sizeof(front));
dec=n+m+; S=n+m+; T=n+m+;
add(dec,src,inf);
int x;
for(int i=;i<=m;i++)
{
scanf("%d",&x);
a[i]-=x;
a[dec]+=x;
add(i,dec,inf);
}
int c,d,y,z;
for(int i=;i<=n;i++)
{
scanf("%d%d",&c,&d);
add(src,m+i,d);
for(int j=;j<=c;j++)
{
scanf("%d%d%d",&z,&x,&y);
z++;
add(m+i,z,y-x);
low[i][z]=x;
a[m+i]-=x; a[z]+=x;
}
}
for(int i=;i<=n+m+;i++) ///i=0
if(a[i]<) add(i,T,-a[i]);
else if(a[i]>) add(S,i,a[i]),sum+=a[i];
if(dinic(S,T)==sum)
{
//int okflow=cap[3]; cap[3]=-1;
//printf("%d\n",dinic(src,dec)+okflow);
dinic(src,dec); add(dec,src,-inf);
int g=;
for(int i=front[src];i;i=next[i]) g+=cap[i^];
printf("%d\n",g);
for(int i=front[src];i;i=next[i])
{
memset(ans,,sizeof(ans));
if(to[i]<=m||to[i]>m+n) continue;
for(int j=front[to[i]];j;j=next[j])
{
if(to[j]>m) continue;
ans[to[j]]=cap[j^];
}
for(int j=;j<=m;j++) printf("%d\n",ans[j]+low[to[i]-m][j]);
}
}
else printf("-1\n");
printf("\n");
}
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 (有源汇点上下界最大流)
题意:要在n天里给m个女生拍照,每个女生有拍照数量的下限Gi,每天有拍照数量的上限Di,每天当中每个人有拍照的上限Lij和Rij.求在满足限制的基础上,所有人最大能拍多少张照片. 分析:抛开限制,显然 ...
- zoj 3229 Shoot the Bullet(无源汇上下界最大流)
题目:Shoot the Bullet 收藏:http://www.tuicool.com/articles/QRr2Qb 把每一天看成一个点,每个女孩也看成一个点,增加源和汇s.t,源向每一天连上[ ...
- ZOJ 3229 Shoot the Bullet | 有源汇可行流
题目: 射命丸文要给幻想乡的居民照相,共照n天m个人,每天射命丸文照相数不多于d个,且一个人n天一共被拍的照片不能少于g个,且每天可照的人有限制,且这些人今天照的相片必须在[l,r]以内,求是否有可行 ...
- 【有源汇上下界最大流】ZOJ 3229 Shoot the Bullet
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3229 题目大意: n天给m个女孩拍照(1<=n<= ...
- Shoot the Bullet(ZOJ3229)(有源汇上下界最大流)
描述 ensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utop ...
- 【有源汇上下界费用流】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的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...
随机推荐
- Android 中调用本地命令
Android 中调用本地命令 通常来说,在 Android 中调用本地的命令的话,一般有以下 3 种情况: 调用下也就得了,不管输出的信息,比如:echo Hello World.通常来说,这种命令 ...
- 四则运算(Android)版
实验题目: 将小学四则运算整合成网页版或者是Android版.实现有无余数,减法有无负数.... 设计思路: 由于学到的基础知识不足,只能设计简单的加减乘除,界面设计简单,代码量少,只是达到了入门级的 ...
- 软工实践-Alpha 冲刺 (10/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 完成所有界面的链接,整理与测试 展示GitHub当日代码/ ...
- windows(32位 64位)下python安装mysqldb模块
windows(32位 64位)下python安装mysqldb模块 www.111cn.net 编辑:mengchu9 来源:转载 本文章来给各位使用在此windows系统中的python来安装一个 ...
- javascript之彻底理解闭包
闭包是函数和声明该函数的词法环境的组合. function init() { var name = "Mozilla"; // name 是一个被 init 创建的局部变量 fun ...
- PHP中与类和对象有关的几个系统函数
与类有关的系统函数: class_exists(“类名”), 判断一个类是否存在(是否定义过) interface_exists(“接口名”), 判断一个接口是否存在(是否定义过) get_class ...
- PHP面向对象之重载
重载技术overloading 重载的基本概念 重载在“通常面向对象语言”中的含义: 是指,在一个类(对象)中,有多个名字相同但形参不同的方法的现象: 类似这样: class C{ functio ...
- 第165天:canvas绘制圆环旋转动画
canvas绘制圆环旋转动画——面向对象版 1.HTML 注意引入Konva.js库 <!DOCTYPE html> <html lang="en"> &l ...
- 第148天:js+rem动态计算font-size的大小,适配各种手机设备
需求: 在不同的移动终端设备中实现,UI设计稿的等比例适配. 方案: 布局排版都用rem做单位,然后不同宽度的屏,js动态计算根节点的font-size. 假设设计稿是宽750px来做的,书写css方 ...
- 第107天:Ajax 实现简单的登录效果
使用 Ajax 实现简单的登录效果 Ajax是一项使局部网页请求服务器信息,而不需整体刷新网页内容的异步更新技术.这使得向服务器请求的数据量大大减少,而且不会因局部的请求失败而影响到整体网页的加载. ...