zoukankan      html  css  js  c++  java
  • 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种(根据每个人喜欢或者不喜欢),应该是能过了!

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

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

  • 相关阅读:
    腾讯新闻评论数据爬取
    腾讯新闻评论数据爬取
    腾讯新闻评论数据爬取
    Storm系统架构以及代码结构学习
    Storm系统架构以及代码结构学习
    Storm系统架构以及代码结构学习
    网络新闻评论观点挖掘系统实现
    网络新闻评论观点挖掘系统实现
    网络新闻评论观点挖掘系统实现
    Confluence 6 配置验证码(Captcha)来防止垃圾
  • 原文地址:https://www.cnblogs.com/proverbs/p/2857035.html
Copyright © 2011-2022 走看看