#include<stdio.h>
#include<stdlib.h>
#include<math.h>
const int maxn=110;
const float inf=1000000000.0;
int p[maxn];
float a[maxn][maxn],d[maxn],x[maxn],y[maxn],z[maxn],r[maxn];
int main(){
int i,j,k,m,n;
float ans;
while(1){
scanf("%d",&n);
if(n==0)break;
ans=0;
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
a[i][j]=inf;
for(i=1;i<=n;i++){
d[i]=inf;
p[i]=0;
}
for(i=1;i<=n;i++)
scanf("%f%f%f%f",&x[i],&y[i],&z[i],&r[i]);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++){
a[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])+(z[i]-z[j])*(z[i]-z[j]));
a[i][j]-=r[i]+r[j];
if(a[i][j]<0)a[i][j]=0;
}
d[1]=0;
float min;
for(i=1;i<=n;i++){
min=inf;
for(j=1;j<=n;j++)
if(!p[j] && d[j]<min){
k=j;
min=d[j];
}
p[k]=1;
ans+=d[k];
for(j=1;j<=n;j++)
if(!p[j] && d[j]>a[j][k])
d[j]=a[j][k];
}
printf("%.3f\n",ans);
}
system("pause");
return 0;
}
POJ2031 最小生成树
最新推荐文章于 2022-03-09 16:55:41 发布