HDU 1162 最小生成树

  这是一道关于最小生成树的简单题,但是我却一直wa  ,到最后才发现有一行语句的位置放错了,写代码的时候的一个粗心,可能导致几个小时的调试,小心,仔细

 

#include<stdio.h>
#include<algorithm>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<iostream>
#define M 102
#define MAX 10003
using namespace std;

int parent[M];

typedef struct
{
int i,j;
double k;
}Node;
Node set[MAX];
int find(int x)
{
if(x!=parent[x]) parent[x]=find(parent[x]);
return parent[x];
}


void UnionSet(int x,int y)
{
x=find(x);
y=find(y);
if(x!=y) parent[x]=y;
}
int cmp(Node a,Node b)
{
return a.k<b.k;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
typedef struct
{
double x,y;
}Point;
Point pt[M];
double x1[102],y1[102];
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&(pt[i].x),&(pt[i].y));
parent[i]=i;
}
int t=0;
for(int i=1;i<=n;i++) //计算任意两点间的距离
{
for(int j=i+1;j<=n;j++)
{
set[t].i=i;
set[t].j=j;
set[t++].k=sqrt((pt[i].x-pt[j].x)*(pt[i].x-pt[j].x)+(pt[i].y-pt[j].y)*(pt[i].y-pt[j].y));
}
}
sort(set,set+t,cmp);
double total=0;
for(int h=0;h<t;h++)
{

if(n==1) break;
if(find(set[h].i)!=find(set[h].j))
{
UnionSet(set[h].i,set[h].j);
total+=set[h].k;
n--;
}
}
printf("%.2f\n",total);
}
return 0;
}

posted @ 2014-04-25 20:26  zhoudan  阅读(84)  评论(0)    收藏  举报