zoukankan      html  css  js  c++  java
  • 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
    ",ans);
    53     return 0;
    54 }
    View Code

    fighting!

  • 相关阅读:
    适配问题
    屏幕适配
    软键盘适配
    即时通讯
    缩减APK包大小
    基于RulesEngine的业务规则实现
    基于NXBRE规则引擎实现的柔性折扣策略
    SQL Server代码如何快速格式化
    SQL Server 跨库同步数据
    HTML+AngularJS+Groovy如何实现登录功能
  • 原文地址:https://www.cnblogs.com/Frank-King/p/9715456.html
Copyright © 2011-2022 走看看