最小生成树裸题没看出来QAQ,连通块数小于k就输出。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
int read()
{
char ch=getchar();int f=0;
while(ch<'0'||ch>'9')ch=getchar();
while(ch>='0'&&ch<='9'){f=(f<<1)+(f<<3)+ch-'0';ch=getchar();}
return f;
}
struct node
{
int from;
int to;
double w;
}edge[1000005];
int tot,n,m,fa[1005],a[1005],b[1005];
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
void add(int u,int v,double w)
{
edge[tot].from=u;
edge[tot].to=v;
edge[tot].w=w;
tot++;
}
bool cmp(node x,node y)
{
return x.w<y.w;
}
int main()
{
n=read(),m=read();int block=n;
for(int i=1;i<=n;i++)
{
a[i]=read(),b[i]=read();
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
add(i,j,sqrt(1.00*(a[i]-a[j])*(a[i]-a[j])+1.00*(b[i]-b[j])*(b[i]-b[j])));
}
}
for(int i=1;i<=n;i++)
fa[i]=i;
sort(edge,edge+tot,cmp);
for(int i=0;i<tot;i++)
{
int fx=find(fa[edge[i].from]),fy=find(fa[edge[i].to]);
if(fx!=fy)
{
if(block==m)
{
printf("%.2lf",edge[i].w);
return 0;
}
else
{
fa[fx]=fy;
block--;
}
}
}
}