UVa10034

这道题就是最小生成树的题,给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"); } } }


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值