题目描述
某天,cwt出去逛街,发现有有N家汉堡店,每两家汉堡店间都有一条双向道路。由于汉堡店太多了,cwt不知道该去哪家吃汉堡。汉堡店间的路太过于复杂,cwt决定只保留其中n-1条道路(必须保证每两家汉堡店间都连通),其它道路都无视掉。
经过一段时间的考虑,cwt准备吃光两家汉堡店(两家汉堡店在新图中必须有边)。
假设cwt吃光了a,b两家的汉堡,那么cwt就会得到A/B的愉悦度:
其中A=Pa+Pb(Pi是第i家汉堡店的美味度);
B=除了道路(a,b)外,所有道路的权值之和(道路的权值为两个汉堡店之间的欧几里德距离)。
欧几里得距离( Euclidean distance)也称欧式距离,它是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。在二维和三维空间中的欧式距离的就是两点之间的距离,二维的公式是d = sqrt((x1-x2)^2+(y1-y2)^2)
Cwt想知道他最多得到的愉悦度是多少。
输入
输入文件loser.in的第一行包含一个整数N,表示汉堡店的个数。
输入文件接下来包含N行,每行包括三个整数X,Y,P,描述一个汉堡店的信息,其中(X,Y)为该汉堡店的直角坐标,P为该汉堡店的美味度,其中2<N≤1000,0≤X,Y≤1000,0<P<10000。
输出
最大的愉悦度(保留两位小数)。
样例输入
4
1 1 20
1 2 30
200 2 80
200 1 100
样例输出
65.00
提示
【样例解释】
我们保留(1,2),(3,4),(2,4)这3条边,并且选择(2,4)这条边,则A=30+100=130,B=1+1=2,A/B=65,可以证明不存在更大的解。
【数据规模】
N<=1000
想法
- 显然是求一个最小生成树 枚举两个点 删除两点间任一树边
算法
- 偷懒暴力写了prim+暴力求链
- 其实应该用树剖或倍增来求LCA
代码
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>