题目描述:
 
某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛巾,这种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要a天时间,B种方式的消毒需要b天(b>a),A种消毒方式的费用为每块毛巾fA, B种消毒方式的费用为每块毛巾fB,而买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用);而且f>fA>fB。公司经理正在规划在这n天中,每天买多少块新毛巾、每天送多少块毛巾进行A种消毒和每天送多少块毛巾进行B种消毒。当然,公司经理希望费用最低。你的任务就是:为该软件公司计划每天买多少块毛巾、每天多少块毛巾进行A种消毒和多少毛巾进行B种消毒,使公司在这项n天的软件开发中,提供毛巾服务的总费用最低。
 
 
题解:
十分巧妙的建模方式.
首先,设超级源点 $S$ 和超级汇点 $T$.
1、从 $S$ 向每个 $X_{i}$ 连一条容量为$r_{i}$,费用为 $0$ 的有向边.
2、从每个 $Y_{i}$ 向 $T$ 连一条容量为 $r_{i}$, 费用为 $0$ 的有向边.
3、从 $S$ 向每个 $Y_{i}$ 连一条容量为无穷大,费用为 $f$ 的有向边.
4、从每个 $X_{i}$ 向 $X_{i+1}$ $(i+1<=N)$ 连一条容量为无穷大,费用为 $0$ 的有向边.
5、从每个 $X_{i}$ 向 $Y_{i+a+1}$ $(i+a+1<=N)$连一条容量为无穷大,费用为 $f_{a}$的有向边.
6、从每个 $X_{i}$ 向 $Y_{i+b+1}$ $(i+b+1<=N)$ 连一条容量为无穷大,费用为 $f_{b}$ 的有向边.
 
上一个图片: 
 
 

观察上述建模方式与“形象化”图片,我们发现我们构建的网络模型满足流出量与流入量守恒.

每个 $y_{i}$ 会由先前剩下的 $f_{a}$ 与 $f_{b}$ 填充,再由源点直接流入 $y_{i}$ 的 $f$ 所填入.

一个十分巧妙的网络流模型.

Code:

  1. #include <bits/stdc++.h>
  2. #define setIO(s) freopen(s".in","r",stdin)
  3. #define maxn 300000
  4. #define inf 1000000
  5. #define N 3005
  6. #define nex(n) (n + 1002)
  7. using namespace std;
  8. struct Edge
  9. {
  10. int from,to,cap,cost;
  11. Edge(int from = 0,int to = 0,int cap = 0,int cost = 0) : from(from),to(to),cap(cap),cost(cost){}
  12. };
  13. vector<Edge>edges;
  14. vector<int>G[maxn];
  15. void addedge(int u,int v,int c,int d)
  16. {
  17. edges.push_back(Edge(u,v,c,d));
  18. edges.push_back(Edge(v,u,0,-d));
  19. int m = edges.size();
  20. G[u].push_back(m - 2);
  21. G[v].push_back(m - 1);
  22. }
  23. int flow2[maxn],d[maxn],inq[N],pre[N],nn[N];
  24. int ans,s,t;
  25. queue <int> Q;
  26. int spfa()
  27. {
  28. for(int i = 0;i < N; ++i) d[i] = flow2[i] = inf;
  29. memset(inq,0,sizeof(inq));
  30. d[s] = 0, inq[s] = 1;
  31. Q.push(s);
  32. while(!Q.empty())
  33. {
  34. int u = Q.front(); Q.pop();
  35. inq[u] = 0;
  36. for(int sz = G[u].size(),i = 0; i < sz ; ++i)
  37. {
  38. Edge e = edges[G[u][i]];
  39. if(d[e.to] > d[u] + e.cost && e.cap > 0)
  40. {
  41. d[e.to] = d[u] + e.cost;
  42. flow2[e.to] = min(e.cap, flow2[u]);
  43. pre[e.to] = G[u][i];
  44. if(!inq[e.to])
  45. {
  46. Q.push(e.to);
  47. inq[e.to] = 1;
  48. }
  49. }
  50. }
  51. }
  52. if(flow2[t] == inf) return 0;
  53. int f = flow2[t];
  54. edges[pre[t]].cap -= f, edges[pre[t] ^ 1].cap += f;
  55. int u = edges[pre[t]].from;
  56. while(u != s)
  57. {
  58. edges[pre[u]].cap -= f, edges[pre[u] ^ 1].cap += f;
  59. u = edges[pre[u]].from;
  60. }
  61. ans += f * d[t];
  62. return 1;
  63. }
  64. int getcost()
  65. {
  66. while(spfa());
  67. return ans;
  68. }
  69. int main()
  70. {
  71. // setIO("input");
  72. int n,a,b,f,fa,fb;
  73. scanf("%d%d%d%d%d%d",&n,&a,&b,&f,&fa,&fb);
  74. for(int i = 1;i <= n; ++i) scanf("%d",&nn[i]);
  75. s = 0,t = 2500;
  76. for(int i = 1;i <= n; ++i)
  77. {
  78. addedge(s, i, nn[i], 0);
  79. addedge(nex(i), t, nn[i], 0);
  80. addedge(s, nex(i), inf, f);
  81. if(i + 1 <= n) addedge(i, i + 1, inf,0);
  82. }
  83. for(int i = 1;i <= n; ++i)
  84. {
  85. if(i + a + 1 <= n) addedge(i,nex(i + 1 + a),inf,fa);
  86. if(i + b + 1 <= n) addedge(i,nex(i + b + 1),inf,fb);
  87. }
  88. printf("%d",getcost());
  89. return 0;
  90. }

  

BZOJ 1221 [HNOI2001] 软件开发 费用流_建模的更多相关文章

  1. bzoj 1221 [HNOI2001] 软件开发 费用流

    [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1938  Solved: 1118[Submit][Status][D ...

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

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

  3. BZOJ 1221: [HNOI2001] 软件开发

    1221: [HNOI2001] 软件开发 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1428  Solved: 791[Submit][Stat ...

  4. BZOJ 3280: 小R的烦恼 & BZOJ 1221: [HNOI2001] 软件开发

    3280: 小R的烦恼 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 399  Solved: 200[Submit][Status][Discuss ...

  5. [BZOJ 1221] [HNOI2001] 软件开发 【费用流 || 三分】

    题目链接:BZOJ - 1221 题目分析 算法一:最小费用最大流 首先这是一道经典的网络流问题.每天建立两个节点,一个 i 表示使用毛巾,一个 i' 表示这天用过的毛巾. 然后 i 向 T 连 Ai ...

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

    Description 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员 ...

  7. 【bzoj1221】[HNOI2001] 软件开发 费用流

    题目描述 某软件公司正在规划一项n天的软件开发计划,根据开发计划第i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消 ...

  8. BZOJ1221 [HNOI2001]软件开发 - 费用流

    题解 非常显然的费用流. 但是建图还是需要思考的QuQ 将每天分成两个节点 $x_{i,1}, x_{i,2} $, $ x_{i,1}$用于提供服务, $x_{i ,2}$ 用来从源点获得$nd[i ...

  9. BZOJ 1221 [HNOI2001] 软件开发(费用流)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1221 [题目大意] 每天对毛巾都有一定的需求ni,每天可以花f价值每条购买毛巾, 当天 ...

随机推荐

  1. Python 实现 Excel 里单元格的读写与清空操作

    #coding=utf-8 # coding=utf-8 作用是声明python代码的文本格式是utf-8,python按照utf-8的方式来读取程序. # 如果不加这个声明,无论代码中还是注释中有中 ...

  2. Docker 搭建 ELK 读取微服务项目的日志文件

    思路: 在docker搭建elasticsearch与kibana来展示日志,在微服务部署的机子上部署logstash来收集日志传到elasticsearch中,通过kibana来展示,logstas ...

  3. VirtualBox没有权限访问共享文件夹

    将用户添加至vboxsf组 命令: sudo adduser ly vboxsf 搞定!

  4. (20)Spring Boot Servlet【从零开始学Spring Boot】

    Web开发使用 Controller 基本上可以完成大部分需求,但是我们还可能会用到 Servlet.Filter.Listener.Interceptor 等等. 当使用Spring-Boot时,嵌 ...

  5. elasticsearch 权威指南聚合阅读笔记(七)

    count(1) select clssId,count(1) from student group by  classId { "size":0, "aggs" ...

  6. [bzoj3932][CQOI2015]任务查询系统_主席树

    任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...

  7. 万众创业,互联网+,WTO

    WTO的保护期,发展的非常繁荣.但大部分的资源都配置在了房地产这个支柱产业, 而被保护的行业小日子过得不错, 研发再投入?那是傻子才做的事情,别墅.豪车.美女.这才是生活. 但突然有一天,发现保护期要 ...

  8. windows XP下Python2.7包管理工具安装-setuptool,pip、distribute、nose、virtualenv

    在Python开发中为了对项目进行管理和调试.必须安装一些特定的软件包.据说业内这个叫做yak shaving-做一个非常酷非常绚丽的Python项目之前,必须做的一些枯燥无味的准备工作.本文介绍了s ...

  9. A. Music(Codeforces Round #315 (Div. 2) 求最大的容纳量)

    A. Music time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  10. pod install fatal: unable to access 'https://chromium.googlesource.com/webm/libwebp/'

    1. 前往文件夹 /用户/aki/.cocoapods/repos/master/1/9/2/libwebp 2.编辑libwebp.podspec.json 将source git 改为 https ...