POJ 2728 最优比例生成树

来源:互联网 发布:linux下svn服务器搭建 编辑:程序博客网 时间:2024/05/16 08:03

题意:给定三维的点,求这样一棵树,使得高度差的和与水平距离的和的比值最小

这题是很显然的最优比例生成树,不能用贪心求出cost/len,再建MST。

详细做法见http://hi.baidu.com/zzningxp/blog/item/b2d1b4ec1f8bbc2262d09fc9.html 

代码:第一次写,绝大多数参考http://www.cppblog.com/Yuan/archive/2010/04/15/112720.aspx

 

最优比例树总结(转载)

每条边有两个权值,一个费用h一个长度l,求连通整个图的最小r r=总费用/总长度

r=(h1*x1+h2*x2*.....hn*xm)/(l1*x1+l2*x2+...ln*xm) 最小,其中x取0,1表示边不在或在树中

直接列出两种解法:

(1)二分比率r 将原图边权值修改为h-r*l ,求最小生成树,如果大于0,则可放大r,否则缩小r ,

(2) 01分数规划 Dinkelbach 算法,首先任选可以构造一棵树的n-1条边,numerator表示费用总和,denominator表示长度总和,r*表示最后最优解,再构造一个当前的最优解r=numerator/denominator ,把r作为比例同样将原图边权修改为h-r*l ,作一次MST,结束时可得到另一个最优解r' ,r'会无穷地向最优解r*收敛,根据题目定义当fabs(r*-r')<1e-6 则break ;最后r*=r' ,时间复杂度为O(MST)*min(n^2,log(n*m)),这个算法是可行的,中间N多证明过程略...

(转载自:http://www.cnblogs.com/north_dragon/archive/2010/06/11/1756594.html)