在点与点之间两两连边,边按边权从大到小排序。
从大到小依次加边,当图中首次出现三元环时,可以画出满足要求的圆,此时加入的这条边/2就是最大半径。
是否出现环可以用bitset位运算判断。
1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<bitset> 8 using namespace std; 9 const int mxn=3030; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 struct pt{int x,y;}a[mxn]; 17 struct edge{int x,y;double w; 18 }e[mxn*mxn/2]; 19 int cmp(const edge a,const edge b){return a.w>b.w;} 20 int ect=0; 21 bitset<3030>b[3030]; 22 int n; 23 int main(){ 24 int i,j; 25 n=read(); 26 for(i=1;i<=n;i++){ 27 a[i].x=read();a[i].y=read(); 28 } 29 for(i=1;i<n;i++) 30 for(j=i+1;j<=n;j++){ 31 e[++ect]=(edge){i,j,sqrt((double)(a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y))}; 32 } 33 sort(e+1,e+ect+1,cmp); 34 for(i=1;i<=ect;i++){ 35 int u=e[i].x,v=e[i].y; 36 if((b[u]&b[v]).any()){ 37 printf("%.8f ",e[i].w/2);return 0; 38 } 39 b[u][v]=1;b[v][u]=1; 40 } 41 return 0; 42 }