zoukankan      html  css  js  c++  java
  • 【洛谷P1991】无线通讯网

    无线通讯网

    题目链接

    先克鲁斯卡尔连上p-s条边,这样就会有s个连通块,每个连通块内装一个卫星电话,就大功告成了

    #include<algorithm>
    #include<cstdio>
    #include<cmath>
    #include<iostream>
    using namespace std;
    #define N 510
    int s,p,cnt,fa[N],tot;
    double x[N],y[N],ans;
    inline double Dis(int a,int b){
        return sqrt((x[a]-x[b])*(x[a]-x[b])+(y[a]-y[b])*(y[a]-y[b]));
    }
    struct Edge{
        int s,t;
        double w;
    } e[N*N];
    inline bool cmp(Edge a,Edge b){
        return a.w<b.w;
    }
    inline int find(int x){
        return fa[x]==x?x:fa[x]=find(fa[x]);
    }
    inline void unionn(int x,int y){
        fa[find(x)]=find(y);
    }
    int main()
    {
        scanf("%d%d",&s,&p);
        for(int i=1;i<=p;i++)
         scanf("%lf%lf",&x[i],&y[i]);
        for(int i=1;i<=p;i++)
         fa[i]=i;
        for(int i=1;i<p;i++)
         for(int j=i+1;j<=p;j++)
          if(i!=j){
              e[++cnt].s=i;
              e[cnt].t=j;
              e[cnt].w=Dis(i,j);
          }
        sort(e+1,e+1+cnt,cmp);
        for(int i=1;i<=cnt;i++)
            if(find(e[i].s)!=find(e[i].t)){
                unionn(e[i].s,e[i].t);
                tot++;
                if(tot==p-s){
                    ans=e[i].w;
                    break;
                }
            }
        printf("%.2lf
    ",ans);
        return 0;
    } 
  • 相关阅读:
    143. Reorder List
    圆圈中最后剩下的数
    求1+2+3+...+n
    不用加减乘除做加法
    构建乘积数组
    199. Binary Tree Right Side View
    把字符串转换成整数
    java stream
    物流运费的维护架构
    9、定义类与方法
  • 原文地址:https://www.cnblogs.com/yjkhhh/p/9414680.html
Copyright © 2011-2022 走看看