题解

最小费用最大流

每一天是一条边\((inf-a[i], 0)\)

然后对于一类志愿者,

区间两端连一条\((inf, c[i])\)

\(S\)向第一个点连\((inf, 0)\)

最后一个点向\(T\)连\((inf, 0)\)

然后跑最小费用最大流

这为什么是对的?

我们的目的变成用加的那些边,把最大流量填成\(inf\)

求最小费用

Code

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. using namespace std;
  5. template<class T> inline void read(T &x) {
  6. x = 0; RG char c = getchar(); bool f = 0;
  7. while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
  8. while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
  9. x = f ? -x : x;
  10. return ;
  11. }
  12. template<class T> inline void write(T x) {
  13. if (!x) {putchar(48);return ;}
  14. if (x < 0) x = -x, putchar('-');
  15. int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
  16. for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
  17. }
  18. const int N = 2010, inf = 2147483647;
  19. int a[N];
  20. struct node {
  21. int to, nxt, w, v;
  22. }g[2000000];
  23. int last[N], gl = 1;
  24. void add(int x, int y, int w, int v) {
  25. g[++gl] = (node) {y, last[x], w, v};
  26. last[x] = gl;
  27. g[++gl] = (node) {x, last[y], 0, -v};
  28. last[y] = gl;
  29. }
  30. int s, t;
  31. int dis[N], from[N], pre[N];
  32. bool vis[N];
  33. queue<int> q;
  34. bool spfa() {
  35. q.push(s);
  36. memset(dis, 127, sizeof(dis));
  37. dis[s] = 0;
  38. while (!q.empty()) {
  39. int u = q.front(); q.pop();
  40. for (int i = last[u]; i; i = g[i].nxt) {
  41. int v = g[i].to;
  42. if (dis[v] > dis[u] + g[i].v && g[i].w) {
  43. dis[v] = dis[u] + g[i].v;
  44. from[v] = i; pre[v] = u;
  45. if (!vis[v]) {
  46. vis[v] = 1;
  47. q.push(v);
  48. }
  49. }
  50. }
  51. vis[u] = 0;
  52. }
  53. return dis[0] != dis[t];
  54. }
  55. int McMf() {
  56. int ans = 0;
  57. while (spfa()) {
  58. int di = inf;
  59. for (int i = t; i != s; i = pre[i]) di = min(di, g[from[i]].w);
  60. ans += di * dis[t];
  61. for (int i = t; i != s; i = pre[i])
  62. g[from[i]].w -= di, g[from[i]^1].w += di;
  63. }
  64. return ans;
  65. }
  66. int main() {
  67. int n, m;
  68. read(n), read(m);
  69. for (int i = 1; i <= n; i++) read(a[i]);
  70. s = n + 2, t = s + 1;
  71. for (int i = 1; i <= n; i++)
  72. add(i, i+1, inf - a[i], 0);
  73. add(s, 1, inf, 0), add(n + 1, t, inf, 0);
  74. for (int i = 1; i <= m; i++) {
  75. int S, T, C;
  76. read(S), read(T), read(C);
  77. add(S, T+1, inf, C);
  78. }
  79. printf("%d\n", McMf());
  80. return 0;
  81. }

洛谷P3980 [NOI2008]志愿者招募的更多相关文章

  1. Solution -「NOI 2008」「洛谷 P3980」志愿者招募

    \(\mathcal{Description}\)   Link.   一项持续 \(n\) 天的任务,第 \(i\) 天需要至少 \(a_i\) 人工作.还有 \(m\) 种雇佣方式,第 \(i\) ...

  2. 【洛谷】P3980 [NOI2008]志愿者招募

    [洛谷]P3980 [NOI2008]志愿者招募 我居然现在才会用费用流解线性规划-- 当然这里解决的一类问题比较特殊 以式子作为点,变量作为边,然后要求就是变量在不同的式子里出现了两次,系数一次为+ ...

  3. P3980 [NOI2008]志愿者招募 费用流 (人有多大胆地有多大产

    https://www.luogu.org/problemnew/show/P3980 感觉费用流比网络流的图更难想到,要更大胆.首先由于日期是连续的,所以图中的点是横向排列的. 这道题有点绕道走的意 ...

  4. P3980 [NOI2008]志愿者招募

    思路 巧妙的建图 因为每个志愿者有工作的时段,所以考虑让一个志愿者的流量能够从S流到T产生贡献 所以每个i向i+1连INF-a[x]的边(类似于k可重区间集),每个si向ti连边cap=INF,cos ...

  5. luogu P3980 [NOI2008]志愿者招募

    传送门 网络流又一神仙套路应用 首先考虑列不等式,设\(x_i\)为第i种人的个数,记\(b_{i,j}\)为第i种人第j天是否能工作,那么可以列出n个不等式,第j个为\(\sum_{i=1}^{m} ...

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

    题意:最多1000天 每天需要至少ai个工人施工 有10000种工人可以雇佣 每种工人可以工作si到ti天 雇佣一个的花费是ci 问怎样安排使得施工花费最少 思考:最直白的建模方式 就是每种工人可以和 ...

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

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

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

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

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

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

随机推荐

  1. Java 设计模式系列(五)原型模式

    Java 设计模式系列(五)原型模式 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 一.原型模 ...

  2. facebook对xtrabackup的优化整理

    1)Adding xtrabackup files https://github.com/facebook/mysql-5.6/commit/6eb74f86e27410f1ad7bf3379ce15 ...

  3. C语言条件编译及编译预处理阶段(转)

    一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的 ...

  4. 不要怂,就是GAN (生成式对抗网络) (五):无约束条件的 GAN 代码与网络的 Graph

    GAN 这个领域发展太快,日新月异,各种 GAN 层出不穷,前几天看到一篇关于 Wasserstein GAN 的文章,讲的很好,在此把它分享出来一起学习:https://zhuanlan.zhihu ...

  5. 利用NotePad++ 格式化代码(格式标准化) worldsing

    在阅读别人的代码时往往会遇到格式很乱,阅读起来很费劲,如果手动改很容易出错,而且很费时间,这时可以借助一些专业的编辑器来格式化代码,NotePad++是一个轻量级的代码编辑器,占用内存少,运行速度快, ...

  6. 07Mendel's First Law

    Problem Figure 2. The probability of any outcome (leaf) in a probability tree diagram is given by th ...

  7. openstack网络管理命令

    1.获取网络列表 [root@cc ~(keystone_admin)]# neutron net-list +--------------------------------------+----- ...

  8. [转]分布式中使用Redis实现Session共享(二)

    本文转自:http://www.cnblogs.com/yanweidie/p/4678095.html 上一篇介绍了一些redis的安装及使用步骤,本篇开始将介绍redis的实际应用场景,先从最常见 ...

  9. [ThinkPHP] 比较标签 neq&nheq 与 PHP 中的 != 与 !== 出现的问题

    1. 模板 > 内置标签 > 比较标签 控制器: $_data['list'] = [ 'dingo' , 'engo' , 'fengo' , 'gingo' , 'autoFill'= ...

  10. 传智播客.NET视频学习课件

    传智播客.NET视频学习课件访问.NET网站了解更多课程详情http://net.itcast.cn(小提示:为什么本书中超链接打不开?)此套课件是伴随 传智播客.net实况教学视频 (小提示:为什么 ...