1803 志愿者招募

2008年NOI全国竞赛

 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master
 
题目描述 Description

申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的 主管。布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志 愿者。经过估算,这个项目需要 N 天才能完成,其中第 i 天至少需要 Ai个人。 布布通过了解得知,一共有 M 类志愿者可以招募。其中第 i 类可以从第 Si天工 作到第 Ti 天,招募费用是每人 Ci元。新官上任三把火,为了出色地完成自己的 工作,布布希望用尽量少的费用招募足够的志愿者,但这并不是他的特长!于是 布布找到了你,希望你帮他设计一种最优的招募方案。

输入描述 Input Description

 

输入文件 employee.in 的第一行包含两个整数 N, M,表示完成项目的天数和 可以招募的志愿者的种类。 接下来的一行中包含 N 个非负整数,表示每天至少需要的志愿者人数。  接下来的 M 行中每行包含三个整数 Si, Ti, Ci,含义如上文所述。为了方便起 见,我们可以认为每类志愿者的数量都是无限多的。

输出描述 Output Description

输入文件 employee.out 中仅包含一个整数,表示你所设计的最优方案的总费用。

样例输入 Sample Input

3 3

2 3 4

1 2 2

2 3 5

3 3 2

样例输出 Sample Output

14

数据范围及提示 Data Size & Hint
 

【样例说明】

招募 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 志愿者招募的更多相关文章

  1. BZOJ 1061: [Noi2008]志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 4064  Solved: 2476[Submit][Stat ...

  2. BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3975  Solved: 2421[Submit][Stat ...

  3. BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模

    本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...

  4. [BZOJ1061][Noi2008]志愿者招募

    [BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...

  5. bzoj 1061 志愿者招募(最小费用最大流)

    [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3792  Solved: 2314[Submit][Status][Di ...

  6. 【BZOJ】【1061】【NOI2008】志愿者招募

    网络流/费用流 OrzOrzOrz,这题太神了不会捉. 题解:https://www.byvoid.com/blog/noi-2008-employee/ 这道题正确的解法是构造网络,求网络最小费用最 ...

  7. BZOJ 1061: [Noi2008]志愿者招募 费用流

    1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...

  8. bzoj1061: [Noi2008]志愿者招募

    线性规划与费用流.http://www.cnblogs.com/iiyiyi/p/5616080.html.数组范围开错了!!!然后2.31-1=0x7fffffff!=0x7f7f7f7f. 开始以 ...

  9. NOI2008 志愿者招募

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 1859  Solved: 1169[Submit][Stat ...

随机推荐

  1. C++ decltype类型说明符

    本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/50865552 1 基本语法 declt ...

  2. 接口(interface) 可以 new()吗???~

    比如 一个接口 A ,里面有一个方法fun1(),一般我们是先定义它的实现再引用它,比如 public class ImpA implements A{ public void fun1(){ //d ...

  3. C# try-catch-return

    正常执行try后才能执行finally,catch中的语句可能会影响finally的执行 使用 finally 块,可以清理在 Try 中分配的任何资源,而且,即使在 try 块中发生异常,您也可以运 ...

  4. ubuntu12.04安装翻译软件stardict及卸载

    下载: 1.打开软件中心.搜索stardict,星际译王,即ubuntu下的翻译软件. 点击下载就可以. 2.打开终端,输入 $sudo apt-get install stardict 按提示就可以 ...

  5. iOS 常见面试图总结2

    1.请简述storyboard和xib的差别? 一个project中.能够有多个xib文件,一个xib文件相应着一个视图类控制器,和多个视图. 然而.使用 storyboard时,一个project仅 ...

  6. python spark kmeans demo

    官方的demo from numpy import array from math import sqrt from pyspark import SparkContext from pyspark. ...

  7. jquery中命名冲突问题

    例如用jq代替$符号 var jq = $.noConflict()

  8. ROS-参数

    前言:参数的用法. 一.参数常用命令 命令 功能 rosparam list 参数列表 rosparam get 获取参数 rosparam set  设置参数 rosparam load 加载参数 ...

  9. Vue.js 2.x Development Build With Hot Reloading For External Server (using Webpack template)

    This article assuming you created your project using webpack template. vue init webpack <PROJECT_ ...

  10. ViewPager滑动到最后一页再向左滑动进入主界面

    在OnPageChangeListener中的onPageScrolled方法里判断 @Override public void onPageScrolled(int arg0, float arg1 ...