Building a Space Station
Building a Space Station
https://vjudge.net/contest/477987#problem/I
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int inf=0x3f3f3f;//m<=100
double a[105][4],cmap[105][105],d[105];
int c[105],n;
double prim()
{
for(int i=1;i<=n;i++)
{
d[i]=cmap[1][i];
}
c[1]=1;
int u;
double ans=0;
for(int i=1;i<=n;i++)
{
double cmin=inf;
for(int j=1;j<=n;j++)
{
if(c[j]==0&&d[j]<cmin)
{
u=j;
cmin=d[j];
}
}
//cout<<cmin<<endl;
if(cmin!=inf)ans+=cmin;
c[u]=1;
for(int j=1;j<=n;j++)
{
if(c[j]==0&&d[j]>cmap[u][j])
{
d[j]=cmap[u][j];
}
}
}
return ans;
}
int main()
{
while(cin>>n&&n)
{
for(int i=1;i<=n;i++)
{
cin>>a[i][0]>>a[i][1]>>a[i][2]>>a[i][3];
}
memset(c,0,sizeof(c));
memset(cmap,inf,sizeof(cmap));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i][0]==inf)break;
if(i==j)continue;
if(a[j][0]==inf)continue;
double k=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1])+(a[i][2]-a[j][2])*(a[i][2]-a[j][2]))-a[i][3]-a[j][3];
//cout<<i<<" "<<j<<" "<<k<<endl;
if(k>0)cmap[i][j]=cmap[j][i]=k;
else cmap[i][j]=cmap[j][i]=0;
}
}
printf("%.3f\n",prim());
}
return 0;
}
//3
//10.000 10.000 50.000 10.000
//40.000 10.000 50.000 10.000
//40.000 40.000 50.000 10.000
//2
//30.000 30.000 30.000 20.000
//40.000 40.000 40.000 20.000
//5
//5.729 15.143 3.996 25.837
//6.013 14.372 4.818 10.671
//80.115 63.292 84.477 15.120
//64.095 80.924 70.029 14.881
//39.472 85.116 71.369 5.553
//0

浙公网安备 33010602011771号