1 2 #include<cstdio> 3 #include<iostream> 4 #include<cmath> 5 #include<algorithm> 6 #define M 1008 7 struct data 8 { 9 int a1,a2,d; 10 }q[M*M]; 11 int x[M],y[M],n,k,cnt,fa[M],sum1; 12 bool cmp(data b1,data b2) 13 { 14 return b1.d<b2.d; 15 } 16 int zhao(int a1) 17 { 18 if(fa[a1]==a1) 19 return a1; 20 fa[a1]=zhao(fa[a1]); 21 return fa[a1]; 22 } 23 using namespace std; 24 int main() 25 { 26 scanf("%d%d",&n,&k); 27 for(int i=1;i<=n;i++) 28 scanf("%d%d",&x[i],&y[i]); 29 for(int i=1;i<=n;i++) 30 for(int j=i+1;j<=n;j++) 31 { 32 cnt++; 33 q[cnt].a1=i; 34 q[cnt].a2=j; 35 q[cnt].d=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]); 36 } 37 sort(q+1,q+cnt+1,cmp); 38 for(int i=1;i<=n;i++) 39 fa[i]=i; 40 for(int i=1;i<=cnt;i++) 41 { 42 int b1=zhao(q[i].a1),b2=zhao(q[i].a2); 43 if(b1!=b2) 44 { 45 n--; 46 fa[b1]=b2; 47 if(n<k) 48 { 49 printf("%.2lf ",sqrt(q[i].d)); 50 return 0; 51 } 52 } 53 } 54 }
并查集,每次把最近的两个点合并,直到只有k个块。