当时都准备回家了,一撇看见日本题,果断切了再走
明显的不能再明显的MST,就注意一下重叠的情况,重叠就设成0,输出注意是小数点后3位,稠密图用prim,0ms切掉了
#include <stdio.h>
#include <math.h>
double data[101][101]={0};
double prim(int N)
{
double way[101],max;
char check[101];
int i=0,j=0,now;
double ans=0;
for(i=1;i<N;++i)
{
way[i]=data[0][i];
check[i]=0;
}
way[0]=0;
check[0]=1;
for(i=1;i<N;++i)
{
max=0xfffff;
for(j=0;j<N;++j)
{
if(!check[j]&&way[j]<max)
{
max=way[j];
now=j;
}
}
check[now]=1;
for(j=0;j<N;++j)
{
if(!check[j]&&way[j]>data[now][j])
{
way[j]=data[now][j];
}
}
}
for(i=0;i<N;++i)
{
ans+=way[i];
}
return ans;
}
int main()
{
int N=0;
int i=0,j=0;
double x[101],y[101],z[101],r[101],b;
while(scanf("%d",&N)&&N)
{
for(i=0;i<N;++i)
{
scanf("%lf %lf %lf %lf",x+i,y+i,z+i,r+i);
}
for(i=0;i<N;++i)
{
for(j=0;j<N;++j)
{
if(i!=j)
{
b=sqrt((double)(x[i]-x[j])*(x[i]-x[j])
+(double)(y[i]-y[j])*(y[i]-y[j])
+(double)(z[i]-z[j])*(z[i]-z[j]))-r[i]-r[j];
data[i][j]=b>0?b:0;
}
}
}
printf("%.3f\n",prim(N));
}
}