注意数据是实数,直接用了Prime结合并查集就可以了
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const int NN = 100 + 5, INF = 99999999;
double a[NN][NN], xx[NN], yy[NN];
int f[NN];
int find(int x)
{
if (x == f[x]) return x;
f[x] = find(f[x]);
return f[x];
}
int mer(int x, int y)
{
x = find(x);
y = find(y);
if (x != y)
f[x] = y;
return 1;
}
double dis(int i, int j)
{
return sqrt((xx[i] - xx[j]) * (xx[i] - xx[j]) + (yy[i] - yy[j]) * (yy[i] - yy[j]));
}
int main()
{
int n, x, y;
double sum;
while (scanf("%d", &n) != EOF)
{
sum = 0;
for (int i = 0; i <= NN; i++)
f[i] = i;
if (n == 0) break;
for (int i = 1; i <= n; i++)
cin >> xx[i] >> yy[i];
for (int i = 1; i <= n; i++)
{
a[i][i] = INF * 1.0;
for (int j = i + 1; j <= n; j++)
a[j][i] = a[i][j] = dis(i, j);
}
while (1)
{
int flag = 1;
double min0 = INF * 1.0;
for(int i = 1; i <= n; i++)
for (int j = 1; j <= i; j++)
if (a[i][j] < min0 && find(i) != find(j))
{
min0 = a[i][j];
x = i;
y = j;
flag = 0;
}
if (flag) break;
sum += min0;
mer(x, y);
}
printf("%.2lf\n", sum);
}
return 0;
}