题解

非常显然的费用流。 但是建图还是需要思考的QuQ

将每天分成两个节点 $x_{i,1}, x_{i,2} $, $ x_{i,1}$用于提供服务, $x_{i ,2}$ 用来从源点获得$nd[i] $个毛巾进行消毒(因为$x_{i ,1} $已经流向汇点)。

1、 源点向$x_{i,1} $连容量为$inf$, 费用为$f$ 的边, 表示给买毛巾。

2、 $x_{i, 1}$向汇点连容量为$nd[ i ]$ , 费用为$0 $的边, 表示提供服务

3、$x_{i, 1}$ 向$x_{i + 1, 1}$ 连容量为$inf$, 费用为$0$ 的边, 表示毛巾存到下一天用

4、 源点向$x_{i, 2}$连容量为$nd[ i ]$, 费用为$0 $的边, 表示用过的毛巾拿去清洗

5、$x_{i , 2 }$ 向 $x_{i + a + 1, 1}$连容量为$inf$, 费用为$fa$ 的边, 表示通过方式$a$清洗

6、同理5

然后跑费用流, 就可以把题秒啦

代码

  1. #include<cstring>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<queue>
  5. #define rd read()
  6. #define rep(i,a,b) for(int i = (a); i <= (b); ++i)
  7. using namespace std;
  8.  
  9. const int N = 1e4;
  10. const int inf = ;
  11.  
  12. int n, dis[N], pre[N], vis[N], a, b, f, fa, fb, nd[N];
  13. int head[N], tot, maxflow, minco;
  14. int S, T = N - ;
  15.  
  16. queue<int>q;
  17.  
  18. struct edge {
  19. int nxt, to, val, c;
  20. }e[N << ];
  21.  
  22. int read() {
  23. int X = , p = ; char c = getchar();
  24. for(; c > '' || c < ''; c = getchar()) if(c == '-') p = -;
  25. for(; c >= '' && c <= ''; c = getchar()) X = X * + c - '';
  26. return X * p;
  27. }
  28.  
  29. void added(int fr, int to, int val, int c) {
  30. e[++tot].to = to;
  31. e[tot].val = val;
  32. e[tot].c = c;
  33. e[tot].nxt = head[fr];
  34. head[fr] = tot;
  35. }
  36.  
  37. void add(int fr, int to, int val, int c) {
  38. added(fr, to, val ,c);
  39. added(to, fr, , -c);
  40. }
  41.  
  42. int ch(int x) {
  43. return ((x + ) ^ ) - ;
  44. }
  45.  
  46. int bfs() {
  47. memset(dis, , sizeof(dis));
  48. memset(vis, , sizeof(vis));
  49. memset(pre, , sizeof(pre));
  50. q.push(S);
  51. dis[S] = ;
  52. vis[S] = ;
  53. for(int u, nt; !q.empty(); ) {
  54. u = q.front(); q.pop();
  55. for(int i =head[u]; i; i = e[i].nxt) {
  56. nt = e[i].to;
  57. if(dis[nt] <= dis[u] + e[i].c || !e[i].val) continue;
  58. dis[nt] = dis[u] + e[i].c;
  59. pre[nt] = i;
  60. if(!vis[nt]) vis[nt] = , q.push(nt);
  61. }
  62. vis[u] = ;
  63. }
  64. return dis[T];
  65. }
  66.  
  67. void EK() {
  68. for(; bfs() != inf; ) {
  69. int tmp = inf;
  70. for(int i = pre[T]; i; i = pre[e[ch(i)].to]) tmp = min(tmp, e[i].val);
  71. for(int i = pre[T]; i; i = pre[e[ch(i)].to]) e[i].val -= tmp, e[ch(i)].val += tmp;
  72. maxflow += tmp;
  73. minco += tmp * dis[T];
  74. }
  75. }
  76.  
  77. int main()
  78. {
  79. n = rd; a = rd; b = rd; f = rd; fa = rd; fb = rd;
  80. rep(i, , n) nd[i] = rd;
  81. rep(i, , n) {
  82. add(S, i, inf, f);
  83. add(S, i + n, nd[i], );
  84. add(i, T, nd[i], );
  85. if(i < n) add(i, i + , inf, );
  86. if(i + a < n) add(i + n, i + a + , nd[i], fa);
  87. if(i + b < n) add(i + n, i + b + , nd[i], fb);
  88. }
  89. EK();
  90. printf("%d\n", minco);
  91. }

BZOJ1221 [HNOI2001]软件开发 - 费用流的更多相关文章

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

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

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

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

  3. BZOJ 1221 [HNOI2001] 软件开发 费用流_建模

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

  4. bzoj1221软件开发 费用流

    题目传送门 思路: 网络流拆点有的是“过程拆点”,有的是“状态拆点”,这道题应该就属于状态拆点. 每个点分需要用的,用完的. 对于需要用的,这些毛巾来自新买的和用过的毛巾进行消毒的,流向终点. 对于用 ...

  5. bzoj1221: [HNOI2001] 软件开发

    挖坑.我的那种建图方式应该也是合理的.然后连样例都过不了.果断意识到应该为神奇建图法... #include<cstdio> #include<cstring> #includ ...

  6. 【BZOJ1221】【HNOI2001】软件开发 [费用流]

    软件开发 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 某软件公司正在规划一项n天的软件开 ...

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

    几乎为“线性规划与网络流24题”中的餐巾问题. 这里把S看成毛巾的来源,T看成软件公司,我们的目的就是让每天的毛巾满足要求(边满流). 引用题解: [问题分析] 网络优化问题,用最小费用最大流解决. ...

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

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

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

    容易看出这是显然的费用流模型. 把每天需要的餐巾数作为限制.需要将天数拆点,x’表示每天需要的餐巾,x’’表示每天用完的餐巾.所以加边 (s,x',INF,0),(x'',t,INF,0). 餐巾可以 ...

随机推荐

  1. IDEA设置syso快捷键输出System.out.println();

    用Eclipse时间长了, 就习惯之前的快捷键! 当然, IDEA不愧是Java开发的”利器”! 写起代码就是一个字 – “爽”! 建议大家可以去尝试一下! 当然, 在IDEA中输出System.ou ...

  2. springTask任务调度

    1什么是任务调度 在企业级应用中,经常会制定一些“计划任务”,即在某个时间点做某件事情,核心是以时间为关注点,即在一个特定的时间点,系统执行指定的一个操作.常见的任务调度框架有Quartz和Sprin ...

  3. leetcode520

    public class Solution { public bool DetectCapitalUse(string word) { var length = word.Length; ) { ; ...

  4. DDoS攻防战 (二) :CC攻击工具实现与防御理论

    故上兵伐谋 其次伐交 其次伐兵 其下攻城 攻城之法 为不得已 知己知彼 百战不殆 不知彼而知己 一胜一负 不知彼不知己 每战必败 ——孙子兵法·谋攻 我们将要实现一个进行应用层DDoS攻击的工具,综合 ...

  5. input文本框 放上图片img 通过padding relative和absolute 的实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. React 简单介绍

    React 简单介绍 作者 RK_CODER 关注 2014.12.10 17:37* 字数 2516 阅读 55715评论 6喜欢 70 why React? React是Facebook开发的一款 ...

  7. DELL服务器iDRAC相关设置

    iDRAC又称为Integrated Dell Remote Access Controller,也就是集成戴尔远程控制卡 iDRAC卡相当于是附加在服务器上的一台小电脑,通过与服务器主板上的管理芯片 ...

  8. python中时间差中seconds和total_seconds

    在python中经常会用到计算两个时间差,两个日期类型进行相减可以获取到时间差 经常会使用seconds来获取,其实seconds获取的是时间差的秒数,遗漏了天 seconds是获取时间部分的差值,而 ...

  9. L2tp协议简单解析

    1.L2TP简介 L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是VPDN(Virtual PrivateDial-up Network,虚拟私有拨号网)隧道协议的一种 ...

  10. ubuntu 软件包系统已损坏 解决方法

    sudo apt-get clean sudo apt-get -f install sudo apt-get upgrade