最小圓覆蓋,隨機增量法.

來源:互聯網
上載者:User
#include<iostream>#include<cstdio>#include<cmath>/*    algorithm:  A、令Ci表示為前i個點的最小覆蓋圓。當加入新點pi時如果pi不在Ci-1裡那麼pi必定在Ci的邊界上。  B、再從新考慮這樣一個問題,Ci為前i個點最小覆蓋圓且p在Ci的的邊界上!同理加入新點pi時如果p  i不在Ci-1裡那麼pi必定在Ci的邊界上。這時我們就包含了兩個點在這個最小圓的邊界上。  C、再從新考慮這樣一個問題,Ci為前i個點最小覆蓋圓且有兩個確定點再邊界上!此時先讓  O(N)的方法能夠判定出最小圓。   ------------------------------------------------------------------------------------  analysis:  現在來分析為什麼是線性。  C是線性這是顯然的。  B<-C的過程中。考慮pi 他在園內的機率為 (i-1)/i 。在圓外的機率為 1/i 所以加入pi的期望複雜度為:    (1-i)/i*O(1) +(1/i)*O(i) {前者在園內那麼不進入C,只用了O(1)。    後者進入C用了O(i)的時間}這樣分析出來,複雜度實際上仍舊  是線性。  A<-B的過程中。考慮方法相同,這樣A<-B仍舊是線性。於是難以置信的最小圓覆蓋的複雜度變成了線性。*/ using namespace std;struct node{    double x,y;};int n;node p[1000001];double r;node O;double dist(node a,node b){        return sqrt( (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y) );}void calc(double a,double b,double c,double d,double e,double f)  //給出兩條直線ax+by+c=0,dx+ey+f=0 求交點{                                  //注意到三角形裡兩條中垂線不可能平行,所以不會產生除0錯誤      O.y=(c*d-f*a)/(b*d-e*a);     O.x=(c*e-f*b)/(a*e-b*d);}int main(){     freopen("circle.in","r",stdin);     freopen("circle.out","w",stdout);     int m;    scanf("%d",&m);    scanf("%d",&n);    int l,ll;    for (int i=1;i<=n;++i)     {      scanf("%lf%lf",&p[i].x,&p[i].y);    }     O=p[1];r=0;                  //初始C1          for(int i=2;i<=n;++i)            //A     if(dist(O,p[i])>r+1e-6)      {         O=p[i];r=0;         for (int j=1;j<=i-1;++j)        //B         if (dist(O,p[j])>r+1e-6)          {             O.x=(p[i].x+p[j].x)/2;             O.y=(p[i].y+p[j].y)/2;             r=dist(O,p[j]);             for (int k=1;k<=j-1;++k)        //C             if (dist(O,p[k])>r+1e-6)             {                calc(p[j].x-p[i].x,p[j].y-p[i].y,(p[j].x*p[j].x+p[j].y*p[j].y-p[i].x*p[i].x-p[i].y*p[i].y)/2,                     p[k].x-p[i].x,p[k].y-p[i].y,(p[k].x*p[k].x+p[k].y*p[k].y-p[i].x*p[i].x-p[i].y*p[i].y)/2);                r=dist(O,p[k]);             }          }     }     printf("%.2lf\n",r);     //while(1);     return 0; }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.