【洛谷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\n",ans);
    return 0;
} 

 

posted @ 2018-08-03 16:04  yjk  阅读(115)  评论(0编辑  收藏  举报