#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=100010,maxm=500;
double inf=999999999.000;
struct node{
double x,y,z,r;
}a[maxn];
double e[maxm][maxm];
double dis[maxn];
int p[maxn];
int main(){
int i,j,k,n,m,end;
double sum;
while(1){
scanf("%d",&m);
sum=0.000;
if(m==0)break;
memset(p,0,sizeof(p));
for(i=1;i<=m;i++)
for(j=1;j<=m;j++)
if(i==j)e[i][j]=0;
else e[i][j]=inf;
for(i=1;i<=m;i++)
scanf("%lf%lf%lf%lf",&a[i].x,&a[i].y,&a[i].z,&a[i].r);
for(i=1;i<m;i++)
for(j=i+1;j<=m;j++){
e[i][j]=e[j][i]=sqrt(sqrt((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y))*sqrt((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y))+(a[j].z-a[i].z)*(a[j].z-a[i].z))-a[i].r-a[j].r>0?sqrt(sqrt((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y))*sqrt((a[j].x-a[i].x)*(a[j].x-a[i].x)+(a[j].y-a[i].y)*(a[j].y-a[i].y))+(a[j].z-a[i].z)*(a[j].z-a[i].z))-a[i].r-a[j].r:0;
}
int cnt=1;
for(i=1;i<=m;i++)
dis[i]=e[1][i];
p[1]=1;
while(cnt<m){
double min=inf;
for(i=1;i<=m;i++){
if(!p[i]&&dis[i]<min){
min=dis[i];
end=i;
}
}
cnt++;
p[end]=1;
sum+=dis[end];
for(j=1;j<=m;j++){
if(!p[j]&&dis[j]>e[end][j])
dis[j]=e[end][j];
}
}
printf("%.3f\n",sum);
}
return 0;
}
poj 2031
最新推荐文章于 2021-02-24 00:16:42 发布