**:
題意:給出平面上的一些點,要求用乙個最小的圓,把所有的點包圍起來。
最小覆蓋圓, 增量法
假設圓o是前i-1個點得最小覆蓋圓,加入第i個點,如果在圓內或邊上則什麼也不做。否,新得到的最小覆蓋圓肯定經過第i個點。
然後以第i個點為基礎(半徑為0),重複以上過程依次加入第j個點,若第j個點在圓外,則最小覆蓋圓必經過第j個點。
重複以上步驟(因為最多需要三個點來確定這個最小覆蓋圓,所以重複三次)。遍歷完所有點之後,所得到的圓就是覆蓋所有點得最小圓。
證明可以考慮這麼做:
最小圓必定是可以通過不斷放大半徑,直到所有以任意點為圓心,半徑為半徑的圓存在交點,此時的半徑就是最小圓。所以上述定理可以通過這個思想得到。這個做法複雜度是o(n)的,當加入圓的順序隨機時,因為三點定一圓,所以不在圓內概率是3/i,求出期望可得是o(n)。
#include#include#include#includeusing namespace std;
const double eps=1e-8;
struct pointp[505];
double dis(const point &a,const point &b)
point circumcenter(const point &a,const point &b,const point &c)
void min_cover_circle(point *p,int n,point &c,double &r)
} }
} }
int main(){
int n;
point c;
double r;
while(scanf("%d",&n)==1 && n){
for(int i=0;i
HDU3007 求解最小圓覆蓋 模擬退火?
這次先上 再證明 的可行性,感覺有點不像模擬退火,因為這個 借用的實際上是乙個完全單調的函式 只有乙個極值點,就是說只有乙個低谷,那個點實際上就是答案,就是全域性最優 就不自己寫 了,獻上網上找到的一段 這段 的思路其實就是先找乙個點作為起始點p,然後不斷找到和該點距離最遠的點a,然後將p向a慢慢挪...
hdu3007 最小覆蓋圓問題
題目 buried memory 最小圓覆蓋,很經典的問題。題目大概是,平面上n個點,求乙個半徑最小的圓,能夠覆蓋所有的點。如果要求乙個最小覆蓋圓,這個圓至少要由三個點確定。有一種演算法就是任意取三個點作圓,然後判斷距離圓心最遠的點是否在圓 內,若在,則完成 若不在則用最遠點更新這個圓。這裡不仔細介...
HDU 3007 隨機增量法
題目大意 給定平面上 n 個點,求最小圓覆蓋 我就是抄了個板而已 q 為什麼是 o n 的 a 搖頭搖頭搖頭 q 三角形外心怎麼求 a 不知道 q 學這個有什麼用 a 一臉懵逼 q 怎麼什麼都不知道 a 窩弱嘛tat 怎麼覺得自己又抽了 三角形外心 我知道泥萌都會。因為到各點距離相等,有 x 1 x...