题意比较难理解。。。。。。
于是。。。
#include <iostream>
#include <cstdio>
#include <string.h>
#include <math.h>
using namespace std;
struct vv
{
double x;
double y;
double z;
double r;
};
const double max=105.0;
int n;
double cost[105][105];
double lowcost[105];
int visit[105];
double prim(int v0)
{
memset(visit,0,sizeof(visit));
int s=0;
double ans=0;
visit[s]=1;
int fi;
for(int i=0;i<n-1;i++)
{
double maxn=1050;
for(int j=1;j<n;j++)
{
if(visit[j]==0&&cost[s][j]<maxn)//只比较一次肯定还能判断出来哪。
{
fi=j;
maxn=cost[s][j];
}
}
ans+=cost[s][fi];
visit[fi]=1;
for(int j=1;j<n;j++)
{
if(visit[j]==0)
if(cost[fi][j]<cost[s][j])
cost[s][j]=cost[fi][j];
}
}
return ans;
}
double cal(struct vv a,struct vv b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}
int main()
{
struct vv v[105];
while(scanf("%d",&n)!=EOF)
{
if(!n) break;
for(int i=0;i<n;i++)
scanf("%lf%lf%lf%lf",&v[i].x,&v[i].y,&v[i].z,&v[i].r);
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(i==j) cost[i][j]=0;
cost[i][j]=1050;
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
if(cal(v[i],v[j])<=(v[i].r+v[j].r))
cost[i][j]=cost[j][i]=0;
else cost[i][j]=cost[j][i]=cal(v[i],v[j])-v[i].r-v[j].r;
}
double ans=prim(0);
printf("%.3lf\n",ans);
}
return 0;
}
维基百科上那个好像只能用于整数~~~
G++与C++。。。