这道题就是最小生成树的题,给n个点的坐标,求最小生成树第一次wa了,错误很低级,忘记反过来给左下角的元素赋值了
代码如下:
#include <cstdio>
#include <cstring>
#include <cmath>
const int Max = 101;
int T, n;
double map[Max][Max], x[Max], y[Max];
double prim() {
double inf, ans = 0.0;
bool vis[Max];
memset(vis, 0, sizeof(vis));
int m = n - 1, u, v;
vis[1] = true;
for ( int k = 0; k < m; ++k ) {
inf = 999999999.0;
for( int i = 1; i <= n; ++i )
if ( !vis[i] && map[1][i] < inf ) { inf = map[1][i], v = i; } //map[1][i]就是用来当做closed[i]使用的,将已选择的点构成的连通分量看做一个点,都记为点“1”,然后选择到1最短的边
vis[v] = true;
ans += sqrt(inf);
for( int i = 1; i <= n; ++i )
if ( !vis[i] && map[v][i] < map[1][i] ) map[1][i] = map[v][i];
}
return ans;
}
int main()
{
while ( scanf( "%d", &T ) != EOF ) {
bool fl = false;
while ( T-- ) {
scanf("%d", &n);
for( int i = 1; i <= n; ++i ) scanf("%lf%lf", &x[i], &y[i]);
for( int i = 1; i <= n; ++i ) {
map[i][i] = 99999999990.0;
for( int j = i + 1; j <= n; ++j )
map[j][i] = map[i][j] = ( x[i] - x[j] )*( x[i] - x[j] ) + ( y[i] - y[j] )*( y[i] - y[j] );
}
printf("%.2lf\n", prim());
if ( T ) printf("\n");
}
}
}