#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn = 1010;
const int maxm = maxn*maxn;
int n,m;
vector<int>G[maxn];
vector<double>W[maxn];
int u[maxm],v[maxm];
double w[maxm];
int X[maxn],Y[maxn],P[maxn];
int r[maxm];
int fa[maxn];
int f(int x){return x==fa[x]?x:fa[x]=f(fa[x]);}
int cmp(int i,int j){return w[i]<w[j];}
double d[maxn][maxn];
double SUM;
void Kruskal()
{
SUM=0;
rep(i,0,m-1) r[i]=i;
rep(i,0,n-1) fa[i]=i,G[i].clear(),W[i].clear();
sort(r,r+m,cmp);
rep(i,0,m-1)
{
int e=r[i];
int x=f(u[e]);
int y=f(v[e]);
if(x!=y)
{
fa[x]=y;
G[u[e]].push_back(v[e]);
G[v[e]].push_back(u[e]);
W[u[e]].push_back(w[e]);
W[v[e]].push_back(w[e]);
SUM+=w[e];
}
}
}
double dist(int i,int j)
{
double x=X[i]-X[j];
double y=Y[i]-Y[j];
return sqrt(x*x+y*y);
}
void dfs(int root,int u,int f)
{
int sz=G[u].size();
rep(i,0,sz-1)
{
int v=G[u][i];
if(v==f) continue;
d[root][v]=max(d[root][u],W[u][i]);
dfs(root,v,u);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
m=0;
rep(i,0,n-1) scanf("%d %d %d",X+i,Y+i,P+i);
rep(i,0,n-1) rep(j,i+1,n-1) u[m]=i,v[m]=j,w[m++]=dist(i,j);
Kruskal();
rep(i,0,n-1) d[i][i]=0,dfs(i,i,-1);
double MAX=DBL_MIN;
rep(i,0,n-1) rep(j,i+1,n-1) MAX=max(MAX,(P[i]+P[j])/(SUM-d[i][j]));
printf("%.2lf\n",MAX);
}
return 0;
}
Kruskal,次小生成树,最小瓶颈路(秦始皇修路,LA 5713)
最新推荐文章于 2021-08-19 13:40:52 发布