最小圆覆盖
并不知道为什么是O(n)的,而且要随机化点的顺序
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<cstdio> 6 #include<string> 7 #include<cmath> 8 #include<ctime> 9 #include<queue> 10 #include<stack> 11 #include<map> 12 #include<set> 13 #define rre(i,r,l) for(int i=(r);i>=(l);i--) 14 #define re(i,l,r) for(int i=(l);i<=(r);i++) 15 #define Clear(a,b) memset(a,b,sizeof(a)) 16 #define inout(x) printf("%d",(x)) 17 #define douin(x) scanf("%lf",&x) 18 #define strin(x) scanf("%s",(x)) 19 #define LLin(x) scanf("%lld",&x) 20 #define op operator 21 #define CSC main 22 typedef unsigned long long ULL; 23 typedef const int cint; 24 typedef long long LL; 25 using namespace std; 26 const double eps=1e-8; 27 double f(const long double &a){return a*a;} 28 void inin(int &ret) 29 { 30 ret=0;int f=0;char ch=getchar(); 31 while(ch<'0'||ch>'9'){if(ch=='-')f=1;ch=getchar();} 32 while(ch>='0'&&ch<='9')ret*=10,ret+=ch-'0',ch=getchar(); 33 ret=f?-ret:ret; 34 } 35 struct xl 36 { 37 double x,y; 38 xl(double x=0.,double y=0.):x(x),y(y){} 39 xl op + (const xl &rhs){return xl(x+rhs.x,y+rhs.y);} 40 xl op / (const double &rhs){return xl(x/rhs,y/rhs);} 41 void in(){douin(x),douin(y);} 42 }; 43 double dis(const xl &a,const xl &b) 44 { 45 return sqrt(f(a.x-b.x)+f(a.y-b.y)); 46 } 47 xl di[555]; 48 int n; 49 xl outoftriangle(const xl &A,const xl &B,const xl &C) 50 { 51 double bx=B.x-A.x,by=B.y-A.y; 52 double cx=C.x-A.x,cy=C.y-A.y; 53 double area=2*(bx*cy-by*cx); 54 double x=(cy*(f(bx)+f(by))-by*(f(cx)+f(cy)))/area+A.x; 55 double y=(bx*(f(cx)+f(cy))-cx*(f(bx)+f(by)))/area+A.y; 56 return xl(x,y); 57 } 58 xl solve(double &r) 59 { 60 xl ret; 61 random_shuffle(di+1,di+n+1); 62 ret=di[1];r=0.; 63 re(i,2,n)if(dis(di[i],ret)>r+eps) 64 { 65 ret=di[i],r=0.; 66 re(j,1,i-1)if(dis(di[j],ret)>r+eps) 67 { 68 ret=(di[i]+di[j])/2.; 69 r=dis(di[j],ret); 70 re(k,1,j-1)if(dis(di[k],ret)>r+eps) 71 { 72 ret=outoftriangle(di[i],di[j],di[k]); 73 r=dis(di[i],ret); 74 } 75 } 76 } 77 return ret; 78 } 79 int main() 80 { 81 while(scanf("%d",&n)&&n) 82 { 83 re(i,1,n)di[i].in(); 84 double r; 85 xl c=solve(r); 86 printf("%.2f %.2f %.2f\n",c.x,c.y,r); 87 } 88 return 0; 89 }