题目链接:

  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. 传统的log4j实战

    /** * */ package log4j; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator ...

  2. java开发规范总结_命名规范

    规范需要平时编码过程中注意,是一个慢慢养成的好习惯 1.文件 1.属性文件后缀为properties,并且符合java中i18n的规范:   2.对于各产品模块自己的配置文件必须放置在自己模块的con ...

  3. 数据库连接报错之IO异常(The Network Adapter could not establish the connection)

    Io 异常: The Network Adapter could not establish the connection 有以下四个原因: 1.oracle配置 listener.ora 和tnsn ...

  4. C#入门经典(第五版)学习笔记(二)

    ---------------函数---------------参数数组:可指定一个特定的参数,必须是最后一个参数,可使用个数不定的参数调用函数,用params关键字定义它们 例如: static i ...

  5. 英语学习[ZZ]

    本文作者三年间从四级勉强及格到高级口译笔试210,口试232.找工作面试时给其口试的老外考官听了一分钟就说你的英语不用考了.虽不敢说方法一定是最好的,但从现在开始随便谁不要再去找学习资料,每天花两个钟 ...

  6. SGU 128.Snake

    时间限制:0.25s 空间限制:4m 题意: 在一个平面坐标中有N个点,现在要你用这N个点构造一个闭合图形,这个图形要满足以下条件: 1.这个图形要是闭合的:          2.图形上的点只能是给 ...

  7. 在easyui dialog的子页面内如何关闭弹窗

    因项目需要在dialog中添加滚动条,所以就在div中加了iframe: <div id="applyRefundDialog" style="display:no ...

  8. CodeIgniter框架——介绍

    CodeIgniter 是一个应用程序框架 CodeIgniter 是一个为用 PHP 编写网络应用程序的人员提供的工具包.它的目标是实现让你比从零开始编写代码更快速地开发项目,为此,CI 提供了一套 ...

  9. FC8下备份linux系统

    linux系统可以使用tar来备份.<br><br> 我在FC8上装好了totem, mplayer, audacious, 并搞定了wifi后,我觉得该备份一下FC8系统.& ...

  10. Wdcp两日志的路径

    Wdcp两日志的路径: /www/wdlinux/httpd-2.2.22/logs /www/wdlinux/nginx-1.0.15/logs