版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wlh1998/article/details/76098674
//函数返回值写成int,函数内外用了ans,调试只能显示其中一个,
//垃圾dev半天没调出来
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int maxn = 1e3+10;
const int maxm = 1e6+10;
const int INF = 0x3f3f3f3f;
int fa[maxn];
int pre[maxm];
double pre1[maxn][maxn];
struct link{
int node;
int fir;
int next;
int las;
}links[maxn];
struct ver{
int x;
int y;
int p;
}vers[maxn];
struct edge{
int from;
int to;
double dist;
bool operator < (const edge i)const{
return dist < i.dist ;
}
}edges[maxm];
int find(int x){
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
double kruskal (int n, int m){
for (int i = 0; i < n; i++) {
fa[i] = i;
links[i].node = links[i].fir = links[i].las = i;
links[i].next = -1;
}
sort(edges, edges+m);
int cnt = 0;
double ans = 0;
for (int i = 0; i < m; i++){
int t1 = find(edges[i].from );
int t2 = find(edges[i].to );
if (t1 != t2){
for (int a = links[t1].fir ; a != -1; a = links[a].next ){
for (int b = links[t2].fir ; b != -1; b = links[b].next ){
int u = links[a].node;
int v = links[b].node ;
pre1[u][v] = pre1[v][u] = edges[i].dist ;
}
}
pre[i] = 1;
ans += edges[i].dist ;
cnt++;
fa[t1] = t2;
//t1接t2后
links[links[t2].las ].next = links[t1].fir ;
links[t1].fir = links[t2].fir ;
links[t2].las = links[t1].las ;
}
if (cnt == n - 1) break;
}
return (cnt < n - 1 ? -1: ans);
}
int main (){
int t,m;
scanf("%d",&t);
int cun1,cun2,cost;
for (int cas = 0; cas < t; cas++){
scanf("%d", &m);
int edgenum = 0;
memset(pre,0,sizeof(pre));
memset(pre1,0,sizeof(pre1));
for (int i = 0; i < m; i++){
scanf("%d%d%d", &vers[i].x ,&vers[i].y, &vers[i].p );
}
for (int i = 0; i < m; i++){
for (int j = i + 1; j < m; j++){
edges[edgenum].dist = sqrt(1.0*(vers[i].x - vers[j].x) * (vers[i].x - vers[j].x) +
1.0*(vers[i].y - vers[j].y) * (vers[i].y - vers[j].y)) ;
edges[edgenum].from = i;
edges[edgenum].to = j;
edgenum++;
}
}
double mst = 0.0,maxans = 0.0;
mst = kruskal(m,edgenum);
maxans = 0;
for (int i = 0; i < edgenum; i++){
int up = vers[edges[i].from ].p;
int vp = vers[edges[i].to ].p;
double dis = edges[i].dist;
if (pre[i] == 1){
maxans = maxans > (up + vp) / (mst - dis )?
maxans : (up + vp) / (mst - dis );
}
else maxans = maxans > (up + vp) / (mst - pre1[edges[i].from][edges[i].to])?
maxans : (up + vp) / (mst - pre1[edges[i].from][edges[i].to]);
}
printf("%.2f\n",maxans);
}
}