并查集
将初始状态视为n个集合
将边排序
每次
将长度最小而且端点在两个集合里的边的两个端点
合并进同一个集合
直到剩下K个集合
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<climits>
#include<string>
#include<cstdlib>
#include<ctime>
#define MOD 1000000007
#define LL long long
using namespace std;
struct edge
{
int p1,p2;
double d;
}pro[1000005];
int n,k,i,j,cnt,num,f[1005],f1,f2;
double dis,x[1005],y[1005];
bool comp(edge a,edge b)
{
if(a.d<b.d) return true;
return false;
}
int find(int x)
{
if(x==f[x]) return x;
else return find(f[x]);
}
int main()
{
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
f[i]=i;
for(i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
{
dis=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
cnt++;
pro[cnt].p1=i;
pro[cnt].p2=j;
pro[cnt].d=dis;
}
sort(pro+1,pro+cnt+1,comp);
num=n;
for(i=1;i<=cnt;i++)
{
f1=find(pro[i].p1);
f2=find(pro[i].p2);
if(num==k)
{
if(f1!=f2)
{
printf("%.2lf",pro[i].d);
return 0;
}
}
else
{
if(f1!=f2)
{
f[f1]=f2;
num--;
}
}
}
return 0;
}