题意:给N个孩子分配M个糖果。

有一个N*M的矩阵表示孩子和糖果的关系,若第i行第j列的数是1则表示第i个孩子喜欢第j个糖果,反之不喜欢。

已知,若一个孩子被分配到他喜欢的糖果那么他将获得K的快乐值,反之只能获取1的快乐值。

现在给你这N个孩子需要满足的快乐值,问你能不能满足所有孩子的需求。

1<=N<=13, 1<=M<=13, 2<=K<=10

0<=B[i]<=1000

思路:RYZ作业

费用流(经典?)模型之一

这题的建模是使用最大费用最大流将各人喜欢的糖果作用最大化

From:http://blog.csdn.net/chenzhenyu123456/article/details/48130365

建图:设置超级源点source,超级汇点sink,用a表示当前孩子需要满足的快乐值

1,source向每个糖果建边,容量1,费用0;

2,只考虑有特殊的糖,那么对于第i个人喜欢j糖果,则j糖果向第i个人建边,容量为1,费用为0;

3,每个孩子向汇点建边。这时需要分类讨论

(1) a % K == 0,表示该孩子选择(a / K)个他喜欢的糖果就可以满足,而且该孩子选择1个他喜欢的糖果,会获取K的快乐值。 建边信息——容量为(a / K),费用为K;

(2) a % K != 0,表示该孩子选择(a / K + 1)个他喜欢的糖果才能满足,这时我们不能只建一条容量为(a / K + 1),费用为K的边,如果这样处理我们就放大了最大流时费用的最大效益。

因此我们要建一条容量为(a / K),费用为K的边,再建一条容量为1,费用为a % K的边。这样的话在用特殊糖果满足该孩子的需求时,才不会使最后流入汇点的费用增加

建好图,跑一次最大费用最大流。

最终结果:(用sumflow记录所有孩子需要满足的快乐值之和)

最大费用cost——特殊的糖被充分利用后所分配的快乐值之和。若cost >= sumflow 则表示已经满足条件。

最大流flow——为了达到这样的程度使用的糖的数量。

这样就还剩M - flow数目的糖被我们当做普通的糖使用,只要M - flow >= sumflow - cost,就可以满足条件。

  1. var head,vet,next,len1,len2,fan,dis:array[..]of longint;
  2. inq:array[..]of boolean;
  3. q,b:array[..]of longint;
  4. a:array[..,..]of longint;
  5. pre:array[..,..]of longint;
  6. n,m,sum,ans1,ans2,tot,source,src,s,cas,v,i,j,k:longint;
  7.  
  8. procedure add(a,b,c,d:longint);
  9. begin
  10. inc(tot);
  11. next[tot]:=head[a];
  12. vet[tot]:=b;
  13. len1[tot]:=c;
  14. len2[tot]:=d;
  15. head[a]:=tot;
  16.  
  17. inc(tot);
  18. next[tot]:=head[b];
  19. vet[tot]:=a;
  20. len1[tot]:=;
  21. len2[tot]:=-d;
  22. head[b]:=tot;
  23. end;
  24.  
  25. function min(x,y:longint):longint;
  26. begin
  27. if x<y then exit(x);
  28. exit(y);
  29. end;
  30.  
  31. function spfa:boolean;
  32. var u,e,v,t,w,i:longint;
  33. begin
  34. for i:= to s do
  35. begin
  36. dis[i]:=-(maxlongint>>);
  37. inq[i]:=false;
  38. end;
  39. t:=; w:=; q[]:=source; dis[source]:=; inq[source]:=true;
  40. while t<w do
  41. begin
  42. inc(t); u:=q[t mod ]; inq[u]:=false;
  43. e:=head[u];
  44. while e<> do
  45. begin
  46. v:=vet[e];
  47. if (len1[e]>)and(dis[u]+len2[e]>dis[v]) then
  48. begin
  49. dis[v]:=dis[u]+len2[e];
  50. pre[v,]:=u;
  51. pre[v,]:=e;
  52. if not inq[v] then
  53. begin
  54. inc(w); q[w mod ]:=v; inq[v]:=true;
  55. end;
  56. end;
  57. e:=next[e];
  58. end;
  59. end;
  60. if dis[src]=-(maxlongint>>) then exit(false);
  61. exit(true);
  62. end;
  63.  
  64. procedure mcf;
  65. var k,e,t:longint;
  66. begin
  67. k:=src; t:=maxlongint;
  68. while k<>source do
  69. begin
  70. t:=min(t,len1[pre[k,]]);
  71. k:=pre[k,];
  72. end;
  73. k:=src;
  74. while k<>source do
  75. begin
  76. e:=pre[k,];
  77. len1[e]:=len1[e]-t;
  78. len1[fan[e]]:=len1[fan[e]]+t;
  79. ans2:=ans2+t*len2[e];
  80. k:=pre[k,];
  81. end;
  82. ans1:=ans1+t;
  83. end;
  84.  
  85. begin
  86. assign(input,'hdoj4322.in'); reset(input);
  87. assign(output,'hdoj4322.out'); rewrite(output);
  88. readln(cas);
  89. for i:= to do
  90. if i and = then fan[i]:=i+
  91. else fan[i]:=i-;
  92. for v:= to cas do
  93. begin
  94. readln(n,m,k);
  95. for i:= to s do head[i]:=;
  96. tot:=; s:=; ans1:=; ans2:=; sum:=;
  97. for i:= to m do
  98. begin
  99. read(b[i]);
  100. sum:=sum+b[i];
  101. end;
  102. for i:= to m do
  103. for j:= to n do read(a[i,j]);
  104. source:=n+m+; src:=n+m+; s:=n+m+;
  105. for i:= to n do add(source,i,,);
  106. for i:= to m do
  107. for j:= to n do
  108. if a[i,j]= then add(j,i+n,,);
  109. for i:= to m do
  110. begin
  111. add(i+n,src,b[i] div k,k);
  112. if b[i] mod k> then add(i+n,src,,b[i] mod k);
  113. end;
  114. while spfa do mcf;
  115. if n-ans1>=sum-ans2 then writeln('Case #',v,': YES')
  116. else writeln('Case #',v,': NO');
  117. end;
  118. close(input);
  119. close(output);
  120. end.

【HDOJ4322】Candy(费用流)的更多相关文章

  1. HDU 4780 Candy Factory(拆点费用流)

    Problem Description   A new candy factory opens in pku-town. The factory import M machines to produc ...

  2. BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]

    3130: [Sdoi2013]费用流 Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 960  Solved: 5 ...

  3. BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)

    题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...

  4. hdu-5988 Coding Contest(费用流)

    题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 65536/65536 K (Java/Ot ...

  5. POJ2195 Going Home[费用流|二分图最大权匹配]

    Going Home Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22088   Accepted: 11155 Desc ...

  6. 洛谷 1004 dp或最大费用流

    思路: dp方法: 设dp[i][j][k][l]为两条没有交叉的路径分别走到(i,j)和(k,l)处最大价值. 则转移方程为 dp[i][j][k][l]=max(dp[i-1][j][k-1][l ...

  7. Codeforces 730I [费用流]

    /* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...

  8. zkw费用流+当前弧优化

    zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...

  9. 【BZOJ-4213】贪吃蛇 有上下界的费用流

    4213: 贪吃蛇 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 58  Solved: 24[Submit][Status][Discuss] Desc ...

随机推荐

  1. [转]Walkthrough: Your First F# Program

    本文转自:http://msdn.microsoft.com/en-us/library/vstudio/dd233160(v=vs.100).aspx   Visual Studio 2010 in ...

  2. Java_JDBC连接数据库

    package com.accp.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pre ...

  3. vue-webpack所构建好的项目中增加Eslint

    首先在package.json中配置eslint模块: 在终端运行命令:npm install 然后在build文件夹中web pack.base.conf.js配置eslint 接下来在在项目中新建 ...

  4. java io性能分析

    摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出. 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题.然而这个讨论没有包含 ...

  5. 【C++】朝花夕拾——STL vector

    STL之vector篇 N久之前是拿C的数组实现过vector中的一些简单功能,什么深拷贝.增删查找之类的,以为vector的实现也就是这样了,现在想想真是...too young too naive ...

  6. (转) 淘淘商城系列——CMS内容管理系统工程搭建

    http://blog.csdn.net/yerenyuan_pku/article/details/72825801 淘淘商城系列——CMS内容管理系统工程搭建 上文我们一起搭建了表现层中的商城门户 ...

  7. MySQL性能优化之max_connections配置

    MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量.如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于M ...

  8. jQuery 价格显示 前面位数与后面两位显示不同样式(一大一小)

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

  9. JavaSE-21 字符编码简介

    ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英 ...

  10. QT5:先导篇 正则表达式

    一.简介 使用正则表达式可以快速完成处理字符串的一些操作,如验证 查找 替换和分割 Qt的QRegExp类是正则表达式的表示类,它基于Perl的正则表达式语言 正则表达式由表达式(expression ...