题目链接:

  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的更多相关文章

  1. ZOJ 3229 Shoot the Bullet(有源汇上下界最大流)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 题目大意: 一个屌丝给m个女神拍照,计划拍照n天,每一天屌丝给 ...

  2. zoj 3229 Shoot the Bullet(有源汇上下界最大流)

    Shoot the Bullethttp://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3442 Time Limit: 2 Second ...

  3. 【有源汇上下界费用流】BZOJ 3876 [Ahoi2014]支线剧情

    题目链接: http://www.lydsy.com:808/JudgeOnline/problem.php?id=3876 题目大意: 给定一张拓扑图(有向无环图),每条边有边权,每次只能从第一个点 ...

  4. POJ2396 Budget [有源汇上下界可行流]

    POJ2396 Budget 题意:n*m的非负整数矩阵,给出每行每列的和,以及一些约束关系x,y,>=<,val,表示格子(x,y)的值与val的关系,0代表整行/列都有这个关系,求判断 ...

  5. 有源汇上下界可行流(POJ2396)

    题意:给出一个n*m的矩阵的每行和及每列和,还有一些格子的限制,求一组合法方案. 源点向行,汇点向列,连一条上下界均为和的边. 对于某格的限制,从它所在行向所在列连其上下界的边. 求有源汇上下界可行流 ...

  6. BZOJ_2502_清理雪道_有源汇上下界最小流

    BZOJ_2502_清理雪道_有源汇上下界最小流 Description        滑雪场坐落在FJ省西北部的若干座山上. 从空中鸟瞰,滑雪场可以看作一个有向无环图,每条弧代表一个斜坡(即雪道), ...

  7. 【Loj117】有源汇上下界最小流(网络流)

    [Loj117]有源汇上下界最小流(网络流) 题面 Loj 题解 还是模板题. #include<iostream> #include<cstdio> #include< ...

  8. 计蒜客 31447 - Fantastic Graph - [有源汇上下界可行流][2018ICPC沈阳网络预赛F题]

    题目链接:https://nanti.jisuanke.com/t/31447 "Oh, There is a bipartite graph.""Make it Fan ...

  9. Shoot the Bullet(ZOJ3229)(有源汇上下界最大流)

    描述 ensokyo is a world which exists quietly beside ours, separated by a mystical border. It is a utop ...

随机推荐

  1. ORACLE解锁数据库用户

    the account is locked解决办法: 1.进入sqlplus sqlplus "/as sysdba" 2.解锁: alter user hpmng account ...

  2. Asp.Net 注册 邮箱激活

    数据库 表的设计 State为用户状态  0为禁用  1为可用  默认为0,下面有个UserGUID,这个字段将来用于激活账户 首先你要写一个表单,验证码神马的,这个我就不写了..直接写处理的 代码在 ...

  3. OSG 安装配置

    对于普通用户推荐直接下载安装包配置.如有特殊需求或想了解编译过程可参考网上文章自己编译后配置.(通常建议使用第一种方法即可) 本人安装经验: 失败:自己系统64位,VS2010 32位,开始自己动手编 ...

  4. 【BZOJ1036】【树链剖分】树的统计Count

    Description 一 棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. ...

  5. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  6. 【SPOJ839】最优标号

    [题目描述] 给你一张无向图G(V,E).每个顶点都有一个标号,它是一个[0,2^31-1]内的整数.不同的顶点可能会有相同的标号. 对每条边(u,v),我们定义其费用cost(u,v)为u的标号与v ...

  7. Mysql group_concat函数被截断的问题

    mysql group_concat函数被截断的问题   MySQL的 group_concat 函数默认返回1024个字节长度,超过长度的会被截断.最近程序中就遇到这个问题了. 通过如下命令可以查看 ...

  8. jquery中eq和get的区别与使用方法

    $("p").eq(0).css("color") //因为eq(num)返回的是个jq对象,所以可以用jq的方法css使用get来获得第一个p标签的color ...

  9. Winform使用DevExpress的WaitDialogForm画面

    使用了DevExpress的WaitDialogForm 在应用程序加载开始时新建一个线程,并将loading画面show起来,在应用程序画面弹出前将该线程终止. 代码: private DevExp ...

  10. cocod2d-x 之 CCTMXTiledMap & CCTMXLayer

    cocos2dx框架自带的地图CCTMXTiledMap,继承自CCNode.CCTMXTiledMap的坐标系的原点位于左上角,以一个瓦片为单位,换句话说,左上角第一块瓦片的坐标为(0,0),而紧挨 ...