BZOJ 1061: [Noi2008]志愿者招募
1061: [Noi2008]志愿者招募
Time Limit: 20 Sec Memory Limit: 162 MB
Submit: 4064 Solved: 2476
[Submit][Status][Discuss]
Description
Input
Output
仅包含一个整数,表示你所设计的最优方案的总费用。
Sample Input
2 3 4
1 2 2
2 3 5
3 3 2
Sample Output
HINT
1 ≤ N ≤ 1000,1 ≤ M ≤ 10000,题目中其他所涉及的数据均 不超过2^31-1。
Source
分析:
%LYD...
这道题普遍做法貌似都是线性规划单纯形的做法,LYD告诉我们可以跑上下界最小费用可行流...
我们把每一天看成一个点,然后从i向i+1连边,上界为inf,下界为ai,费用为0...
然后对于每一类志愿者,从ti+1到si连边,上界为inf,下界为0,费用为ci...这样每花费ci的代价,就从si到ti增加一个流...
然后就转化成了无源汇上下界最小费用可行流,其实就是把无源汇上下界可行流的最大流转化成最小费用最大流...
怎么求无源汇上下界可行流?
如果把C-B作为容量上界,0作为容量下界,就是一般的网络流模型。
然而求出的实际流量为f(u,v)+B(u,v),不一定满足流量守恒,需要调整。
设inB[u]=∑B(i,u),outB[u]=∑B(u,i),d[u]=inB[u]-outB[u]。
新建源汇,S向d>0的点连边,d<0的点向汇点连边,容量为相应的d。 在该网络上求最大流,则每条边的流量+下界就是原网络的一个可行流。
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
//by NeighThorn
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f
using namespace std; const int maxn=+,maxm=+; int n,m,S,T,cnt,w[maxm],hd[maxn],fl[maxm],to[maxm],nxt[maxm],Min[maxn],vis[maxn],from[maxn]; long long dis[maxn],dif[maxn]; inline bool spfa(void){
for(int i=S;i<=T;i++)
dis[i]=INF,Min[i]=inf;
queue<int> q;q.push(S),vis[S]=,dis[S]=;
while(!q.empty()){
int top=q.front();q.pop();vis[top]=;
for(int i=hd[top];i!=-;i=nxt[i])
if(dis[to[i]]>dis[top]+w[i]&&fl[i]){
from[to[i]]=i;
dis[to[i]]=dis[top]+w[i];
Min[to[i]]=min(Min[top],fl[i]);
if(!vis[to[i]])
vis[to[i]]=,q.push(to[i]);
}
}
return dis[T]!=INF;
} inline long long find(void){
for(int i=T;i!=S;i=to[from[i]^])
fl[from[i]]-=Min[T],fl[from[i]^]+=Min[T];
return dis[T]*Min[T];
} inline int dinic(void){
int res=;
while(spfa())
res+=find();
return res;
} inline void add(int l,int s,int x,int y){
w[cnt]=l;fl[cnt]=s;to[cnt]=y;nxt[cnt]=hd[x];hd[x]=cnt++;
w[cnt]=-l;fl[cnt]=;to[cnt]=x;nxt[cnt]=hd[y];hd[y]=cnt++;
} signed main(void){
// freopen("in.txt","r",stdin);
memset(hd,-,sizeof(hd));
scanf("%d%d",&n,&m);S=,T=n+;
for(int i=,y;i<=n;i++)
scanf("%d",&y),add(,inf,i,i+),dif[i]-=y,dif[i+]+=y;
for(int i=,s,x,y;i<=m;i++)
scanf("%d%d%d",&x,&y,&s),add(s,inf,y+,x);
for(int i=;i<=n+;i++){
if(dif[i]>)
add(,dif[i],S,i);
else if(dif[i]<)
add(,-dif[i],i,T);
}
printf("%d\n",dinic());
return ;
}
By NeighThorn
BZOJ 1061: [Noi2008]志愿者招募的更多相关文章
- BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3975 Solved: 2421[Submit][Stat ...
- BZOJ 1061: [Noi2008]志愿者招募 费用流
1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...
- BZOJ 1061: [Noi2008]志愿者招募【单纯形裸题】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 4813 Solved: 2877[Submit][Stat ...
- BZOJ 1061: [Noi2008]志愿者招募 [单纯形法]【学习笔记看另一篇吧】
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MBSubmit: 3975 Solved: 2421[Submit][Stat ...
- BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)
题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...
- BZOJ 1061: [Noi2008]志愿者招募(线性规划与网络流)
http://www.lydsy.com/JudgeOnline/problem.php?id=1061 题意: 思路: 直接放上大神的建模过程!!!(https://www.byvoid.com/z ...
- 【刷题】BZOJ 1061 [Noi2008]志愿者招募
Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...
- BZOJ 1061 [Noi2008]志愿者招募(费用流)
题目描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i ...
- bzoj 1061 [Noi2008]志愿者招募(数学模型,MCMF)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1061 [题意] 雇人满足每天至少需要的人数. [思路一] Byvoid的题解 clic ...
随机推荐
- NodeJs对Mysql封装
之前在学习NodeJs的时候,每次操作数据库都需要连接数据库然后开始写Sql操作,这样非常麻烦,然后自己对Mysql进行了封装,一共100多行代码. github地址: Mysql操作 我在里面对My ...
- word2vec 中的数学原理详解
word2vec 是 Google 于 2013 年开源推出的一个用于获取 word vector 的工具包,它简单.高效,因此引起了很多人的关注.由于 word2vec 的作者 Tomas Miko ...
- 自己封装的一个原生JS拖动方法。
代码: function drag(t,p){ var point = p || null, target = t || null, resultX = 0, resultY = 0; (!point ...
- react-native学习笔记--史上最详细Windows版本搭建安装React Native环境配置
参考:http://www.lcode.org/react-native/ React native中文网:http://reactnative.cn/docs/0.23/android-setup. ...
- FunDA(1)- Query Result Row:强类型Query结果行
FunDA的特点之一是以数据流方式提供逐行数据操作支持.这项功能解决了FRM如Slick数据操作以SQL批次模式为主所产生的问题.为了实现安全高效的数据行操作,我们必须把FRM产生的Query结果集转 ...
- GOF23设计模式之工厂模式
-实现了创建者和调用者的分离 -面向对象设计的基本原则: ·OCP(开闭原则,Open-Closed Principle):一个软件的实体应当对扩展开放,对修改关闭 ·DIP(依赖倒转原则,Depen ...
- 【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(前言)
一直希望能够搭建一个完整的,基础Web框架,方便日后接一些外快的时候,能够省时省力,终于花了一周的时间,把这个东西搞定了.特此写下此博客,一来是纪念,二来是希望能够为别人提供方便.顺带说一下,恩,组合 ...
- 初识Spring框架实现IOC和DI(依赖注入)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的, IoC是 ...
- Canvas的width,height 和 样式中Canvas的width,height
控制Canvas的大小,有两种方式: 1:直接设置Canvas标签上的书width,height属性值; 2:通过Css设置Canvas的width,height; 这两种方式,区别是很大的. 1:C ...
- jQuery选择器笔记
1.$(this).hide() - 隐藏当前元素 $("p").hide() - 隐藏所有段落 $(".test").hide() - 隐藏所有 class= ...