神奇的建图:连接(s,1,inf,0)(n+1,t,inf,0),对于1~n连接(i,i+1,inf-a[i],0),对于每个志愿者(s,t,c),连接(s,t+1,inf,c)。
因为从s开始的流是inf的,到t的也是inf,但是每个点的流量少它所需要的志愿者数量那么多,所以少的流量需要用带权的志愿者边来补上。至于多出来的人可以直接顺着免费边流过去。

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1000005,inf=1e9;
int n,m,h[N],cnt=1,dis[N],fr[N],ans,s,t,a[1005],c[1005];
bool v[N];
struct qwe
{int ne,no,to,va,c;
}e[N<<2];
int read()
{int r=0,f=1;char p=getchar();while(p>'9'||p<'0'){if(p=='-')f=-1;p=getchar();}while(p>='0'&&p<='9'){r=r*10+p-48;p=getchar();}return r*f;
}
void add(int u,int v,int w,int c)
{cnt++;e[cnt].ne=h[u];e[cnt].no=u;e[cnt].to=v;e[cnt].va=w;e[cnt].c=c;h[u]=cnt;
}
void ins(int u,int v,int w,int c)
{//cout<<u<<" "<<v<<" "<<w<<endl;add(u,v,w,c);add(v,u,0,-c);
}
bool spfa()
{queue<int>q;for(int i=s;i<=t;i++)dis[i]=inf;dis[s]=0;v[s]=1;q.push(s);while(!q.empty()){int u=q.front();q.pop();v[u]=0;for(int i=h[u];i;i=e[i].ne)if(e[i].va>0&&dis[e[i].to]>dis[u]+e[i].c){dis[e[i].to]=dis[u]+e[i].c;fr[e[i].to]=i;if(!v[e[i].to]){v[e[i].to]=1;q.push(e[i].to);}}}return dis[t]!=inf;
}
void mcf()
{//cout<<"OK"<<endl;int x=inf;for(int i=fr[t];i;i=fr[e[i].no])x=min(x,e[i].va);for(int i=fr[t];i;i=fr[e[i].no]){e[i].va-=x;e[i^1].va+=x;ans+=x*e[i].c;}
}
int main()
{n=read(),m=read();s=0,t=n+2;for(int i=1;i<=n;i++){int x=read();ins(i,i+1,inf-x,0);}ins(s,1,inf,0);ins(n+1,t,inf,0);for(int i=1;i<=m;i++){int x=read(),y=read(),z=read();ins(x,y+1,inf,z);}while(spfa())mcf();printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/lokiii/p/8443613.html

bzoj 1061: [Noi2008]志愿者招募【最小费用最大流】相关推荐

  1. BZOJ 1061: [Noi2008]志愿者招募 最小费用最大流

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

  2. [BZOJ1061] [NOI2008] 志愿者招募 - 最小费用最大流

    大部分内容转自: BYVOID - NOI2008 志愿者招募  如果讲道理的话,就是说我们抽象一下这个模型--然后每条费用边就是连接起始日期和结束日期的边,也就是说这条边上的流量增加1,就要增加一个 ...

  3. 洛谷 - P3980 [NOI2008]志愿者招募(最小费用最大流+思维建边)

    题目链接:点击查看 题目大意:现在有n天需要志愿者,每一天需要招募的人数是Ai个人,现在有m类志愿者,每类志愿者可以在[l,r]天内被招募,需要花费的代价为Ci,现在需要安排一种招募方式,可以使得总花 ...

  4. 单纯型法Ⅱ(bzoj 1061: [Noi2008]志愿者招募)

    线性规划单纯型法:http://blog.csdn.net/jaihk662/article/details/78050666 标准型:m个约束,n个变量,构成m*n的矩阵 C是一个n的向量,B是一个 ...

  5. [NOI2008] 志愿者招募 (费用流)

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

  6. BZOJ 1221: [HNOI2001] 软件开发(最小费用最大流)

    不知道为什么这么慢.... 费用流,拆点.... --------------------------------------------------------------------------- ...

  7. bzoj 1070: [SCOI2007]修车【最小费用最大流】

    一开始从客人角度想的,怎么建都不对 从一个修车工所接待的所有顾客花费的总时间来看,设一共有x个人,那么第一个修的对总时间的贡献是x*w1,第二个是(x-1)*w2-以此类推.所以把第i个修车工拆成n组 ...

  8. 【BZOJ】1061: [Noi2008]志愿者招募

    题解 可能是世界上最裸的一个单纯形 (话说全幺模矩阵是啥我到现在都不知道) 假装我们已经看过了算导,或者xxx的论文,知道了单纯形是怎么实现的 扔一个blog走掉..https://www.cnblo ...

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

    Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...

最新文章

  1. 关于本分类(codeforces-好题系列)
  2. PaaS下半场,任重且道远
  3. 【转】简述configure、pkg-config、pkg_config_path三者的关系
  4. HTML 5 样式指南和代码约定
  5. python分布式爬虫系统_如何构建一个分布式爬虫:理论篇
  6. kafka重复消费问题
  7. 柔性体没有应变_灌注式半柔性道面材料抗冲击性能试验研究
  8. 织梦使用if判断某个字段是否为空
  9. CentOS+Nginx+Supervisor部署ASP.NET Core项目
  10. 没有编辑器时,使用echo更换源
  11. 人脸识别Python教学
  12. sklearn实战之构建SVM多分类器
  13. 我国芯片各细分领域龙头名单
  14. IDC评述网:2012年国外域名主机服务商TOP10
  15. 库克将在斯坦福大学2019年毕业典礼上发表演讲:6月16日举行
  16. 面对复杂问题时,系统思考助你理解问题本质
  17. java 文件加密_一个JAVA文件加密代码
  18. 【复杂网络建模】——通过图神经网络来建模分析复杂网络
  19. 移动通信电磁辐射(转)
  20. 电脑无法显示移动硬盘文件内容的解决方法

热门文章

  1. 防雪崩利器:熔断器 Hystrix 的原理与使用
  2. Akka Cluster原理与应用
  3. Python函数01/函数的初识/函数的定义/函数调用/函数的返回值/函数的参数
  4. 如何使用AWS和Azure的配置存储服务保存读取配置
  5. 2018.10.26 NOIP模拟 瓶子 (dp/贪心)
  6. 中文 iOS/Mac 开发博客列表
  7. LAMP:用yum安装
  8. WordPress 多个安全漏洞
  9. 生成各种统计图的C#方法
  10. JBoss4.2.3部署SSH2