codevs 1803 志愿者招募
1803 志愿者招募
2008年NOI全国竞赛
申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的 主管。布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志 愿者。经过估算,这个项目需要 N 天才能完成,其中第 i 天至少需要 Ai个人。 布布通过了解得知,一共有 M 类志愿者可以招募。其中第 i 类可以从第 Si天工 作到第 Ti 天,招募费用是每人 Ci元。新官上任三把火,为了出色地完成自己的 工作,布布希望用尽量少的费用招募足够的志愿者,但这并不是他的特长!于是 布布找到了你,希望你帮他设计一种最优的招募方案。
输入描述 Input Description
输入文件 employee.in 的第一行包含两个整数 N, M,表示完成项目的天数和 可以招募的志愿者的种类。 接下来的一行中包含 N 个非负整数,表示每天至少需要的志愿者人数。 接下来的 M 行中每行包含三个整数 Si, Ti, Ci,含义如上文所述。为了方便起 见,我们可以认为每类志愿者的数量都是无限多的。
输入文件 employee.out 中仅包含一个整数,表示你所设计的最优方案的总费用。
3 3
2 3 4
1 2 2
2 3 5
3 3 2
14
【样例说明】
招募 3 名第一类志愿者和 4 名第三类志愿者。
30%的数据中,1 ≤ N, M ≤ 10,1 ≤ Ai ≤ 10;
100%的数据中,1 ≤ N ≤ 1000,1 ≤ M ≤ 10000,题目中其他所涉及的数据均不超过 231-1。
解题:上下界费用流。
建图,第i天向第i+1天建立下界为第i天需要的人数的边,对于人的种类,可以连接ti+1 到 si 费用为ti,流量为无限的边。然后就是类似于上下界流那样,建图。建图后求最小费用流。注意由于i到i+1的边表示第i天至少得招募人数,所有就会有n+1个点。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <vector>
#include <queue>
#include <cstdlib>
#include <string>
#include <set>
#include <stack>
#define LL long long
#define pii pair<int,int>
#define INF 0x3f3f3f3f3f3f3f3fLL
using namespace std;
const int maxn = ;
struct arc{
int to,next;
LL flow,cost;
arc(int x = ,LL y = ,LL z = ,int nxt = -){
to = x;
flow = y;
cost = z;
next = nxt;
}
};
arc e[maxn*];
int head[maxn],p[maxn],S,T,tot,n,m;
LL d[maxn],in[maxn];
bool vis[maxn];
void add(int u,int v,LL flow,LL cost){
e[tot] = arc(v,flow,cost,head[u]);
head[u] = tot++;
e[tot] = arc(u,,-cost,head[v]);
head[v] = tot++;
}
bool spfa(){
queue<int>q;
for(int i = ; i <= T; ++i){
vis[i] = false;
d[i] = INF;
p[i] = -;
}
d[S] = ;
q.push(S);
while(!q.empty()){
int u = q.front();
q.pop();
vis[u] = false;
for(int i = head[u]; ~i; i = e[i].next){
if(e[i].flow && d[e[i].to] > d[u] + e[i].cost){
d[e[i].to] = d[u] + e[i].cost;
p[e[i].to] = i;
if(!vis[e[i].to]){
vis[e[i].to] = true;
q.push(e[i].to);
}
}
}
}
return p[T] > -;
}
LL solve(){
LL ans = ;
while(spfa()){
LL minv = INF;
for(int i = p[T]; ~i; i = p[e[i^].to])
minv = min(minv,e[i].flow);
for(int i = p[T]; ~i; i = p[e[i^].to]){
e[i].flow -= minv;
e[i^].flow += minv;
ans += minv*e[i].cost;
}
}
return ans;
}
int main() {
LL tmp,w;
int u,v;
while(~scanf("%d %d",&n,&m)){
memset(head,-,sizeof(head));
memset(in,,sizeof(in));
S = n + ;
T = n + ;
for(int i = ; i <= n; ++i){
scanf("%lld",&tmp);
add(i,i+,INF-tmp,);
in[i] -= tmp;
in[i+] += tmp;
}
for(int i = ; i < m; ++i){
scanf("%d %d %lld",&u,&v,&tmp);
add(v+,u,INF,tmp);
}
for(int i = ; i <= n + ; ++i)
if(in[i] < ) add(i,T,-in[i],);
else if(in[i] > ) add(S,i,in[i],);
printf("%lld",solve());
}
return ;
}
codevs 1803 志愿者招募的更多相关文章
- BZOJ 1061: [Noi2008]志愿者招募
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4064 Solved: 2476[Submit][Stat ...
- BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3975 Solved: 2421[Submit][Stat ...
- BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模
本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...
- [BZOJ1061][Noi2008]志愿者招募
[BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...
- bzoj 1061 志愿者招募(最小费用最大流)
[Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3792 Solved: 2314[Submit][Status][Di ...
- 【BZOJ】【1061】【NOI2008】志愿者招募
网络流/费用流 OrzOrzOrz,这题太神了不会捉. 题解:https://www.byvoid.com/blog/noi-2008-employee/ 这道题正确的解法是构造网络,求网络最小费用最 ...
- BZOJ 1061: [Noi2008]志愿者招募 费用流
1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...
- bzoj1061: [Noi2008]志愿者招募
线性规划与费用流.http://www.cnblogs.com/iiyiyi/p/5616080.html.数组范围开错了!!!然后2.31-1=0x7fffffff!=0x7f7f7f7f. 开始以 ...
- NOI2008 志愿者招募
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 1859 Solved: 1169[Submit][Stat ...
随机推荐
- 2015 Multi-University Training Contest 9 hdu 5396 Expression
Expression Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- BA-siemens-insight_lenum点
lenum点特性 lenum点有如下特点 如果状态字是自定义的,只能在bacnet / ip的aln层使用 如果想在ms/tp层使用lenum的功能,就必须将system profile中bacnet ...
- CF899A Splitting in Teams
CF899A Splitting in Teams 题意翻译 n个数,只有1,2,把它们任意分组,和为3的组最多多少 题目描述 There were nn groups of students whi ...
- jquery日历插件FullCalendar使用技巧
原文链接:http://blog.csdn.net/u013493957/article/details/44920341 FullCalendar是一款基于jquery的日历控件,它有着很强大的 ...
- Android开发之使用BroadcastReceiver实现开机自己主动启动(源码分享)
上一节已经介绍过BroadcastReceiver实现实时监听电量的功能,这节就来介绍一下假设实现开机自己主动启动的功能.这个比监听电量还简单不少 (1)在清单文件注冊权限 <uses-perm ...
- rails Installer之后的调整rails.bat等文件
rails Installer之后的调整rails.bat文件 出现系统找不到指定路径 学习了:http://www.jianshu.com/p/065355a731ee 修改rails.bat为 @ ...
- 一个简单的推断抢购时间是否到达的js函数
原型函数,功能非常easy,找到时钟的id,计算数值.到达抢购时间时运行任务. function nwt() {var str=$('#deal_expiry_timer_e3cdcd2a').tex ...
- cocos2dx3.2 android平台搭建开发环境纠错备忘录
平台:win32 + android cocos2d版本号:3.2 搭建cocos2d-x android 常见问题: 问题1: Android platform not specified, sea ...
- 根据EXCEL模板填充数据
string OutFileName = typeName+"重点源达标率" + DateTime.Now.ToString("yyyy-MM-dd"); ...
- Hua Wei 机试题目一
一.身份证号码验证 题目描述: 我国公民的身份证号码特点如下:1. 长度为18位:2. 第1-17位只能为数字:3. 第18位可以是数字或者小写英文字母x.4. 身份证号码的第7~14位表示持有人生日 ...