【生成树】洛谷P1991 无线通讯网

链接

https://www.luogu.org/problemnew/show/P1991

大意

求给定 p 个点,求 p s 条边形成的生成树中的最长边

思路

库鲁思卡尔

代码

#include<cmath>
#include<cstdio>
#include<algorithm>
#define r(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;int f[501],x[501],y[501],s,p,n;
double ans;
struct node
{
    int from,to;
    double w;
}e[250001];
inline bool cmp(node x,node y){return x.w<y.w;}
inline int find(register int x){return x==f[x]?x:f[x]=find(f[x]);}//查找
inline void judge(register int x,register int y){f[find(x)]=find(y);return;}//合并
inline double dis(register int x,register int y,register int a,register int b)
{
    return sqrt((x-a)*(x-a)+(y-b)*(y-b));//勾股定理
}
signed main()
{
    scanf("%d%d",&s,&p);
    r(i,1,p) f[i]=i,scanf("%d%d",x+i,y+i);
    r(i,1,p-1)
     r(j,i+1,p)
      e[++n]=(node){i,j,dis(x[i],y[i],x[j],y[j])};//建边
    sort(e+1,e+1+n,cmp);//排序
    s=p-s;
    for(register int i=1;i<n,s>0;i++)
    if(find(e[i].from)!=find(e[i].to))
    {
        s--;
        judge(e[i].from,e[i].to);//合并
        ans=max(ans,e[i].w);//求值
    }
    printf("%.2lf",ans);//输出
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81707146