最優比例生成樹


原文: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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章