P3980 [NOI2008]志愿者招募
思路
巧妙的建图
因为每个志愿者有工作的时段,所以考虑让一个志愿者的流量能够从S流到T产生贡献
所以每个i向i+1连INF-a[x]的边(类似于k可重区间集),每个si向ti连边cap=INF,cost=ci的边
相当于就是最大流要补全到INF,然后这个边的边权少了a[x],然后为了补全到INF,并且前面还有一个能从s向t能走的边可以通过流量(相当于加一个人),然后最大流就会补上这部分流量
然后MCMF就好了
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
struct Edge{
int u,v,cap,cost,flow;
};
const int MAXN = 50000;
const int INF = 0x3f3f3f3f;
vector<Edge> edges;
vector<int> G[MAXN];
void addedge(int u,int v,int cap,int cost){
edges.push_back((Edge){u,v,cap,cost,0});
edges.push_back((Edge){v,u,0,-cost,0});
int cnt=edges.size();
G[u].push_back(cnt-2);
G[v].push_back(cnt-1);
}
int d[MAXN],a[MAXN],p[MAXN],s,t,vis[MAXN],n,m;
queue<int> q;
bool spfa(int &flow,int &cost){
memset(d,0x3f,sizeof(d));
memset(p,0,sizeof(p));
q.push(s);
a[s]=INF;
d[s]=0;
vis[s]=true;
while(!q.empty()){
int x=q.front();
q.pop();
vis[x]=false;
for(int i=0;i<G[x].size();i++){
Edge &e = edges[G[x][i]];
if(e.cap>e.flow&&d[x]+e.cost<d[e.v]){
d[e.v]=d[x]+e.cost;
a[e.v]=min(a[x],e.cap-e.flow);
p[e.v]=G[x][i];
if(!vis[e.v]){
vis[e.v]=true;
q.push(e.v);
}
}
}
}
if(d[t]==INF)
return false;
flow+=a[t];
cost+=a[t]*d[t];
for(int i=t;i!=s;i=edges[p[i]].u){
edges[p[i]].flow+=a[t];
edges[p[i]^1].flow-=a[t];
}
return true;
}
void mcmf(int &flow,int &cost){
flow=0,cost=0;
while(spfa(flow,cost));
}
int main(){
scanf("%d %d",&n,&m);
s=MAXN-2;
t=MAXN-3;
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
addedge(i,i+1,INF-x,0);
}
for(int i=1;i<=m;i++){
int sx,tx,cx;
scanf("%d %d %d",&sx,&tx,&cx);
addedge(sx,tx+1,INF,cx);
}
addedge(s,1,INF,0);
addedge(n+1,t,INF,0);
int cost,flow;
mcmf(flow,cost);
printf("%d\n",cost);
return 0;
}
P3980 [NOI2008]志愿者招募的更多相关文章
- 【洛谷】P3980 [NOI2008]志愿者招募
[洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...
- P3980 [NOI2008]志愿者招募 费用流 (人有多大胆地有多大产
https://www.luogu.org/problemnew/show/P3980 感觉费用流比网络流的图更难想到,要更大胆.首先由于日期是连续的,所以图中的点是横向排列的. 这道题有点绕道走的意 ...
- 洛谷P3980 [NOI2008]志愿者招募
题解 最小费用最大流 每一天是一条边\((inf-a[i], 0)\) 然后对于一类志愿者, 区间两端连一条\((inf, c[i])\) \(S\)向第一个点连\((inf, 0)\) 最后一个点向 ...
- luogu P3980 [NOI2008]志愿者招募
传送门 网络流又一神仙套路应用 首先考虑列不等式,设\(x_i\)为第i种人的个数,记\(b_{i,j}\)为第i种人第j天是否能工作,那么可以列出n个不等式,第j个为\(\sum_{i=1}^{m} ...
- P3980 [NOI2008]志愿者招募 (费用流)
题意:最多1000天 每天需要至少ai个工人施工 有10000种工人可以雇佣 每种工人可以工作si到ti天 雇佣一个的花费是ci 问怎样安排使得施工花费最少 思考:最直白的建模方式 就是每种工人可以和 ...
- 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 ...
- [BZOJ1061][Noi2008]志愿者招募
[BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...
- BZOJ 1061: [Noi2008]志愿者招募 费用流
1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...
随机推荐
- meta twitter 属性
总结下国际范儿的meta标签 <meta name="A game made to inspire developers to use GSAP, ES6 and Flexbox&qu ...
- poj2417 Baby-StepGiant-StepAlgorithm a^x=b%P
#include <iostream> #include <algorithm> #include <string.h> #include <cstdio&g ...
- 20155228 2016-2017-2 《Java程序设计》第6周学习总结
20155228 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 输入与输出 在Java中输入串流代表对象为java.io.InputStream实例,输出串 ...
- android studio 自动导入包
android studio 自动导入包 一.Android studio 的导单个包的快捷键是Alt+Enter (需要选中要导入包的类名再按快捷键才起作用): 二.Android studio 可 ...
- html 基本布局介绍
1.div默认是纵向排列的,例子如下: <div id="wrap"> <div id="div1">div1</div> ...
- [转载]oracle函数listagg的使用说明
工作中经常遇到很多需求是这样的,根据条件汇总某些字段,比如我遇到的是,我们公司有三个投资平台,同一个客户拿手机号在三个平台都注册了,但注册过的用户名不一样,显示的时候需要根据手机号显示所有注册过的名称 ...
- linux grep 正则表达式
grep正则表达式元字符集: ^ 锚定行的开始 如:'^grep'匹配所有以grep开头的行. $ 锚定行的结束 如:'grep$'匹配所有以grep结尾的行. . 匹配一个非换行符的字符 如:'gr ...
- Python进阶【第五篇】函数式编程及某些特殊函数
一.函数式编程——Functional Programming 函数式=编程语言定义的函数+数学意义的函数 在计算机的层次上,CPU执行的是加减乘除的指令代码,以及各种条件判断和跳转指令,所以,汇编语 ...
- 设置PhoenixOS进入图形界面
phoenix操作系统很淡疼的一点就是每次启动都进入命令行界面,而且要想进入图形界面,每次都得配置. 开启虚拟机后,会出现引导界面,在虚拟机中连按2次“E”键进行编辑 输入参数“空格nomodeset ...
- spring @Value注解#和$区别
一直以来,在使用@Value注解的时候,都是使用#的风格@Value("#{topic.topicName}"),但是也经常会看到@Value("${topic.topi ...