看到最小最大,显然是经典二分
因此只需要枚举最大距离进行check
如果能存在k组或以上能满足组间距离大于等于mid
那么就可以放大,否则缩小
#include<iostream> #include<algorithm> #include<stack> #include<vector> #include<cstring> #include<set> #include<map> using namespace std; typedef long long ll; const int N=3e5+10; const int INF=0x3f3f3f3f; int n,k; int cnt; int vis[N]; double x[N],y[N]; double dis[1005][1005]; void dfs(int u,double x){ int i; for(i=1;i<=n;i++){ if(dis[u][i]<x&&!vis[i]){ vis[i]=1; dfs(i,x); } } } bool check(double x){ int cnt=0; memset(vis,0,sizeof vis); for(int i=1;i<=n;i++){ if(!vis[i]){ cnt++; dfs(i,x); } } return cnt>=k; } int main(){ //ios::sync_with_stdio(false); cin>>n>>k; int i; for(i=1;i<=n;i++){ cin>>x[i]>>y[i]; } double mx=0; int j; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(i!=j) dis[i][j]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); mx=max(dis[i][j],mx); } } double l=0,r=mx; while(r-l>0.0001){ double mid=(l+r)/2; if(check(mid)) l=mid; else r=mid; } printf("%.2f ",l); }