題目鏈結
題目大意: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 ...