zoukankan      html  css  js  c++  java
  • [POJ2728] 最优比率生成树

    题目大意:

    一张(N)个结点(M)条边的无向图,每条边有两个权值(a,b),求一颗生成树满足树上的所有边(a)权和与(b)权和的商最大。((1<=N,M<=1e4))

    相似的问题:0/1分数规划

    0/1分数规划:从长度为(n)的数列({a_n})({b_n})中选出若干对,使得选出的(a)之和与(b)之和商最大。即求一组(x_i(1<=i<=n,x_i=0~or~1)),最大化(frac{Sigma^n_{i=1} a_i*x_i}{Sigma^n_{i=1} b_i*x_i})

    这个问题我们用二分答案的思想来解决。

    既然是二分答案,我们首先需要选一个二分的量使答案关于它单调。
    如果存在选数方案使(frac{Sigma^n_{i=1} a_i*x_i}{Sigma^n_{i=1} b_i*x_i}>=mid),那么可以增大(mid);否则减小。二分停止时(mid)即为答案。
    变形不等式(frac{Sigma^n_{i=1} a_i*x_i}{Sigma^n_{i=1} b_i*x_i}>=mid),它等价于(Sigma^n_{i=1} (a_i-mid*b_i)*x_i>=0)
    也就是说我们需要判断对于当前(mid),是否存在选数方案使(Sigma^n_{i=1} (a_i-mid*b_i)*x_i>=0)
    判断是否有方案使(Sigma^n_{i=1} (a_i-mid*b_i)*x_i>=0),只需要最大化(Sigma^n_{i=1} (a_i-mid*b_i)*x_i),并将其与(0)比较。而我们可以直接将所有(a_i-mid*b_i)计算出,这(n)个数中选若干产生和的最大值即为其中所有正数之和。

    时间复杂度为(O(nlg n))

    回到题目

    这道题与0/1规划问题唯一增加的限制就是我们选的最后那些数要在一颗树里。。。
    因此在二分中,在原图结构上将每条边权修改为(a_i-b_i*mid),然后跑最大生成树,判断树上所有边权和是否非负即可。

    这题实现起来比较简单也没什么细节,就不放代码了。

    题外话

    如果询问的是求一颗(a)权和与(b)权和乘积最小的生成树呢?
    那解法显然截然不同,成了一个计算几何题了[捂脸]

  • 相关阅读:
    CentOS安装node.js-8.11.1+替换淘宝NPM镜像
    【推荐】CentOS安装gcc-4.9.4+更新环境+更新动态库
    申请安装阿里云免费SSL证书
    服务器安全加固
    【推荐】优秀代码
    CenOS登录失败处理功能
    Ubuntu修改密码及密码复杂度策略设置
    mysql 5.7添加server_audit 安全审计功能
    快速安装jumpserver开源堡垒机
    oracle 11g 配置口令复杂度
  • 原文地址:https://www.cnblogs.com/InedibleKonjac/p/13436841.html
Copyright © 2011-2022 走看看