http://acm.hdu.edu.cn/showproblem.php?pid=1162
#include//2235778 2010-03-23 18:04:30 Accepted 1162 0MS 352K 1248 B C++ 悔惜晟
#include//最小生成树的问题 Kruskal
#include//
#include
int aa[4951];
using namespace std;
struct stu
{
double x;
double y;
} df[101];
struct stu1
{
double distance;
int n;
int m;
}df1[4951];
int cmp(stu1 a, stu1 b)
{
return a.distance < b.distance;
}
int find(int a)
{
int r = a;
while(r != aa[r])
r = aa[r];
return r;
}
void merge(int a, int b)
{
if(a > b)
aa[b] = a;
else
aa[a] = b;
}
int main()
{
int n, i, j, num;
double sum;
while(scanf("%d", &n) !=EOF )
{
for(i = 0; i < n; i++)
scanf("%lf%lf", &df[i].x, &df[i].y);
for(i = 1; i <= n*(n-1)/2; i++)
aa[i] = i;
num = 0;
for(i = 0; i < n-1; i++)
for(j = i+1; j < n ;j++)
{
double dis =sqrt(1.0*( (df[i].x - df[j].x) * (df[i].x - df[j].x) + (df[i].y - df[j].y) * (df[i].y - df[j].y)) );
df1[num].n = i+1;
df1[num].m = j + 1;
df1[num].distance = dis;
num++;
}
sum = 0;
sort(df1, df1+num,cmp);
for(i = 0; i< num ; i++)
{
int a = find(df1[i].n);
int b = find(df1[i].m);
if( a != b)
{
sum += df1[i].distance;
merge(a, b);
}
}
printf("%0.2lf/n",sum);
}
}
Eddy's picture hdu1162
最新推荐文章于 2022-02-25 19:38:17 发布