最优比例生成树

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mtrix/article/details/52080333


原文: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,二分就可以找出答案。



展开阅读全文

没有更多推荐了,返回首页