【有源汇上下界最大流】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 ...
随机推荐
- python s12 day2
python s12 day2 入门知识拾遗 http://www.cnblogs.com/wupeiqi/articles/4906230.html 基本数据类型 注:查看对象相关成员 var, ...
- 【Android】android镜像翻转
Android镜像翻转指的是将屏幕进行水平的翻转,达到所有内容显示都会反向的效果,就像是在镜子中看到的界面一样.这种应用的使用场景相对比较受限,主要用在一些需要使用Android手机界面进行镜面投影的 ...
- Unity3D 相机跟随主角移动
这里给主相机绑定一个脚本. 脚本写为: using UnityEngine; using System.Collections; public class camerafollow : MonoBeh ...
- sid超过8个字符处理步骤
服务端配置如下: [oracle@p3 admin]$ cat listener.ora # listener.ora Network Configuration File: /home/oracle ...
- 受限玻尔兹曼机(RBM)
能量模型 RBM用到了能量模型. 简单的概括一下能量模型.假设一个孤立系统(总能量$E$一定,粒子个数$N$一定),温度恒定为1,每个粒子有$m$个可能的状态,每个状态对应一个能量$e_i$.那么,在 ...
- 【转】iOS8 推送 获取 devicetoken
标签:推送 push ios8 devicetoken token xcode6 原文:http://roybaby.blog.51cto.com/1508945/1557854 打开AppDeleg ...
- iOS 集成支付宝遇到的问题(续)
调起支付宝进行支付时提示private key is null ,碰到这个问题有两种解决方案 第一种. 将私钥转成PKCS8替换一下原私钥即可 1.生成私钥pem, 执行命令openssl genr ...
- POJ 1286 Necklaces of Beads (Burnside定理,有限制型)
题目链接:http://vjudge.net/problem/viewProblem.action?id=11117 就是利用每种等价情形算出置换节之后算组合数 #include <stdio. ...
- codeforces 165D.Beard Graph 解题报告
题意: 给一棵树,树的每条边有一种颜色,黑色或白色,一开始所有边均为黑色,有两个操作: 操作1:将第i条边变成白色或将第i条边变成黑色. 操作2 :询问u,v两点之间仅经过黑色变的最短距离. 树链剖分 ...
- coffee 编译时, 用本地环境
export PATH="./node_modules/.bin:$PATH" 原文: How to use package installed locally in node_m ...