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种(根据每个人喜欢或者不喜欢),应该是能过了!

 

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

 

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

posted @ 2013-01-11 20:54  proverbs  阅读(614)  评论(2编辑  收藏  举报