提交时间:2024-05-08 15:51:25
运行 ID: 29465
#include<bits/stdc++.h> using namespace std; #define int long long const int MAXN=210,inf=1000000000; int n,m,k,a[MAXN],b[MAXN],p[MAXN],t; double ans,dis[MAXN][MAXN]; struct side{ int u,v;double w; bool operator <(const side&G)const{ return w<G.w; } }s[MAXN]; int vis[MAXN],bel[MAXN]; #define inx int i=h[u],v=edge[i].v;i;i=edge[i].nx,v=edge[i].v struct Edge{int v,nx;}edge[MAXN*MAXN<<1];int h[MAXN],CNT;void init(){memset(h,0,sizeof(h));CNT=0;}void add_side(int u,int v){edge[++CNT]={v,h[u]};h[u]=CNT;edge[++CNT]={u,h[v]};h[v]=CNT;} bool xyl(int u,int t){ if(vis[u]==t)return 0; vis[u]=t; for(inx){ if(!bel[v]||xyl(bel[v],t)){ bel[v]=u; return 1; } } return 0; } #define pdd pair<double,double> #define fr first #define sc second #define x1 x114514 #define y1 y114514 pdd gts(int x1,int y1,int x2,int y2){ double k,b; if(x1!=x2)k=(y1-y2)/(x1-x2),b=y1-x1*k; else k=0,b=x1; return {k,b}; } bool sx(int x,int y,int k,int b){ return k?x*k+b<=y:x<=b; } bool check(int x,int y){ init(); int ans=0,r=dis[x][y]; pdd kb=gts(a[x],b[x],a[y],b[y]);t=0; for(int i=1;i<=n;i++){ if(i==x||i==y)continue; if(dis[i][x]<=r&&dis[i][y]<=r){ p[++t]=i; } } for(int i=1;i<=t;i++){ vis[i]=0; if(sx(a[i],b[i],kb.fr,kb.sc))continue; for(int j=1;j<=t;j++){ if(!sx(a[i],b[i],kb.fr,kb.sc))continue; if(dis[i][j]>r)add_side(i,j); } } for(int i=1;i<=t;i++){ if(sx(a[i],b[i],kb.fr,kb.sc))continue; if(xyl(i,i))ans++; } return t-ans>=m-2; } void slv(){ scanf("%lld%lld",&n,&m); for(int i=1;i<=n;i++){ scanf("%lld%lld",&a[i],&b[i]); } if(m==1){ printf("0.000000"); return; } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ dis[i][j]=dis[j][i]=sqrt(1.0*(a[i]-a[j])*(a[i]-a[j])+1.0*(b[i]-b[j])*(b[i]-b[j])); s[++k]={i,j,dis[i][j]}; } } sort(s+1,s+k+1); for(int i=1;i<=k;i++){ if(check(s[i].u,s[i].v)){ printf("%.6f",s[i].w); return; } } } signed main(){ slv(); return 0; }