Eddy's picture
Problem descriptions as follows: Given you some coordinates pionts on a drawing paper, every point links with the ink with the straight line, causes all points finally to link in the same place. How many distants does your duty discover the shortest length which the ink draws?
Input contains multiple test cases. Process to the end of file.
解題思路:最小生成樹,類似與prim()算法
代碼如下:
# include<stdio.h>
# include<math.h>
# include<string.h>
struct node{
double x,y;
}a[105],b[105];//b[]保存的是在最小生成樹中的點,a[]保存的不在最小生成樹的點
int v[105];
double len(node a,node b) //計算兩點的距離
{
return sqrt((a.x-b.x)*(a.x-b.x)*1.0+(a.y-b.y)*(a.y-b.y));
}
int main(){
int n;
while(~scanf("%d",&n))
{
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
}
double sum=0;
memset(v,0,sizeof(v));
v[1]=1;
int k=1;
b[k++]=a[1];
while(k<=n)
{ double min=0x3f3f;
int kk;
for(int i=1;i<=n;i++)
{
if(!v[i]) //如果改點不在最小生成樹中
{
for(int j=1;j<k;j++) //找到 到 最小生成樹中點的最短距離的點
{
if(len(a[i],b[j])-min<0.000001)
{
kk=i; //kk就是 到 最小生成樹中點的最短距離的點
min=len(a[i],b[j]);
}
}
}
}
v[kk]=1;
sum+=min;
b[k++]=a[kk]; //將kk這個點加入最小生成樹中
}
printf("%.2f\n",sum);
}
return 0;
}