//很简单的克鲁斯卡尔算法,注意细节就容易AC了//
AC代码:
#include<stdio.h> #include<math.h> #include<string.h> #include<algorithm> using namespace std; #define N 10000005 int p[N]; struct node { int x,y,z,z1,z2; double c; } t[N],T[N]; int n,cnt; int cmp(node p,node q) { return p.c<q.c; } int find(int k) { if(p[k]==k) { return p[k]; } else { return find(p[k]); } } double cl() { double sum=0; int s=0; for(int i=0; i<cnt; i++) { int X=find(T[i].z1); int Y=find(T[i].z2); if(X!=Y&&T[i].c>=10.000000&&T[i].c<=1000.000000) { p[Y]=X; s++; sum+=T[i].c; } if(s==n-1) { return sum; } } return -1; } int main() { int u; scanf("%d",&u); while(u--) { scanf("%d",&n); if(n==1||n==0) { printf("0\n"); } else { int i,j; for(i=0; i<=n; i++) { p[i]=i; } for(i=0; i<n; i++) { scanf("%d%d",&t[i].x,&t[i].y); t[i].z=i+1; } cnt=0; for(i=0; i<n; i++) { for(j=i+1; j<n; j++) { double d=sqrt((double)((t[j].x-t[i].x)*(t[j].x-t[i].x)+(t[j].y-t[i].y)*(t[j].y-t[i].y))); T[cnt].c=d; T[cnt].z1=t[i].z; T[cnt].z2=t[j].z; cnt++; } } sort(T,T+cnt,cmp); double s=cl(); if(s!=-1) { double o=s*100.0; printf("%0.1f\n",o); } else { printf("oh!\n"); } } } return 0; }