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\n",sqrt(q[i].d));
50                             return 0;             
51               }
52           }
53       }
54 }

并查集,每次把最近的两个点合并,直到只有k个块。

posted on 2016-03-16 05:56  xiyuedong  阅读(137)  评论(0编辑  收藏  举报