提交时间:2024-05-08 15:58:23

运行 ID: 29475

#include <bits/stdc++.h> #define DB double using namespace std; int N,M; struct Pikmin { int x,y; }pik[205]; vector<int>gra[205]; struct Distance { DB d; int u,v; bool operator<(const Distance &j) const{ if(d==j.d) return u<j.u; return d<j.d; } }d[40005]; int tot=0; int vis[205],mat[205]; DB Dist(DB x1,DB x2,DB y1,DB y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } bool Hungary(int u) { if(vis[u]) return 0; vis[u]=1; for(int v:gra[u]) { if(mat[v]==0||Hungary(mat[v])) { mat[v]=u; return 1; } } return 0; } bool Check(int x) { DB dis=d[x].d; int S=d[x].u,T=d[x].v; vector<int>vec; for(int i=1;i<=N;i++) { if(i!=S&&i!=T&&Dist(pik[i].x,pik[S].x,pik[i].y,pik[S].y)<=dis&&Dist(pik[i].x,pik[T].x,pik[i].y,pik[T].y)<=dis) { vec.push_back(i); // printf("!!!%d %d %d %.6lf %.6lfn",i,pik[i].x,pik[i].y,Dist(pik[i].x,pik[S].x,pik[i].y,pik[S].y),Dist(pik[i].x,pik[T].x,pik[i].y,pik[T].y)); } } // printf("%d\n",vec.size()); DB X=pik[S].x-pik[T].x;DB Y=pik[S].y-pik[T].y; DB cx=X*0.5-Y*sqrt(3),cy=X*sqrt(3)+Y*0.5; DB dx=X*0.5+Y*sqrt(3),dy=-X*sqrt(3)+Y*0.5; cx+=pik[T].x,cy+=pik[T].y,dx+=pik[T].x,dy+=pik[T].y; vector<int>U,V; for(int i=1;i<=N;i++) gra[i].clear(),vis[i]=mat[i]=0; for(int i:vec) { if(Dist(pik[i].x,cx,pik[i].y,cy)<=Dist(pik[i].x,dx,pik[i].y,dy)) U.push_back(i); else V.push_back(i); } for(int u:U) { for(int v:V) { if(Dist(pik[u].x,pik[v].x,pik[u].y,pik[v].y)>dis) { gra[u].push_back(v); //printf("%d -> %d\n",u,v); } } } int res=0; for(int i:U) { if(Hungary(i)) res++; memset(vis,0,sizeof(vis)); } // printf("%d %d %.6lf %d\n",S,T,dis,vec.size()-res); return vec.size()-res+2>=M; } int main() { scanf("%d %d",&N,&M); for(int i=1;i<=N;i++) scanf("%d %d",&pik[i].x,&pik[i].y); for(int i=1;i<=N;i++) for(int j=i+1;j<=N;j++) d[++tot]={Dist(pik[i].x,pik[j].x,pik[i].y,pik[j].y),i,j}; sort(d+1,d+tot+1); int l=1,r=tot,mid; DB ans; while(l<=r) { mid=(l+r)>>1; if(Check(mid)) r=mid-1,ans=d[mid].d; else l=mid+1; } printf("%.6lf\n",ans); return 0; }