題意:給出平面上的一些點,要求用乙個最小的圓,把所有的點包圍起來。
最小覆蓋圓, 增量法:
假設圓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...