最优比例生成树


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



发布了78 篇原创文章 · 获赞 9 · 访问量 6万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章