1336 1337 2823 最小圓覆蓋

2021-08-15 17:50:10 字數 1243 閱讀 6098

題目鏈結

題目大意:rt

題解:隨機增量法……設圓c

i 表示前i個點的最小覆蓋圓,當加入點i時,若其在ci

−1外則說明ci

肯定經過第i個點,以點0和點i確定ci

然後再從前i個點中找到類似的j,前j個點中找到類似的k,三點定圓

求三角形外心可以直接按照定義……

最小圓必定是可以通過不斷放大半徑,直到所有以任意點為圓心,半徑為半徑的圓存在交點,此時的半徑就是最小圓。所以上述定理可以通過這個思想得到。這個做法複雜度是o(n)的,當加入圓的順序隨機時,因為三點定一圓,所以不在圓內概率是3/i,求出期望可得是o(n)

我的收穫:模板++

#include 

using

namespace

std;

#define eps 1e-8

const

int n=100005;

int n;

double r;

struct point

point(double _,double __)

void read()

}p[n],c;

typedef point vector;

vector operator + (vector a,vector b)

vector operator - (vector a,vector b)

vector operator * (vector a,double p)

vector operator / (vector a,double p)

double dot(vector a,vector b)

double cross(vector a,vector b)

point mid(point a,point b)

vector normal(vector a)

double dis(point a,point b)

struct line

line(point _,vector __)

};point getlineintersection(line a,line b)

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

void min_cover_circle()}}

}void work()

void init()

最小圓覆蓋

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

最小圓覆蓋

最小圓覆蓋問題 在乙個平面上,給出 n 個點,求包圍這些點的最小圓,輸出圓心及半徑。分析雖然可以用模擬退火或者三分套三分,這裡只講隨機增量法,隨機增量法是一種確定性演算法,隨機意義下均攤複雜度 o n 而且可以達到很高的精度 可達到 10 10 量級 有事實 如果點 p 不在集合 s 的最小圓覆蓋內...

最小圓覆蓋

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