LOJ 新的开始 【最小生成树】

LOJ  新的开始

 

题目见链接

 

题解:

最小生成树较好题。。。。

因为 K 台有卫星的村庄可以任意通信,所以可以把这 K 个村庄缩成一个点。

则剩下有 N-K+1 个点要连,则这些点的最小生成树上的最大边即为结果。

代码简单:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=505,K=105;
 4 int n,k,x[N],y[N],tot,fa[N];
 5 double ans;
 6 struct node{
 7     int x,y;
 8     double dis;
 9 }e[N*N];
10 inline double doing(int i,int j)
11 {
12     return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
13 }
14 inline bool cmp(node a,node b)
15 {
16     return a.dis<b.dis;
17 }
18 inline int getf(int x)
19 {
20     return fa[x]==x?x:fa[x]=getf(fa[x]);
21 }
22 inline void kruskal()
23 {
24     for (int i=1; i<=n; ++i) fa[i]=i;
25     int num=0;
26     for (int i=1; i<=tot; ++i)
27     {
28         int x=getf(e[i].x),y=getf(e[i].y);
29         if (x!=y)
30         {
31             fa[x]=y;
32             num++;
33             if (num==n-k) { ans=e[i].dis; break; }
34         }
35     }
36 }
37 int main()
38 {
39     scanf("%d%d",&n,&k);
40     for (int i=1; i<=n; ++i)
41     {
42         scanf("%d%d",&x[i],&y[i]);
43     }
44     for (int i=1; i<n; ++i)
45       for (int j=i+1; j<=n; ++j)
46       {
47           e[++tot].x=i,e[tot].y=j;
48           e[tot].dis=doing(i,j);
49       }
50     sort(e+1,e+1+tot,cmp);
51     kruskal();
52     printf("%.2lf\n",ans);
53     return 0;
54 }
View Code

 

 

 

 

fighting!

posted on 2018-09-27 20:35  Frank-King  阅读(279)  评论(0)    收藏  举报