圆的半径就是三角形中最短边的一半
因此我们枚举所有的边,从大到小维护bitset
如果对于当前边的两点,已经有一个点与他们相连,那么说明这条边就是答案
#include<bits/stdc++.h> typedef long long ll; using namespace std; typedef pair<int,int> pll; const int N=9e6+10; const int inf=0x3f3f3f3f; const int mod=1e9+7; struct node{ int x,y; }s[3010]; bitset<3010> bt[3010]; ll get(int i,int j){ return (s[i].x-s[j].x)*(s[i].x-s[j].x)+(s[i].y-s[j].y)*(s[i].y-s[j].y); } struct SQ{ ll dis; int x,y; }e[N]; int cnt; bool cmp(SQ a,SQ b){ return a.dis>b.dis; } int main(){ //ios::sync_with_stdio(false); int n; cin>>n; int i; for(i=1;i<=n;i++){ cin>>s[i].x>>s[i].y; } for(i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ ll dis=get(i,j); e[++cnt]={dis,i,j}; } } sort(e+1,e+1+cnt,cmp); for(i=1;i<=cnt;i++){ bitset<3010> tmp=bt[e[i].x]&bt[e[i].y]; if(tmp.count()){ printf("%.7f ",sqrt(e[i].dis)/2.0); return 0; } bt[e[i].x][e[i].y]=1; bt[e[i].y][e[i].x]=1; } return 0; }