传送门
裸得kruscal。
输出最小生成树上第K-1大的边
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#define N 1000005
using namespace std;
struct ppp{
int x,y,v;
}a[500005];
bool cmp(ppp a,ppp b){return a.v<b.v;}
int f[1005],x[1005],y[1005],tot,n,k,xx,yy;
int get(int x){return f[x]==x?x:f[x]=get(f[x]);}
int main(){
scanf("%d%d",&n,&k);
for (int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for (int i=1;i<=n;i++)
for (int j=i+1;j<=n;j++){
tot++;
a[tot].x=i;
a[tot].y=j;
a[tot].v=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
sort(a+1,a+tot+1,cmp);
for (int i=1;i<=n;i++) f[i]=i;
for (int i=1;i<=tot;i++){
xx=get(a[i].x);
yy=get(a[i].y);
if (xx!=yy){
n--;
f[xx]=yy;
if (n<k){
printf("%.2lf",sqrt(a[i].v));
return 0;
}
}
}
}