POJ 2728 Desert King(最优比率生成树)
- 题目大意
有n个村庄,村庄在不同坐标和海拔,现在要对所有村庄供水,只要两个村庄之间有一条路即可,建造水管距离为坐标之间的欧几里德距离,费用为海拔之差,现在要求方案使得费用与距离的比值最小,很显然,这个题目是要求一棵最优比率生成树。
- 分析
以下内容摘录自网上(其他博客排版太丑重排了一下)
【POJ 2728 Desert King(最优比率生成树)】概念
有带权图G, 对于图中每条边e[i], 都有benifiti和costi, 我们要求的是一棵生成树T, 它使得
∑(benifit[i])∑(cost[i])i∈T
最大(或最小).这显然是一个具有现实意义的问题.
解法之一 0-1分数规划
设 x[i]等于1或0, 表示边 e[i]是否属于生成树.
则我们所求的比率 r=∑(benifit[i]?x[i])∑(cost[i]?x[i]),0≤i 为了使 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)$看做以d为边权的最大生成树的总权值.
然后明确两个性质:
- z单调递减
证明: 因为cost为正数, 所以z随l的减小而增大.
- z(max(r))=0
证明: 若 z(max(r))<0,∑(benifit[i]?x[i])?max(r)?∑(cost[i]?x[i])<0 ,
可化为 max(r) 若 z(max(r))>=0 , 根据性质1, 当z = 0 时r最大.
?
?
- 代码
#include
#include
#include
#include
#include
#include
#include
推荐阅读