【HDOJ4322】Candy(费用流)
题意:给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(费用流)的更多相关文章
- HDU 4780 Candy Factory(拆点费用流)
Problem Description A new candy factory opens in pku-town. The factory import M machines to produc ...
- BZOJ3130: [Sdoi2013]费用流[最大流 实数二分]
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 960 Solved: 5 ...
- BZOJ.1061.[NOI2008]志愿者招募(线性规划 对偶原理 单纯形 / 费用流SPFA)
题目链接 线性规划 用\(A_{ij}=0/1\)表示第\(i\)天\(j\)类志愿者能否被招募,\(x_i\)为\(i\)类志愿者招募了多少人,\(need_i\)表示第\(i\)天需要多少人,\( ...
- hdu-5988 Coding Contest(费用流)
题目链接: Coding Contest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- POJ2195 Going Home[费用流|二分图最大权匹配]
Going Home Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22088 Accepted: 11155 Desc ...
- 洛谷 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 ...
- Codeforces 730I [费用流]
/* 不要低头,不要放弃,不要气馁,不要慌张 题意: 给两行n个数,要求从第一行选取a个数,第二行选取b个数使得这些数加起来和最大. 限制条件是第一行选取了某个数的条件下,第二行不能选取对应位置的数. ...
- zkw费用流+当前弧优化
zkw费用流+当前弧优化 var o,v:..] of boolean; f,s,d,dis:..] of longint; next,p,c,w:..] of longint; i,j,k,l,y, ...
- 【BZOJ-4213】贪吃蛇 有上下界的费用流
4213: 贪吃蛇 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 58 Solved: 24[Submit][Status][Discuss] Desc ...
随机推荐
- [转]Walkthrough: Your First F# Program
本文转自:http://msdn.microsoft.com/en-us/library/vstudio/dd233160(v=vs.100).aspx Visual Studio 2010 in ...
- Java_JDBC连接数据库
package com.accp.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pre ...
- vue-webpack所构建好的项目中增加Eslint
首先在package.json中配置eslint模块: 在终端运行命令:npm install 然后在build文件夹中web pack.base.conf.js配置eslint 接下来在在项目中新建 ...
- java io性能分析
摘要: 本文大多技术围绕调整磁盘文件 I/O,但是有些内容也同样适合网络 I/O 和窗口输出. 第一部分技术讨论底层的I/O问题,然后讨论诸如压缩,格式化和串行化等高级I/O问题.然而这个讨论没有包含 ...
- 【C++】朝花夕拾——STL vector
STL之vector篇 N久之前是拿C的数组实现过vector中的一些简单功能,什么深拷贝.增删查找之类的,以为vector的实现也就是这样了,现在想想真是...too young too naive ...
- (转) 淘淘商城系列——CMS内容管理系统工程搭建
http://blog.csdn.net/yerenyuan_pku/article/details/72825801 淘淘商城系列——CMS内容管理系统工程搭建 上文我们一起搭建了表现层中的商城门户 ...
- MySQL性能优化之max_connections配置
MySQL的最大连接数,增加该值增加mysqld 要求的文件描述符的数量.如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于M ...
- jQuery 价格显示 前面位数与后面两位显示不同样式(一大一小)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- JavaSE-21 字符编码简介
ASCII ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英 ...
- QT5:先导篇 正则表达式
一.简介 使用正则表达式可以快速完成处理字符串的一些操作,如验证 查找 替换和分割 Qt的QRegExp类是正则表达式的表示类,它基于Perl的正则表达式语言 正则表达式由表达式(expression ...