传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1061

尽管不是mcmf的裸题,但还是保存一下模版叭~

很好的一道建模的题,把变量间的加加减减等效成网络中的流入流量与流出流量,再带上个权,求个最小费用就好,详细题解间此:https://www.byvoid.com/blog/noi-2008-employee/

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4.  
  5. const int maxn = 1010, maxm = 10005, maxe = 100000;
  6. const long long inf = 0x3c3c3c3c3c3c3c3cLL;
  7.  
  8. int n, m, a[maxn], s[maxm], t[maxm], cost[maxm], S, T;
  9. int head[maxn], to[maxe], next[maxe], from[maxe], lb;
  10. long long d[maxn], c[maxn], w[maxe], flow[maxe], cap[maxe];
  11. int p[maxn], que[maxn], head_, tail, h;
  12. bool inq[maxn];
  13.  
  14. inline bool spfa(long long & co) {
  15. memset(d, 0x3c, sizeof d);
  16. head_ = tail = 0;
  17. memset(inq, 0, sizeof inq);
  18. que[tail++] = S;
  19. inq[S] = 1;
  20. c[S] = inf;
  21. d[S] = 0;
  22. while (head_ != tail) {
  23. h = que[head_++];
  24. inq[h] = 0;
  25. if (head_ == T + 3) {
  26. head_ = 0;
  27. }
  28. for (int j = head[h]; j != -1; j = next[j]) {
  29. if (cap[j] > flow[j] && d[to[j]] > d[h] + w[j]) {
  30. d[to[j]] = d[h] + w[j];
  31. c[to[j]] = std::min(c[h], cap[j] - flow[j]);
  32. p[to[j]] = j;
  33. if (!inq[to[j]]) {
  34. que[tail++] = to[j];
  35. inq[to[j]] = 1;
  36. if (tail == T + 3) {
  37. tail = 0;
  38. }
  39. }
  40. }
  41. }
  42. }
  43. if (d[T] == inf) {
  44. return false;
  45. }
  46. co += d[T] * c[T];
  47. for (int i = T; i != S; i = from[p[i]]) {
  48. flow[p[i]] += c[T];
  49. flow[p[i] ^ 1] -= c[T];
  50. }
  51. return true;
  52. }
  53. inline long long mcmf(void) {
  54. long long co = 0;
  55. while (spfa(co));
  56. return co;
  57. }
  58.  
  59. inline void ist(int aa, int ss, long long ww, long long ca) {
  60. to[lb] = ss;
  61. from[lb] = aa;
  62. next[lb] = head[aa];
  63. head[aa] = lb;
  64. w[lb] = ww;
  65. cap[lb] = ca;
  66. ++lb;
  67.  
  68. to[lb] = aa;
  69. from[lb] = ss;
  70. next[lb] = head[ss];
  71. head[ss] = lb;
  72. w[lb] = -ww;
  73. cap[lb] = 0;
  74. ++lb;
  75. }
  76.  
  77. int main(void) {
  78. //freopen("in.txt", "r", stdin);
  79. memset(head, -1, sizeof head);
  80. memset(next, -1, sizeof next);
  81. scanf("%d%d", &n, &m);
  82. T = n + 2;
  83. for (int i = 1; i <= n; ++i) {
  84. scanf("%d", a + i);
  85. }
  86. for (int i = 1; i <= m; ++i) {
  87. scanf("%d%d%d", s + i, t + i, cost + i);
  88. }
  89.  
  90. for (int i = 1; i <= n + 1; ++i) {
  91. if (a[i - 1] - a[i] >= 0) {
  92. ist(S, i, 0, (long long)(a[i - 1] - a[i]));
  93. }
  94. else {
  95. ist(i, T, 0, (long long)(a[i] - a[i - 1]));
  96. }
  97. }
  98. for (int i = 1; i <= m; ++i) {
  99. ist(t[i] + 1, s[i], (long long)cost[i], inf);
  100. }
  101. for (int i = 1; i <= n; ++i) {
  102. ist(i, i + 1, 0, inf);
  103. }
  104. printf("%lld\n", mcmf());
  105. return 0;
  106. }

  

_bzoj1061 [Noi2008]志愿者招募【最小费用最大流】的更多相关文章

  1. bzoj 1061 志愿者招募(最小费用最大流)

    [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3792  Solved: 2314[Submit][Status][Di ...

  2. 【BZOJ】1061: [Noi2008]志愿者招募(费用流+数学)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1061 好神的一题! 学会了一种建模方式: 当方程组内的任意变量都在其中两个方程出现且一正一负,可以建 ...

  3. BZOJ 1061 [Noi2008]志愿者招募(费用流)

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

  4. NOI2008 志愿者招募 (费用流)

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

  5. [BZOJ1061][Noi2008]志愿者招募 线性规划+费用流

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 根据题意列方程,然后用网络流解线性规划. 题解直接贴ByVoid的吧,太神了:htt ...

  6. BZOJ-1061 志愿者招募 线性规划转最小费用最大流+数学模型 建模

    本来一眼建模,以为傻逼题,然后发现自己傻逼...根本没想到神奇的数学模型..... 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 ...

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

    1061: [Noi2008]志愿者招募 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1061 Description 申奥成功后,布布 ...

  8. 【费用流】NOI2008志愿者招募

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

  9. BZOJ 1061 志愿者招募(最小费用最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1061 题意:申奥成功后,布布经过不懈努力,终于 成为奥组委下属公司人力资源部门的主管.布 ...

随机推荐

  1. unity3d 摄像机抖动特效

    摄像机抖动特效 在须要的地方调用CameraShake.Shake()方法就能够  

  2. Tomcat-公布WEB应用

    1.定义Context 进入管理WEB应用的URL是http://localhost:8080/manager/html. username与password的设置:打开tomcat安装文件夹中的co ...

  3. Cts框架解析(6)-任务的运行

    前两篇讲了任务的加入和9大项配置,这篇讲任务的运行. 任务的运行 任务的运行在CommandScheduler的run方法中,所以删除全部的断点,在run方法中打上断点,重新启动启动debug: 先看 ...

  4. 网络知识: 物理层PHY 和 网络层MAC

    PHY模块简介 物理层位于OSI最底层,物理层协议定义电气信号.线的状态.时钟要求.数据编码和数据传输用的连接器. 物理层的器件称为PHY. 上图里的灰色方框图里的就是PHY芯片内部模块图. MAC器 ...

  5. 记一次Tomcat无法正常启动的查错与解决之路

    使用LombozEclipse运行某Web应用,结果总是404. 换另一个Eclipse运行,还是404. 换Tomcat到更高版本,还是404. 直接启动Tomcat,闪退. 用重定向拦截输出,可惜 ...

  6. java读取Excel表格中的数据

    1.需求 用java代码读取hello.xls表格中的数据 2.hello.xls表格 3.java代码 package com.test; import java.io.File; import j ...

  7. Spring嵌套事务控制

    A类   callBack_test() B类   testadd() C类   select(),得查询到B类testadd方法中新增的数据.以及初始化一些属性 场景:A类 嵌套 B类  B类嵌套C ...

  8. 【leetcode】Word Break(python)

    思路是这种.我们从第一个字符開始向后依次找,直到找到一个断句的地方,使得当前获得的子串在dict中,若找到最后都没找到.那么就是False了. 在找到第一个后,接下来找下一个断句处,当然是从第一个断句 ...

  9. asp.net编码解码的两篇文章

    http://www.cnblogs.com/freshman0216/p/4165949.html http://www.cnblogs.com/freshman0216/p/4172655.htm ...

  10. 识别jar的编译JDK版本

    解压jar,获取xxx.calss文件 dos命令行javap -verbose classname import java.io.InputStream; import java.io.PrintW ...