【BZOJ3280】小R的烦恼 最小费用最大流
【BZOJ3280】小R的烦恼
Description
现在,程设老师想要知道,最少花多少钱,能够在这n天中满足每天的需要呢?若无法满足,则请输出”impossible”。注意,由于程设老师良心大大的坏,所以他是可以不把濒死的研究生送去医院的!
Input
本题包含多组数据;第一行是一个数T(T<=11),表示数据组数,以下T组数据。
对于每一组数据,第一行三个数,n,m,k;
以下一行n个数,表示a[1]…a[n]
接着一行2m个数,表示l[1],p[1]…l[n],p[n]
接着一行2k个数,表示d[1],q[1]…d[n],q[n]
Output
对于每组数据以样例的格式输出一行,两个数分别表示第几组数据和最少钱数。
Sample Input
3 2 1
10 20 30
40 90 15 100
1 5
3 2 1
10 20 30
40 90 15 100
2 5
Sample Output
Case 2: impossible
HINT
样例解释:买下90块钱的那40个研究生,另外再买10个100块钱的。这样,第一天用完的10个人全部送到医院,那么他们在第三天可以继续使用;同时,第二天和第三天都用新的研究生来弥补,这样一共需要花费40*90 + 10*100 + 5*10 = 4650元。
数据规模:
对于30%的数据中的每组数据,
满足n<=5,m,k<=2,其余数均小于等于100或者
n<=10,m,k<=10,其余数均小于等于20.
对于100%的数据
n,m,k<=50,其余数均小于等于100.
题解:本题与餐巾计划类似
建图方法:一共2*n+1个点,我们令0号点为源点,2*n+1号点为汇点,第i号(1≤i≤n)号点表示第i天时濒死的人(这里用dead[i]表示),第i+n号点表示第i天需要的人(这里用live[i])表示,连边如下
| 起点 | 终点 | 流量 | 费用 |
| 0 | dead[i] | a[i] | 0 |
| live[i] | 2*n+1 | a[i] | 0 |
| 0 | live[1] | l[j] | p[j] |
| dead[i] | live[i+d[j]] | ∞ | q[j] |
| live[i] | live[i+1] | ∞ | 0 |
| dead[i] | dead[i+1] | ∞ | 0 |
最大流什么的只要写得多自然就会了
数组大小已实测
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
int n,m,k,sum,ans,cnt,tot;
int to[6010],next[6010],flow[6010],cost[6010],head[110];
int inq[110],dis[110],re[110],rv[110];
queue<int> q;
int readin()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
void add(int a,int b,int c,int d)
{
to[cnt]=b;
flow[cnt]=c;
cost[cnt]=d;
next[cnt]=head[a];
head[a]=cnt++;
}
int bfs()
{
int i,u;
memset(dis,0x3f,sizeof(dis));
dis[0]=0;
q.push(0);
while(!q.empty())
{
u=q.front(),q.pop();
inq[u]=0;
for(i=head[u];i!=-1;i=next[i])
{
if(dis[to[i]]>dis[u]+cost[i]&&flow[i])
{
dis[to[i]]=dis[u]+cost[i];
rv[to[i]]=u,re[to[i]]=i;
if(!inq[to[i]])
{
inq[to[i]]=1;
q.push(to[i]);
}
}
}
}
return dis[2*n+1]<1000000;
}
void work()
{
ans=sum=cnt=tot=0;
memset(head,-1,sizeof(head));
int i,j,a,b,minn;
n=readin(),m=readin(),k=readin();
for(i=1;i<=n;i++)
{
a=readin(),tot+=a;
add(0,i,a,0),add(i,0,0,0);
add(i+n,2*n+1,a,0),add(2*n+1,i+n,0,0);
if(i>1)
{
add(i+n-1,i+n,1<<30,0),add(i+n,i+n-1,0,0);
add(i-1,i,1<<30,0),add(i,i-1,0,0);
}
}
for(i=1;i<=m;i++)
{
a=readin(),b=readin();
add(0,1+n,a,b),add(1+n,0,0,-b);
}
for(i=1;i<=k;i++)
{
a=readin(),b=readin();
for(j=1;j+a+1<=n;j++) add(j,j+a+n+1,1<<30,b),add(j+a+n+1,j,0,-b);
}
while(bfs())
{
minn=1<<30;
for(i=2*n+1;i;i=rv[i]) minn=min(minn,flow[re[i]]);
ans+=minn;
sum+=minn*dis[2*n+1];
for(i=2*n+1;i;i=rv[i]) flow[re[i]]-=minn,flow[re[i]^1]+=minn;
}
if(ans<tot) printf("impossible\n");
else printf("%d\n",sum);
}
int main()
{
int T=readin(),i;
for(i=1;i<=T;i++)
{
printf("Case %d: ",i);
work();
}
return 0;
}
【BZOJ3280】小R的烦恼 最小费用最大流的更多相关文章
- bzoj3280: 小R的烦恼(最小费用最大流)
Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要 求小R帮助他一起解决一个难题.问题是这样的,程设老师最近要进行一项邪恶的实 ...
- BZOJ3280: 小R的烦恼
题解: 随便建一下图费用流就可以过吧... 代码: #include<cstdio> #include<cstdlib> #include<cmath> #incl ...
- 【BZOJ3280】 小R的烦恼(费用流,建模)
有很浓厚的熟悉感?餐巾计划问题? 不就是多了几个医院,相当于快洗部和慢洗部开了分店. 考虑建图: 如果把每一天拆成两个点,一个表示需求,另一个表示拥有的话. 显然就是一个两边的图,考虑如果我现在有人, ...
- 【费用流】bzoj3280 小R的烦恼
类似bzoj1221 http://www.cnblogs.com/autsky-jadek/p/4174087.html 只不过大学有多个,所以我们另开一个节点汇总所有'S->大学'的边,然后 ...
- BZOJ_3280_小R的烦恼_最小费用最大流
BZOJ_3280_小R的烦恼_最小费用最大流 Description 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要 求小R帮助他一起解决一个难 ...
- 【bzoj3280】小R的烦恼 费用流
题目描述 小R最近遇上了大麻烦,他的程序设计挂科了.于是他只好找程设老师求情.善良的程设老师答应不挂他,但是要求小R帮助他一起解决一个难题. 问题是这样的,程设老师最近要进行一项邪恶的实验来证明P=N ...
- 【BZOJ】【3280】小R的烦恼
网络流/费用流 和软件开发那题基本相同,只是多加了一个“雇佣研究生”的限制:不同价格的研究生有不同的数量…… 那么只需加一个附加源点,对每一种研究生连边 S->ss 容量为l[i],费用为p[i ...
- BZOJ 3280: 小R的烦恼 & BZOJ 1221: [HNOI2001] 软件开发
3280: 小R的烦恼 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 399 Solved: 200[Submit][Status][Discuss ...
- hdu 4411 2012杭州赛区网络赛 最小费用最大流 ***
题意: 有 n+1 个城市编号 0..n,有 m 条无向边,在 0 城市有个警察总部,最多可以派出 k 个逮捕队伍,在1..n 每个城市有一个犯罪团伙, 每个逮捕队伍在每个城市可以选 ...
随机推荐
- 等待事件 wait event
衡量数据库状况, 优化数据库等 当一个进程连接到数据库后, 进程所经历的种种等待就开始被记录, 并且通过一系列的性能视图进行展示, 通过等待事件用户可以很快发现数据库的性能瓶颈, 从而进行针对性能的优 ...
- 百万级PHP网站架构工具箱
在了解过世界最大的PHP站点,Facebook的后台技术后,今天我们来了解一个百万级PHP站点的网站架构:Poppen.de.Poppen.de是德国的一个社交网站,相对Facebook.Flickr ...
- 修改ES分片规则
转自:http://my.oschina.net/crxy/blog/422287?p=1 Es查询的时候默认是随机从一些分片中查询数据,可以通过配置让es从某些分片中查询数据 1:_local 指查 ...
- thinkphp openfire 添加用户 骨架
public function addadd(){ header("Content-Type:text/html; charset=utf-8"); $user=$_POST['n ...
- 【转】【Mysql】MySQL添加用户、删除用户与授权
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @&g ...
- linux -- Ubuntu查看修改mysql的登录名和密码、安装phpmyadmin
安装好mysql后,在终端输入 mysql -u root -p 按回车,输入密码后提示access denied......ues password YES/NO的错误 原因是用户名或密码不对! 查 ...
- html学习笔记五
关于服务端和client的校验问题 上述的表格信息填写后发现,即使有些信息不添,依旧能够提交 所以针对此问题,我们要在client进行数据填写信息的增强型校验(必添单元,必须填写有效信息,否则无法提交 ...
- MySQL(二)之服务管理与配置文件修改和连接MySQL
上一篇给大家介绍了怎么在linux和windows中安装mysql,本来是可以放在首页的,但是博客园说“安装配置类文件”不让放在首页.接下来给大家介绍一下在linux和windows下MySQL的一下 ...
- opencv播放视屏并控制位置
原文地址:http://blog.csdn.net/augusdi/article/details/9000592 cvGetCaptureProperty是我们需要使用到的获取视频属性的函数. do ...
- POI-根据Cell获取对应的String类型值
/** * 根据不同情况获取Java类型值 * <ul><li>空白类型<ul><li>返回空字符串</li></ul>< ...