题目

好神仙的题目啊啊啊啊啊

没什么思路,发现了题解里的一句\((i,i+1,0,inf-a_i)\)就有点懂了

我们可以考虑一下我们如果就按照上面的方式来连边我们的最大流是什么

显然是\(inf-max(a_i)\)

这显然取决于最小的那一条边的流量

但是我们如果想让最后的流量为\(inf\),就需要额外连一些边

一个区间我们连一条这样的边\((l,r+1,w,inf)\),也就是意味着如果这条边的流量选择为\(f\),那么\([l,r]\)区间的最小流量限制边就会变成\(inf-max(a_i-f)\),因为这 \(f\)的流量可以去走那条边了

而如果想让最后的流量变成\(inf\),显然需要\(max(a_i-f)=0\),这不就正好符合了我们的要求吗

于是就巧妙的解决了

代码

#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define LL long long
#define re register
#define inf 99999999
#define maxn 2005
inline int read() {char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n,m,S,T,num=1,ans;
struct E{int v,nxt,w,f;}e[200005];
int vis[maxn],head[maxn],d[maxn];
inline void add(int x,int y,int z,int ff) {e[++num].v=y;e[num].nxt=head[x];e[num].f=ff,e[num].w=z;head[x]=num;}
inline void C(int x,int y,int z,int ff) {add(x,y,z,ff),add(y,x,-1*z,0);}
inline int SPFA() {std::queue<int> q;for(re int i=S;i<=T;i++) vis[i]=0,d[i]=inf;d[T]=0,q.push(T);while(!q.empty()) {int k=q.front();q.pop();vis[k]=0;for(re int i=head[k];i;i=e[i].nxt) if(d[e[i].v]>d[k]+e[i^1].w&&e[i^1].f) {d[e[i].v]=d[k]+e[i^1].w;if(!vis[e[i].v]) q.push(e[i].v),vis[e[i].v]=1;}}return d[S]<inf;
}
int dfs(int x,int now) {if(x==T||!now) return now;int flow=0,ff;vis[x]=1;for(re int i=head[x];i;i=e[i].nxt) if(e[i].f&&!vis[e[i].v]&&d[x]+e[i^1].w==d[e[i].v]) {ff=dfs(e[i].v,min(now,e[i].f));if(ff<=0) continue;flow+=ff,now-=ff;e[i].f-=ff,e[i^1].f+=ff;if(!now) break;}return flow;
}
int main() {n=read(),m=read();int x,l,r;for(re int i=1;i<=n;i++) x=read(),C(i,i+1,0,inf-x);S=0,C(S,1,0,inf),C(n+1,n+2,0,inf),T=n+2;for(re int i=1;i<=m;i++) {l=read(),r=read(),x=read();C(l,r+1,x,inf);}while(SPFA()) {vis[T]=1;while(vis[T]) {for(re int i=S;i<=T;i++) vis[i]=0;ans+=dfs(S,inf)*d[S];}}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10456326.html

[NOI2008]志愿者招募相关推荐

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

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

  2. BZOJ1061: [Noi2008]志愿者招募

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  M ...

  3. 【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)

    1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 5291  Solved: 3173 [Submit][St ...

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

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

  5. 【BZOJ1061/3265】[Noi2008]志愿者招募/志愿者招募加强版 单纯形法

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

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

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

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

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

  8. BZOJ1061 [NOI2008]志愿者招募

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

  9. P3980 NOI2008志愿者招募

    志愿者招募 题目链接 https://www.luogu.org/problemnew/show/P3980 题解 这道题很神奇,这种建图方法很有启发性. 我们平时做的题都点都是是一对一的,而这道题的 ...

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

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

最新文章

  1. SpringMVC学习二
  2. R语言ggplot2地理信息可视化(下)
  3. Unicode 和 UTF-8关系
  4. Python Challenge-Level 1
  5. 调用Hybris API时遇到的错误消息Cannot find user with uid如何解决
  6. Git 企业开发者教程
  7. 20190423面试记录
  8. 并发高?可能是编译优化引发有序性问题
  9. python语音开发库-各种 Python 库/模块/工具
  10. 深度学习10-tf.data-数据输入管道简介
  11. win10更新过后导致某些字体被损坏
  12. Mac下载m3u8视频
  13. 再谈js拖拽(二)仿iGoogle自定义首页模块拖拽
  14. TF卡格式化8G格式化时候变成128KB的解决办法
  15. Android应用快捷方式
  16. 在Vue中如何缓存页面
  17. 3D动画制作太复杂?谷歌推出MonsterMash,绘画小白都能用
  18. 在 RedHat、 CentOS、 Fedora 上安装 Teamviewer 9(转)
  19. laravel entrust 权限管理
  20. 接口测试是什么?为什么要做接口测试?

热门文章

  1. 油管螺纹尺寸对照表_数控加工过程中,如何区分新旧螺纹牌号?
  2. 华为合作oppovivo小米鸿蒙,华为鸿蒙成功的关键:要让小米、OPPO、VIVO都用上鸿蒙...
  3. mysql date time类型_数据库datetime是什么类型
  4. 一棵树的生成树有几颗_次小生成树(树剖,生成树)
  5. java runtime.exec 阻塞_关于Runtime.getRuntime().exec()产生阻塞的2个陷阱
  6. 基于Pytorch再次解析AlexNet现代卷积神经网络
  7. python【蓝桥杯vip练习题库】ADV-235阶乘差
  8. php多维数组打印出最长的数组,将php中的多维数组打印到html表中
  9. java php aes加密解密_php aes 加密解密可与java对接
  10. 进阶学习(3.10) Adapter Pattern 适配器模式