ACM题集:https://blog.csdn.net/weixin_39778570/article/details/83187443
图论:https://blog.csdn.net/weixin_39778570/article/details/87825212
题目链接:http://poj.org/problem?id=2728
题目描述
大卫大帝刚刚成为沙漠国家的国王。为了赢得人民的尊重,他决定在全国各地修建渠道,为每个村庄送水。与他的首都村庄相连的村庄将被供水。作为统治国家的统治者和智慧的象征,他需要以一种最优雅的方式建立渠道。
经过几天的学习,他终于想出了自己的计划。他希望将每英里通道的平均成本降至最低。换句话说,必须将信道的总成本与总长度的比率降至最低。他只需要建立必要的渠道,将水输送到所有的村庄,这意味着将只有一种方法来连接每个村庄到首都。
他的工程师调查了这个国家,并记录了每个村庄的位置和海拔高度。所有渠道必须在两个村庄之间直通,并水平修建。由于每两个村庄所处的海拔高度不同,他们得出结论认为,两个村庄之间的每一条水道都需要一个垂直的提水机,它可以将水提上来,也可以让水流下来。河道的长度是两个村庄之间的水平距离。通道的成本是升降机的高度。你应该注意到,每个村庄在不同的海拔高度,不同的渠道不能共用一个升降机。渠道可以安全交叉,没有三个村庄在同一条线路上。
作为大卫王的首席科学家和程序员,您被要求找到构建通道的最佳解决方案。
输入
有几个测试用例。每个测试用例都从包含数字N(2<=N<=1000)的一行开始,这就是村庄的数量。下列N行中的每一行都包含三个整数:x,y和z(0<=x,y<100000<=z<10000000)。(x,y)是村庄的位置,z是高度。第一个村庄是首都。N=0的测试用例结束输入,不应进行处理。
输出
对于每个测试用例,输出一行包含一个十进制数,这是通道的总开销对总长度的最小比率。这个数字应该四舍五入到小数点后三位数。
分析
很明显是要求一棵最小生成树,使得 s u m ( c o s t ) / s u m ( l e n ) sum(cost)/sum(len) sum(cost)/sum(len)最小
另 s u m ( c o s t ) / s u m ( l e n ) sum(cost)/sum(len) sum(cost)/sum(len)=ans
===> s u m ( c o s t ) − s u m ( l e n ) ∗ a n s = 0 sum(cost) - sum(len)*ans=0 sum(cost)−sum(l