题意:给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,就可以满足条件。

 var head,vet,next,len1,len2,fan,dis:array[..]of longint;
inq:array[..]of boolean;
q,b:array[..]of longint;
a:array[..,..]of longint;
pre:array[..,..]of longint;
n,m,sum,ans1,ans2,tot,source,src,s,cas,v,i,j,k:longint; procedure add(a,b,c,d:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
len1[tot]:=c;
len2[tot]:=d;
head[a]:=tot; inc(tot);
next[tot]:=head[b];
vet[tot]:=a;
len1[tot]:=;
len2[tot]:=-d;
head[b]:=tot;
end; function min(x,y:longint):longint;
begin
if x<y then exit(x);
exit(y);
end; function spfa:boolean;
var u,e,v,t,w,i:longint;
begin
for i:= to s do
begin
dis[i]:=-(maxlongint>>);
inq[i]:=false;
end;
t:=; w:=; q[]:=source; dis[source]:=; inq[source]:=true;
while t<w do
begin
inc(t); u:=q[t mod ]; inq[u]:=false;
e:=head[u];
while e<> do
begin
v:=vet[e];
if (len1[e]>)and(dis[u]+len2[e]>dis[v]) then
begin
dis[v]:=dis[u]+len2[e];
pre[v,]:=u;
pre[v,]:=e;
if not inq[v] then
begin
inc(w); q[w mod ]:=v; inq[v]:=true;
end;
end;
e:=next[e];
end;
end;
if dis[src]=-(maxlongint>>) then exit(false);
exit(true);
end; procedure mcf;
var k,e,t:longint;
begin
k:=src; t:=maxlongint;
while k<>source do
begin
t:=min(t,len1[pre[k,]]);
k:=pre[k,];
end;
k:=src;
while k<>source do
begin
e:=pre[k,];
len1[e]:=len1[e]-t;
len1[fan[e]]:=len1[fan[e]]+t;
ans2:=ans2+t*len2[e];
k:=pre[k,];
end;
ans1:=ans1+t;
end; begin
assign(input,'hdoj4322.in'); reset(input);
assign(output,'hdoj4322.out'); rewrite(output);
readln(cas);
for i:= to do
if i and = then fan[i]:=i+
else fan[i]:=i-;
for v:= to cas do
begin
readln(n,m,k);
for i:= to s do head[i]:=;
tot:=; s:=; ans1:=; ans2:=; sum:=;
for i:= to m do
begin
read(b[i]);
sum:=sum+b[i];
end;
for i:= to m do
for j:= to n do read(a[i,j]);
source:=n+m+; src:=n+m+; s:=n+m+;
for i:= to n do add(source,i,,);
for i:= to m do
for j:= to n do
if a[i,j]= then add(j,i+n,,);
for i:= to m do
begin
add(i+n,src,b[i] div k,k);
if b[i] mod k> then add(i+n,src,,b[i] mod k);
end;
while spfa do mcf;
if n-ans1>=sum-ans2 then writeln('Case #',v,': YES')
else writeln('Case #',v,': NO');
end;
close(input);
close(output);
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. [转]查询表达式 (F#)

    本文转自:http://msdn.microsoft.com/zh-cn/library/hh225374.aspx 查询表达式可以查询数据源并将数据是一种预期形式.             查询表达 ...

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

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

  3. 锁 Lock、重入锁、写入锁

    ReentrantLock 重入锁 类似于synchronize 区别与写法上,在需要进行同步的代码部分加上锁定,但不要忘记最后一定要释放锁定, 不然会造成锁永远无法释放,其他线程永远进不来的结果.e ...

  4. [BZOJ1083][SCOI2005]繁忙的都市 最小生成树

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1083 由kruskal算法原理可知,我们对一张无向图做普通的最小生成树,连上的最后一条边就 ...

  5. 学习笔记 第十二章 CSS3+HTML5网页排版

    第12章   CSS3+HTML5网页排版 [学习重点] 正确使用HTML5结构标签 正确使用HTML5语义元素 能够设计符合标准的网页结构 12.1  使用结构标签 在制作网页时,不仅需要使用< ...

  6. 【转】qqface使用实例

    原网址:http://www.xwcms.net/js/bddm/51565.html <div id="show"></div>   <div cl ...

  7. nginx for ubuntu

    1.创建文件夹 :mkdir nginx 2.解压nginx: tar zxvf nginx.gz.tar 3.nginx 初始化:在nginx的路径下执行:./configure 有可能会报错: . ...

  8. cat - 连接文件并在标准输出上输出

    SYNOPSIS 总览 cat [选项列表] [文件列表]... DESCRIPTION 描述 将文件列表中的文件或标准输入连接到标准输出. -A, --show-all 等价于 -vET . -b, ...

  9. IIS HTTP 错误 401.3的解决办法

    目标网站添加新用户Everyone,选上需要的Everyone用户权限

  10. 【东软实训】SQL多表链接

    如果一个查询同时涉及两个以上的表,则称之为链接查询,链接查询是关系数据库中最主要的查询,主要包括等值链接查询.非等值链接查询.自身链接查询.外链接查询和复合条件链接查询. 这篇博文我们来对多表链接进行 ...