裸题 可当模板 用 prim堆优化会tle
#include <iostream>
#include <string.h>
#include <algorithm>
#include <queue>
#include <math.h>
#include <stdio.h>
#define eps 1e-6
using namespace std;
const int inf=0x3f3f3f3f;
int vis[1100],q,n;
double x[1100],y[1100],z[1100],di[1100][1100],hi[1100][1100],dis[1100][1100],minn[1100];
double prim(double mid)
{
double sum=0.0;
memset(vis,0,sizeof(vis));
for (int i=1;i<=n;i++)
{
for (int j=i+1;j<=n;j++)
{
dis[i][j]=dis[j][i]=hi[i][j]-mid*di[i][j];
}
minn[i]=dis[1][i];
}
vis[1]=1;
for (int i=2;i<=n;i++)
{
double Min=inf;
int k=0;
for (int j=1;j<=n;j++)
if (!vis[j]&&minn[j]<Min)
{
Min=minn[j];
k=j;
}
vis[k]=1;
sum+=Min;
for (int j=1;j<=n;j++)
{
if (!vis[j]&&dis[k][j]<minn[j])
minn[j]=min(minn[j],dis[k][j]);
}
}
//printf("%.5lf*****\n",sum);
return sum;
}
int main()
{
while (scanf("%d",&n)!=EOF)
{
if (n==0)
break;
double l=0.0,r=0.0;
for (int i=1;i<=n;i++)
scanf("%lf%lf%lf",&x[i],&y[i],&z[i]);
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++)
{
hi[i][j]=fabs(z[i]-z[j]);
di[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
r=max(r,hi[i][j]/di[i][j]);
}
while (l+eps<r)
{
double mid=(l+r)/2;
if (prim(mid)>=0)
l=mid;
else
r=mid;
}
if (n==1)
printf("0.000\n");
else
printf("%.3f\n",l);
}
return 0;
}