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