最优比例生成树


原文:http://www.cnblogs.com/lotus3x/archive/2009/03/21/1418480.html

 

概念:有带权图G, 对于图中每条边e[i], 都有benifit[i](收入)和cost[i](花费), 我们要求的是一棵生成树T, 它使得(benifit[i]) / (cost[i]), iT 最大(或最小).

 

解法:

 

设x[i]等于1, 表示边e[i]属于生成树,x[i]等于0, 表示边e[i]不属于生成树.

 

则我们所求的比率r= (benifit[i] * x[i]) / (cost[i] * x[i]), 0i<m .

 

为了使 r 最大, 构造一个子问题---> 让 z =(benifit[i] * x[i]) - l * (cost[i] * x[i]) = (d[i] * x[i])  最大 (d[i] = benifit[i] - l *cost[i]) , 并记为z(l).此时z是关于l的函数,(benifit[i] * x[i]) (cost[i] * x[i]) 都是系数,那么这就是y=kx+b 的直线方程形式, z(l)可以看做以d为边权的最大生成树的总权值.

 

现在来证明两个性质:

1:z单调递减:

 

类比直线方程,斜率就是-(cost[i] * x[i]) 而cost为正数,所以斜率为负数,z单调递减。

 

2 :z ( max(r) ) >=0

 

证明:z中的x[i]取值恰好完全确定一棵生成树(z只不过在所有生成树中取了个最大值),如果不考虑其他,z当然可以取到负数,也有可能不是负数。然后注意max(r) 不仅仅是一个值,它还代表了max(r) 中的x[i] 刚好是一颗生成树(题目要求),所以我们总可以让z中的那些x[i]取值与max(r) 中x[i] 取值一模一样,把max(r) 表达式带入z中就知道z==0,可知z如果取到负数都不是最优的,因为z总可以取到零,所以z就有了一个下限零,既z (max(r) ) >=0

 

根据2由1可知要让max(r)最大z取最小既零。所以最优比例生成树对应的z值为0,二分就可以找出答案。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值