JOJ 2453 Candy 网络流

题意:

有N 颗糖果和M 个小孩,老师现在要把这N 颗糖分给这M 个小孩。每个小孩i对每颗糖j 都有一个偏爱度Aij,如果他喜欢这颗糖,Aij = 2,否则 Aij = 1。小孩 i觉得高兴当且仅当∑Cij×Aij >= Bi,j=1,2, …,N ,若他分得了糖 j ,Cij = 1,否则 Cij = 0。问能否合理分配这 N 颗糖,使得每个小孩都觉得高兴。(1 <= N <= 100,000, 1 <= M <= 10, 0 <= Bi <= 1,000,000,000) 

 

题解:

真心给这个题跪了。。。

官方题解见 Edelweiss的网络流建模总结 。

 http://wenku.baidu.com/view/0ad00abec77da26925c5b01c.html

我对题解是这样理解的:

首先要想明白<=Bi这个条件,其实等价于=Bi,这是做这道题的基础(原因是:>Bi就没有意义了,还不如给其他小朋友)。

设Dij=Aij-1 Dij属于{0,1}

则∑Cij*Aij>=Bi

即∑Cij*(Dij+1)>=Bi

即∑(Cij*Dij)+∑Cij>=Bi

即∑∑(Cij*Dij)+∑∑Cij>=∑Bi

注意到∑∑Cij=N(每个糖最终都要分给小朋友)

则∑∑(Cij*Dij)>=∑Bi-N

这就是题解这么建图的原因,是有依据的。

 

再进一步解释题解:

①这个网络流的图实际上是只考虑了对Aij=2的这种情况的分配,没有考虑Aij=1的分配方案。但这样做正是其巧妙之处

②对于每个小朋友向T连的floor(Bi/2)的解释:上文提到了,网络流的图只考虑Aij=2的分配,所以Aij=2的分配的个数是<=floor(Bi/2),也就是说floor(Bi/2)是容量的上界

 

对题解的补充:

我一直没有写这个题的原因是明显超时,原图中有10W+的点,不Tle我都不信。。

偶然发现了优化方法,将糖合并,只有十个人,可以将糖分成2^10种(根据每个人喜欢或者不喜欢),应该是能过了!

 

不得不说这真是一道最大流的神题啊!

 

最近好忙,有空补上代码。。也许永远也补不上了。。。

转载于:https://www.cnblogs.com/proverbs/archive/2013/01/11/2857035.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值