最小圓覆蓋

2021-10-22 02:58:53 字數 1341 閱讀 3783

最小圓覆蓋問題

在乙個平面上,給出 n 個點,求包圍這些點的最小圓,輸出圓心及半徑。

分析雖然可以用模擬退火或者三分套三分,

這裡只講隨機增量法,

隨機增量法是一種確定性演算法,隨機意義下均攤複雜度 o(n),而且可以達到很高的精度(可達到 10−10 量級)

有事實:如果點 p 不在集合 s 的最小圓覆蓋內,則 p 一定在 s∪ 的最小圓覆蓋上。

易知,當 n 個點的分布隨機時,因為三點定一圓,所以乙個點不在圓上的概率為 3/i(也就外接圓上的3個點不在圓上)

根據這個定理,我們可以分三次確定前 i 個點的最小圓覆蓋:

1.令前 i−1 個點的最小覆蓋圓為 c

2.如果第 i 個點在 c 內,則前 i 個點的最小覆蓋圓也是 c

3.如果不在,那麼第 i 個點一定在前 i個點的最小覆蓋圓上,接著確定前 i−1 個點中還有哪兩個在最小覆蓋圓上。因此,設當前圓心為 pi,半徑為 0,做固定了第 i 個點的前 i 個點的最小圓覆蓋。

4.固定了乙個點:不停地在範圍內找到第乙個不在當前最小圓上的點 pj,設當前圓心為 (pi+pj)/2,半徑為 |pipj|/2,做固定了兩個點的,前 j 個點外加第 i 個點的最小圓覆蓋。

5.固定了兩個點:不停地在範圍內找到第乙個不在當前最小圓上的點 pk,設當前圓為 pi,pj,pk 的外接圓。

最後利用中垂線3點定圓

#include

#include

#include

#include

#include

using

namespace std;

const

double eps=

1e-8

;const

int maxn =

100000+10

;struct point

;point p[maxn]

;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()

return0;

}

最小圓覆蓋

最小圓覆蓋。神奇的隨機演算法。當點以隨機的順序加入時期望複雜度是線性的。algorithm a 令ci表示為前i個點的最小覆蓋圓。當加入新點pi時如果pi不在ci 1裡那麼pi必定在ci的邊界上。b 再從新考慮這樣乙個問題,ci為前i個點最小覆蓋圓且p在ci的的邊界上!同理加入新點pi時如果p i不...

最小圓覆蓋

本來不想學的 於是今天就碰到一道大裸題 例題 bzoj2823 求最小圓覆蓋n個點。偽 如下 把所有點隨機化,設為 x 1 y 1 x n y n 開始把圓心設為x 1 半徑設為0 for i 2ton 如果i號點在當前圓內則跳過 那麼i號點就在圓周上 把1號點和i號點作為直徑作乙個圓 for j ...

最小圓覆蓋

1.首先將所有點隨機排列 2.按順序依次將點加入已經建好的圓中,每新增乙個點就進入步驟3 3.如果點i在當前最小圓的外部,那麼說明點i一定在前i個點構成的最小圓的邊界上 因為要保證最小圓 進入步驟4處理 如果點i在當前最小圓的內部,則返回步驟2 4.此時已經確定點i一定在前i個點所構成的最小圓的邊界...