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

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

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

  • 相关阅读:
    Windows10 + eclipse + JDK1.8 + Apache Maven 3.6.0 + dl4j深度学习环境配置
    vector,deque,list的区别和使用
    extern C的用法解析
    向jupyter notebook加入Anaconda3中已添加的虚拟环境kernel
    TensorFlow学习
    windows10+Python3.6+Anaconda3+tensorflow1.10.0配置和安装
    torchvision
    无oracle客户端仅用plsql连接远程oracle
    poj 3463 Sightseeing(次短路+条数统计)
    10.11 noip模拟试题
  • 原文地址:https://www.cnblogs.com/proverbs/p/2857035.html
Copyright © 2011-2022 走看看