题意:
有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种(根据每个人喜欢或者不喜欢),应该是能过了!
不得不说这真是一道最大流的神题啊!
最近好忙,有空补上代码。。也许永远也补不上了。。。