G++的ac代码,注意N要开的大一点,第一次开5050然后re了
#include <algorithm>
#include <cmath>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 10050;
struct node{
int st,ed;
double dis;
bool operator<(const node & x)const{
return dis<x.dis;
}
}e[N];
int n,m;
int fa[N];
struct point{
double x,y,z,r;
}p[N];
int find(int x){
if(x!=fa[x])fa[x] = find(fa[x]);
return fa[x];
}
double kruscal(){
double res = 0;
sort(e,e+m);
for(int i = 0;i < m;i++){
int a = e[i].st,b = e[i].ed;
double c = e[i].dis;
if(find(a)!=find(b)){
res+=c;
fa[find(a)] = find(b);
}
}
return res;
}
int main(){
while(cin >> n && n){
for(int i = 0;i < n;i++){
cin >> p[i].x>>p[i].y>>p[i].z>>p[i].r;
}
m = 0;
for(int i = 0;i < 10050;i++)fa[i] = i;
for(int i = 0;i < n;i++)
for(int j = 0;j < n;j++){
if(i!=j){
if(sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y)+(p[i].z-p[j].z)*(p[i].z-p[j].z))<=p[i].r+p[j].r)e[m++] = {i,j,0.0};
else{
e[m++] = {i,j,sqrt((p[i].x-p[j].x)*(p[i].x-p[j].x)+(p[i].y-p[j].y)*(p[i].y-p[j].y)+(p[i].z-p[j].z)*(p[i].z-p[j].z))-p[i].r-p[j].r};
}
}
}
printf("%.3f\n",kruscal());
}
return 0;
}