UVA 10034 By ACReaper

来源:互联网 发布:ar软件下载 编辑:程序博客网 时间:2024/05/21 14:54
#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;const int maxn = 15024;int u[maxn];int v[maxn];double w[5 * maxn];int r[5 * maxn];int fa[maxn];struct pos{double x,y;};pos A[maxn];int cmp(const int a,const int b){return w[a] < w[b];}int find(int root){return root == fa[root]?root:find(fa[root]);}int main(){int tc;scanf("%d",&tc);for(int t = 1; t <= tc; t++){int n;scanf("%d",&n);for(int i = 1 ; i <= n; i++){scanf("%lf%lf",&A[i].x,&A[i].y);}memset(w,0,sizeof(w));int k = 1;for(int i = 1; i <= n; i++){//构建完全图 for(int j = i + 1;j <= n; j++){double d = sqrt((A[i].x - A[j].x) * (A[i].x - A[j].x) + (A[i].y - A[j].y) * (A[i].y - A[j].y));u[k] = i,v[k] = j,w[k++] = d;}}double ans = 0.0;int num_e = n * (n - 1) /2;for(int i = 1; i <= n; i++)fa[i] = i;for(int i = 1; i <= num_e; i++)r[i] = i;sort(r + 1,r + 1 + num_e,cmp);//for(int i = 1; i <= num_e;i++){int e = r[i];int x = find(u[e]);//找到起点int y = find(v[e]);if( x != y){fa[x] = y;ans += w[e];} }printf("%s", t == 1? "" : "\n");printf("%.2lf\n",ans);}return 0;}


2013 05 07

By ACReaper