1012: A MST Problem
时间限制: 1 Sec 内存限制: 32 MB
提交: 72 解决: 35
[提交][状态][讨论版][命题人:外部导入]
题目描述
It is just a mining spanning tree ( 最小生成树 ) problem, what makes you a little difficult is that you are in a 3D space.
输入
The first line of the input contains the number of test cases in the file. And t he first line of each case
contains one integer numbers n(0<n<30) specifying the number of the point . The n next n line s, each line
contain s Three Integer Numbers xi,yi and zi, indicating the position of point i.
输出
For each test case, output a line with the answer, which should accurately rounded to two decimals .
样例输入
2 2 1 1 0 2 2 0 3 1 2 3 0 0 0 1 1 1
样例输出
1.41 3.97
#include<stdio.h>
#include<math.h>
struct m
{
int x,y,z;
int flag;
}a[1000];
int main()
{
int m;
scanf("%d",&m);
while(m--)
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z),a[i].flag=0;
a[0].flag=1;
int k,t;
double ans=0,ans1,ans2,num;
for(i=0;i<n;i++)
{
ans2=9999999;
for(j=0;j<n;j++)
{
if(a[j].flag==1)
{
for(k=0;k<n;k++)
{
if(a[k].flag==0)
{
num=(a[j].x-a[k].x)*(a[j].x-a[k].x);
num+=(a[j].y-a[k].y)*(a[j].y-a[k].y);
num+=(a[j].z-a[k].z)*(a[j].z-a[k].z);
ans1=sqrt(num);
if(ans1<ans2)
{
ans2=ans1;
t=k;
}
}
}
}
}
if(ans2==9999999)
ans2=0;
ans+=ans2;
a[t].flag=1;
}
printf("%.2lf\n",ans);
}
return 0;
}