注意数据类型,使用double!
#include <cstdio>
#include <cmath>
#include <cstring>
const int N = 110;
struct Node {
double x, y;
}point[N];
int n;
double g[N][N];
const double INF = 10000000000.0;
const double eps = 1e-9;
double prim() {
double ans = 0.0, mi;
bool vis[N];
memset( vis, 0, sizeof(vis));
vis[0] = true;
int v;
for ( int u = 0; u < n-1; ++u ) {
mi = INF;
for ( int i = 0; i < n; ++i ) if ( !vis[i] && mi - g[0][i] > eps ) mi = g[0][i], v = i;
ans += sqrt(mi);
vis[v] = true;
for ( int i = 0; i < n; ++i ) if ( !vis[i] && g[0][i] - g[v][i] > eps ) g[0][i] = g[v][i];
}
return ans;
}
double dis( int i, int j ) {
return (point[i].x - point[j].x)*(point[i].x - point[j].x) + (point[i].y - point[j].y)*(point[i].y - point[j].y);
}
int main()
{
while ( scanf("%d", &n) != EOF && n ) {
for ( int i = 0; i < n; ++i )
scanf("%lf%lf", &point[i].x, &point[i].y);
for ( int i = 0; i < n; ++i )
for ( int j = i; j < n; ++j )
if ( i == j ) g[i][j] = INF;
else g[i][j] = g[j][i] = dis( i, j );
printf("%.2lf\n", prim());
}
}