标签:覆盖 int sq 最小 sqrt A1 枚举 A2 简笔
用最小的圆覆盖平面上的n个点,通常采用O(n)的随机增量法。
定理:如果点集S的最小覆盖圆覆盖不了P,那么{P∪S}的最小覆盖圆一定过P。
首先将n个点random_shuffle。
设当前的⚪是C,如果枚举到Pi在圆外,则限定Pi在圆上,从1 ~ i-1枚举j,如果枚举到Pj在圆外,则限定Pj在圆上,从1 ~ j-1枚举k,如果枚举到Pk在圆外,则用(Pi,Pj,Pk)的外接圆更新当前圆。看起来是三层循环,但是由于有随机化,可以证明复杂度是O(n)的。
Q Circle(P A,P B,P C){
double A1=2*(B.x-A.x),
B1=2*(B.y-A.y),
C1=sq(B.x)+sq(B.y)-sq(A.x)-sq(A.y),
A2=2*(C.x-B.x),
B2=2*(C.y-B.y),
C2=sq(C.x)+sq(C.y)-sq(B.x)-sq(B.y);
double a=sqrt(sq(B.x-C.x)+sq(B.y-C.y)),
b=sqrt(sq(A.x-C.x)+sq(A.y-C.y)),
c=sqrt(sq(A.x-B.x)+sq(A.y-B.y)),
p=(a+b+c)/2,
S=sqrt(p*(p-a)*(p-b)*(p-c));
return (Q){(P){(C1*B2-C2*B1)/(A1*B2-A2*B1),(A1*C2-A2*C1)/(A1*B2-A2*B1)},a*b*c/4/S};
}
Q Mcircle(int l,int r){
for(int i=l;i<=r;i++)a[i]=b[i];
random_shuffle(a+l,a+r+1);
Q Cir=Q{P{0.0,0.0},0.0};
for(int i=l;i<=r;i++)
if(dist(Cir.p,a[i])>Cir.r+1e-7){
Cir=Q{a[i],0};
for(int j=l;j<i;j++)
if(dist(Cir.p,a[j])>Cir.r+1e-7){
Cir=Q{P{(a[i].x+a[j].x)/2,(a[i].y+a[j].y)/2},dist(a[i],a[j])/2};
for(int k=l;k<j;k++)
if(dist(Cir.p,a[k])>Cir.r)
Cir=Circle(a[i],a[j],a[k]);
}
}
return Cir;
}
标签:覆盖,int,sq,最小,sqrt,A1,枚举,A2,简笔 来源: https://www.cnblogs.com/impyl/p/16368028.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。