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

 

posted @ 2022-02-10 19:24  是橙橙吖  Views(25)  Comments(0)    收藏  举报