题目链接:点击打开链接
又是一发 G++ WA , C++ AC.
简单题:给出基站的三围坐标及半径 。若球面距离小于 0 距离为 0 ,否则为 圆心距离减去2个半径
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <string.h>
#define INF 10000000
using namespace std;
double map[110][110],dis[110];
int v[110];
struct node
{
double x,y,z,r;
}p[110];
double makedis(int i,int j)
{
double ans = 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));
ans -= (p[i].r + p[j].r);
if (ans <= 0.0000000001)
return 0;
else
return ans;
}
double prim(int n)
{
int k;
double min,sum=0;
memset(v,0,sizeof(v));
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++)
dis[i]=map[1][i];
v[1]=1;
dis[1]=0;
for(int i=2;i<=n;i++)
{
k=-1;
min = INF;
for(int j=1;j<=n;j++)
if(!v[j]&&min>dis[j])
{
k=j;
min=dis[j];
}
sum += min;
v[k]=1;
for(int j=1;j<=n;j++)
if(!v[j] && dis[j]>map[k][j])
dis[j]=map[k][j];
}
return sum;
}
int main()
{
int n,m;
while(cin>>n)
{
if(n == 0)
break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if (i != j)
map[i][j] = INF;
else
map[i][j] = 0;
}
for(int i=1;i<=n;i++)
{
cin>>p[i].x>>p[i].y>>p[i].z>>p[i].r;
}
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if (map[i][j] >= makedis(i,j))
{
map[i][j] = makedis(i,j);
map[j][i] = makedis(i,j);
}
}
printf("%.3lf\n",prim(n));
}
return 0;
}