链接
https://www.luogu.org/problemnew/show/P1991
大意
求给定 个点,求 条边形成的生成树中的最长边
思路
库鲁思卡尔
代码
#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);//输出
}