學習筆記--最小圓覆蓋
阿新 • • 發佈:2018-12-09
隨機化各點後暴力列舉,發現三點定的圓不能包含當前點就更新。。複雜度期望O(n)(不會證。。)
模板題:bzoj1336
#include<bits/stdc++.h> #define db double using namespace std; const int N=100010; const db eps=1e-7;; struct gg{ db x,y; }node[N],O; db r; int dcmp(db x) {return x<-eps?-1:x>eps;} db pf(db x) {return x*x;} db dis(gg x,gg y) {return sqrt(pf(x.x-y.x)+pf(x.y-y.y));} void get(db a1,db b1,db c1,db a2,db b2,db c2) { db k;k=a2/a1; O.y=(c2-k*c1)/(b2-k*b1); O.x=(c1-b1*O.y)/a1; } int idx[N],n; int main() { srand(23336666); scanf("%d",&n); for(int i=1;i<=n;i++)idx[i]=i; random_shuffle(idx+1,idx+n+1); for(int i=1;i<=n;i++) scanf("%lf%lf",&node[idx[i]].x,&node[idx[i]].y); O.x=(node[1].x+node[2].x)/2,O.y=(node[1].y+node[2].y)/2; r=dis(O,node[1]); for(int i=3;i<=n;i++) { if(dcmp(dis(O,node[i])-r)>0) { O=node[i],r=0; for(int j=1;j<i;j++) { if(dcmp(dis(O,node[j])-r)>0) { O.x=(node[i].x+node[j].x)/2; O.y=(node[i].y+node[j].y)/2; r=dis(O,node[i]); for(int k=1;k<j;k++) { if(dcmp(dis(O,node[k])-r)>0) { get( 2*(node[j].x-node[i].x),2*(node[j].y-node[i].y),pf(node[j].x)+pf(node[j].y)-pf(node[i].x)-pf(node[i].y), 2*(node[k].x-node[i].x),2*(node[k].y-node[i].y),pf(node[k].x)+pf(node[k].y)-pf(node[i].x)-pf(node[i].y) ); r=dis(O,node[i]); } } } } } } printf("%.10lf\n",r); printf("%.10lf %.10lf",O.x,O.y); }