原文:http://www.cnblogs.com/lotus3x/archive/2009/03/21/1418480.html
概念:有带权图G, 对于图中每条边e[i], 都有benifit[i](收入)和cost[i](花费), 我们要求的是一棵生成树T, 它使得∑(benifit[i]) / ∑(cost[i]), i∈T 最大(或最小).
解法:
设x[i]等于1, 表示边e[i]属于生成树,x[i]等于0, 表示边e[i]不属于生成树.
则我们所求的比率r= ∑(benifit[i] * x[i]) / ∑(cost[i] * x[i]), 0≤i<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,二分就可以找出答案。