B应该不会为0吧...数组够大了,没理由RE啊? 大佬们救救孩子8
#include<bits/stdc++.h>
using namespace std;
const int maxn=2010;
int t,n,cnt,tot,to[maxn],nex[maxn],fir[maxn],w[maxn],x[maxn],y[maxn],p[maxn],vis[maxn],val[maxn][maxn],fa[maxn];
double dis,ans,A,B,sum;
struct edge{
int u,v;
double c;
friend bool operator<(edge a,edge b){
return a.c<b.c;
}
}e[2000005];
void add(int u,int v,int c){
to[++cnt]=v;
nex[cnt]=fir[u];
fir[u]=cnt;
w[cnt]=c;
}
int find(int a){
if(a==fa[a]) return a;
return fa[a]=find(fa[a]);
}
int merge(int a,int b){
a=find(a),b=find(b);
if(a^b) fa[a]=b;
}
double dist(int i,int j){
return sqrt((double)(x[i]-x[j])*(x[i]-x[j])+(double)(y[i]-y[j])*(y[i]-y[j]));
}
int kruscal(){
sort(e+1,e+tot+1);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=tot;i++){
int u=find(e[i].u),v=find(e[i].v);
if(u!=v){
merge(u,v);
add(e[i].u,e[i].v,e[i].c);
add(e[i].v,e[i].u,e[i].c);
sum+=e[i].c;
}
}
}
int dfs(int rt,int u){
vis[u]=1;
for(int i=fir[u];i;i=nex[i]){
int v=to[i];
if(!vis[v]){
val[rt][v]=max(val[rt][u],w[i]);
dfs(rt,v);
}
}
}
void clear(){
ans=cnt=tot=sum=0;
memset(fir,0,sizeof(fir));
memset(w,0,sizeof(w));
}
int main(){
scanf("%d",&t);
while(t--){
clear();
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d",&x[i],&y[i],&p[i]);
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
dis=dist(i,j);
e[++tot]=((edge){i,j,dis});
}
}
kruscal();
for(int i=1;i<=n;i++){
memset(vis,0,sizeof(vis));
dfs(i,i);
}
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++){
A=p[i]+p[j],B=sum-val[i][j];
ans=max(ans,A/B);
}
printf("%.2lf\n",ans);
}
return 0;
}