Eddy's picture

来源:互联网 发布:淘宝无线视频无法订购 编辑:程序博客网 时间:2024/06/14 10:26


http://acm.hdu.edu.cn/showproblem.php?pid=1162

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
struct edge
{
 int a,b;
 double c;
};
int route[10010];
edge ans[10010];
int f[110];
int get(int x)
{
 if(f[x]==x)
  return x;
 else
 {
  f[x]=get(f[x]);
  return f[x];
 }
}
bool merge(int x,int y)
{
 int u=get(f[x]);
 int v=get(f[y]);
 if(u!=v)
 {
  f[v]=u;
  return true;
 }
 return false;
}
bool cmp(edge x,edge y)
{
 if(x.c<y.c)
  return true;
 else
  return false;
}
int main()
{
 int n,i,j,k;
 double a[110],b[110];
 while(cin>>n)
 {
  for(i=1;i<=n;i++)
   cin>>a[i]>>b[i];
  k=1;
  for(i=1;i<=n;i++)
   for(j=i+1;j<=n;j++)
   {
    ans[k].a=i;
    ans[k].b=j;
    double temp=(a[i]-a[j])*(a[i]-a[j])+(b[i]-b[j])*(b[i]-b[j]);
    ans[k++].c=sqrt(temp);
   }
  sort(ans+1,ans+k,cmp);
  int count=0;
  double sum=0;
  for(i=1;i<=n;i++)
   f[i]=i;
  for(i=1;i<k;i++)
  {
   if(merge(ans[i].a,ans[i].b))
   {
    count++;
    sum+=ans[i].c;
   }
   if(count==n-1)
    break;
  }
  printf("%.2f\n",sum);
 }
 return 0;
}

0 0
原创粉丝点击