http://www.lydsy.com/JudgeOnline/problem.php?id=1221

先吐槽一下,数组依旧开小了RE;在spfa中用了memset和<queue>的版本TE;自己写的循环队列没有>2000我只是写的是==2000 WA。T_T_T_T_T_T_T_T呜呜呜呜呜~~

坑坑坑坑坑。

说一下做法吧:

将每天拆成2个点,xi和yi,xi表示当天用完的,yi表示当天需要的,那么很容易看出xi>=当天人数,yi==当天人数

一开始我觉得一定是上下界的。。。(这东西太神奇,不会做),后来看了题解发现下界巧妙的转化了。。。待会说。

首先建图:

从源连一条弧到yi,容量为oo,费用为f,表示每天需要的都能够通过买来补给。

从xi连一条弧到xi+1,容量为oo,费用为0,表示当天用完的不做处理,可以留到第二天。(注意边界

从xi连一条弧到yi+a,容量为oo,费用为fa,表示当天用完的(包括之前没有处理的传上来的)的一些或全部进行A消毒,并且提供给第i+a天。(注意边界)

从xi连一条弧到yi+b,容量为oo,费用为fb,表示当天用完的(包括之前没有处理的传上来的)的一些或全部进行B消毒,并且提供给第i+b天。(注意边界)

从源连一条弧到xi,容量为当天人数,费用为0,表示当天用完的一些毛巾或者全部毛巾丢给xi(因为可能在当天将毛巾丢掉了,即后面一条弧的含义)

从yi连一条弧到汇,容量为当天人数,费用为0,表示当天用完的一些毛巾或者全部毛巾全部丢掉。。

然后跑一次最小费用最大流即可,(zkw费用流有必要学啊,,spfa太慢了。。。)

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. #define CC(a, b) memset(a, b, sizeof(a))
  5. #define min(a,b) ((a)<(b)?(a):(b))
  6. const int N=2100, M=1000001, oo=1000000000;
  7. int ihead[N], inext[M], from[M], to[M], cap[M], cost[M], cnt=1;
  8. int d[N], p[N];
  9. bool vis[N];
  10. int q[N], front, tail;
  11.  
  12. void add(int u, int v, int c, int m) {
  13. inext[++cnt]=ihead[u]; ihead[u]=cnt; from[cnt]=u; to[cnt]=v; cap[cnt]=c; cost[cnt]=m;
  14. inext[++cnt]=ihead[v]; ihead[v]=cnt; from[cnt]=v; to[cnt]=u; cap[cnt]=0; cost[cnt]=-m;
  15. }
  16.  
  17. bool spfa(const int &s, const int &t, const int &n) {
  18. int i, u;
  19. for(i=0; i<=n; ++i) d[i]=oo, vis[i]=0;
  20. d[s]=front=tail=0; vis[s]=1;
  21. q[tail++]=s;
  22. while(front!=tail) {
  23. u=q[front++]; if(front==2001) front=0;
  24. for(i=ihead[u]; i; i=inext[i]) if(cap[i] && d[to[i]]>d[u]+cost[i]) {
  25. d[to[i]]=d[u]+cost[i];
  26. p[to[i]]=i;
  27. if(!vis[to[i]]) {
  28. vis[to[i]]=1;
  29. q[tail++]=to[i]; if(tail==2001) tail=0;
  30. }
  31. }
  32. vis[u]=0;
  33. }
  34. return d[t]!=oo;
  35. }
  36.  
  37. int mincost(const int &s, const int &t, const int &n) {
  38. int ret=0, f, u;
  39. while(spfa(s, t, n)) {
  40. for(f=oo, u=t; u!=s; u=from[p[u]]) f=min(f, cap[p[u]]);
  41. for(u=t; u!=s; u=from[p[u]]) cap[p[u]]-=f, cap[p[u]^1]+=f;
  42. ret+=d[t]*f;
  43. }
  44. return ret;
  45. }
  46.  
  47. int main() {
  48. int n, a, b, f, fa, fb, i, r;
  49. scanf("%d%d%d%d%d%d", &n, &a, &b, &f, &fa, &fb);
  50. int s=0, t=(n<<1)+1;
  51. for(i=1; i<=n; ++i) {
  52. if(i+1<=n) add(i, i+1, oo, 0);
  53. if(i+a+1<=n) add(i, n+i+a+1, oo, fa);
  54. if(i+b+1<=n) add(i, n+i+b+1, oo, fb);
  55. add(0, n+i, oo, f);
  56. }
  57. for(i=1; i<=n; ++i) {
  58. scanf("%d", &r);
  59. add(s, i, r, 0);
  60. add(n+i, t, r, 0);
  61. }
  62. printf("%d\n", mincost(s, t, t+1));
  63. return 0;
  64. }

Description

某软件公司正在规划一项n天的软件开发计划,根据开发计划第 i天需要ni个软件开发人员,为了提高软件开发人员的效率,公司给软件人员提供了很多的服务,其中一项服务就是要为每个开发人员每天提供一块消毒毛巾,这 种消毒毛巾使用一天后必须再做消毒处理后才能使用。消毒方式有两种,A种方式的消毒需要a天时间,B种方式的消毒需要b天(b>a),A种消毒方式 的费用为每块毛巾fA, B种消毒方式的费用为每块毛巾fB,而买一块新毛巾的费用为f(新毛巾是已消毒的,当天可以使用);而且f>fA>fB。公司经理正在规划在 这n天中,每天买多少块新毛巾、每天送多少块毛巾进行A种消毒和每天送多少块毛巾进行B种消毒。当然,公司经理希望费用最低。你的任务就是:为该软件公司 计划每天买多少块毛巾、每天多少块毛巾进行A种消毒和多少毛巾进行B种消毒,使公司在这项n天的软件开发中,提供毛巾服务的总费用最低。

Input

第1行为n,a,b,f,fA,fB. 第2行为n1,n2,……,nn. (注:1≤f,fA,fB≤60,1≤n≤1000)

Output

最少费用

Sample Input

4 1 2 3 2 1
8 2 1 6

Sample Output

38

HINT

Source

【BZOJ】1221: [HNOI2001] 软件开发(最小费用最大流)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 1221. [HNOI2001]软件开发【费用流】

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

  10. bzoj 1221: [HNOI2001] 软件开发 (网络流)

    注意说如果直接从每天的新的连向旧的,那整个图的最大流还是不变,答案就一直会是Σni*f type arr=record toward,next,cap,cost:longint; end; const ...

随机推荐

  1. HDU 2897

    Problem Description 当日遇到月,于是有了明.当我遇到了你,便成了侣. 那天,日月相会,我见到了你.而且,大地失去了光辉,你我是否成侣?这注定是个凄美的故事.(以上是废话) 小t和所 ...

  2. Spring事务传播、隔离等级

    事务传播 PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中.这是最常见的选择. PROPAGATION_SUPPORTS 支持当前事 ...

  3. encode与decode,unicode与中文乱码的问题

    encode是指将unicode字符编码成其他字符集的字符,如utf-8,ascii等: 而decode是指将其他字符编码,如utf-8转换成unicode编码. encode是指将人类用的语言(字符 ...

  4. snoopy 强大的PHP采集类使用实例代码

    下载地址: http://www.jb51.net/codes/33397.html Snoopy的一些特点: 1抓取网页的内容 fetch 2 抓取网页的文本内容 (去除HTML标签) fetcht ...

  5. maven An error occurred while filtering resources

    转自:http://stackoverflow.com/questions/18145774/eclipse-an-error-occurred-while-filtering-resources m ...

  6. iOS xib中TableView创建的2种模式

    在xcode 5.0中 用xib编辑tableview有2种模式,见下图 其中,dynamic prototype 动态原型 表示tableview会询问它指定的 data source获取数据,如果 ...

  7. iOS 关于objectForKey返回类型是不是mutable

    以前看NSUserDefault时,记住了那里的objectForKey返回的一定是immutable的对象.现在有点弄混了,其实,NSObject的objectForKey方法没有这个限制,是可以返 ...

  8. 爱情之路(codevs 2070)

    题目描述 Description yh非常想念他的女朋友小y,于是他决定前往小y所在的那块大陆. 小y所在的大陆共有n个城市,m条双向路,每条路连接一个或两个城市.经过一条路ei需要耗费时间ti.此外 ...

  9. MVC中session创建并获取问题

    有两个ActionResult分别为A和B,如下 public ActionResult A() { Session["test"]="123"; return ...

  10. wpa_supplicant.conf

    转自:http://w1.fi/gitweb/gitweb.cgi?p=hostap.git;a=blob_plain;f=wpa_supplicant/wpa_supplicant.conf ### ...