最小覆蓋圓的增量演算法

2021-06-16 21:31:30 字數 917 閱讀 2617

題意:給出平面上的一些點,要求用乙個最小的圓,把所有的點包圍起來。

最小覆蓋圓, 增量法:

假設圓o是前i-1個點得最小覆蓋圓,加入第i個點,如果在圓內或邊上則什麼也不做。否,新得到的最小覆蓋圓肯定經過第i個點。

然後以第i個點為基礎(半徑為0),重複以上過程依次加入第j個點,若第j個點在圓外,則最小覆蓋圓必經過第j個點。

重複以上步驟(因為最多需要三個點來確定這個最小覆蓋圓,所以重複三次)。遍歷完所有點之後,所得到的圓就是覆蓋所有點得

最小圓。

證明可以考慮這麼做:

最小圓必定是可以通過不斷放大半徑,直到所有以任意點為圓心,半徑為半徑的圓存在交點,此時的半徑就是最小圓。所以上述定

理可以通過這個思想得到。這個做法複雜度是o(n)的,當加入圓的順序隨機時,因為三點定一圓,所以不在圓內概率是3/i,求出期

望可得是o(n)。

#include #include #include #include #include using namespace std;

const double eps=1e-8;

struct point

;point p[505];

double dist(point a,point b)

/***返回三角形的外心 */

point circumcenter(point a,point b,point c)

/***c為圓心,r為半徑 */

void min_cover_circle(point *p,int n,point &c,double &r)

}} }

}int main()

{ int n;

point c;

double r;

while(~scanf("%d",&n)&&n)

{ for(int i=0;i

最小覆蓋圓

最小覆蓋圓解決的問題模板大概是 在乙個平面內的很多點中,找出乙個最小的圓,使之覆蓋所有的點。假設點的個數為 n nn,最小覆蓋圓面積為 rrr。當 n 1 n 1 n 1 時,毋庸置疑,此時 r 0 r 0 r 0 當 n 2 n 2 n 2 時,此時r應該為 r d is p oint 1,po ...

最小覆蓋圓的神奇演算法及例題

最近翔哥上課講計算幾何這個神奇玩意。然後一堆新高一創新班的都特high,然後我們一堆初二的zz全程懵逼。但是剛開始講的這個東西還是令人耳目一新的。何為最小覆蓋圓,顧名思義,就是覆蓋平面內所有點的最小的圓。原來隨機化演算法這麼強勁?好了我們來看這個演算法 隨機增量法 一看名字就知道,先要把輸入的點打亂...

hdu 3932 最小覆蓋圓 隨機演算法做法

找出乙個點使得這個店到n個點的最長距離最短,即求最小覆蓋圓的半徑 用乙個點往各個方向擴充套件,如果結果更優,則繼續以當前步長擴充套件,否則縮小步長 view code include include include const double pi acos 1.0 struct point p 10...