d表示选择的值,d越大,连通块的数量越少,d越小连通块的数量越多,因为d越大表示可通信范围越大,因此点之间联通的概率更大。所有村庄均配备电话。
因此,只需要在kruskal过程中记录连通块数量首次≤k的时候的d值,此时不连通的块之间可以分配卫星网络。
#include<iostream>
#include<cmath>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N=510,M=N*N/2;
int p[N];
int n,k,m;
PII q[N];
struct edge{
int a,b;
double w;
bool operator< (const edge &t) const{
return w<t.w;
}
}e[M];
double get_dist(PII a,PII b){
int dx=a.x-b.x;
int dy=a.y-b.y;
return sqrt(dx*dx+dy*dy);
}
int find(int x){
if(x!=p[x]) p[x]=find(p[x]);
return p[x];
}
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>q[i].x>>q[i].y;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
e[m++]={i,j,get_dist(q[i],q[j])};
sort(e,e+m);
for(int i=1;i<=n;i++) p[i]=i;
int cnt=n;
double res=0;
for(int i=0;i<m;i++){
if(cnt<=k) break;
int a=find(e[i].a),b=find(e[i].b);
double w=e[i].w;
if(a!=b){
cnt--;
p[a]=b;
res=w;
}
}
printf("%.2lf",res);
return 0;
}