/* 刚開始想错了,我以为必须是相邻的点才干连接。原来无线距离能够随意连接
对最小生成树理解不够深啊 */ #include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> #define N 600 struct node { int u,v; }f[N]; struct nodee{ int u,v; double w; }ff[N*N]; double distance(int i,int j) { return sqrt((f[i].u-f[j].u)*(f[i].u-f[j].u)*1.0+1.0*(f[i].v-f[j].v)*(f[i].v-f[j].v)); } int cmp(const void *a,const void *b) { return (*(struct nodee *)a).w>(*(struct nodee *)b).w?1:-1; } int pre[N]; int find(int x) { if(x!=pre[x]) pre[x]=find(pre[x]); return pre[x]; } int main() { int t,n,m,i,j,k,len,e; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); for(i=0;i<n;i++) scanf("%d%d",&f[i].u,&f[i].v); len=0; for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) { ff[len].u=i+1; ff[len].v=j+1; ff[len++].w=distance(i,j); } for(i=1;i<=n;i++) pre[i]=i; qsort(ff,len,sizeof(ff[0]),cmp); k=0; for(i=0;i<len;i++){ int a=find(ff[i].u); int b=find(ff[i].v); if(a!=b) { pre[a]=b; k++; if(k==n-m)break; } } printf("%.2f\n",ff[i].w); } return 0; }
时间: 2024-10-09 19:13:32