POJ - 2031 Building a Space Station #include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int N = 110; double x[N],y[N],z[N],r[N]; double g[N][N],d[N]; bool st[N]; int main() { int n; while(scanf("%d",&n),n) { for(int i=1;i<=n;i++) scanf("%lf%lf%lf%lf",&x[i],&y[i],&z[i],&r[i]); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { g[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]))-r[i]-r[j]; if(g[i][j]<0) g[i][j]=0; } memset(st,false,sizeof st); for(int i=1;i<=n;i++) d[i]=0x3f3f3f3f; double res=0; for(int i=0;i<n;i++) { int t=-1; for(int j=1;j<=n;j++) if(!st[j]&&(t==-1||d[t]>d[j])) t=j; if(i) res+=d[t]; st[t]=true; for(int j=1;j<=n;j++) d[j]=min(d[j],g[t][j]); } printf("%.3f\n",res); } return 0; }