最小覆蓋圓的神奇演算法及例題

2022-04-02 23:15:43 字數 1735 閱讀 8996

最近翔哥上課講計算幾何這個神奇玩意。然後一堆新高一創新班的都特high,然後我們一堆初二的zz全程懵逼。

但是剛開始講的這個東西還是令人耳目一新的。

何為最小覆蓋圓,顧名思義,就是覆蓋平面內所有點的最小的圓。

原來隨機化演算法這麼強勁?好了我們來看這個演算法——隨機增量法

一看名字就知道,先要把輸入的點打亂,使其隨機化。玄學

然後就是從第乙個點開始列舉點\(i\),如果當前的列舉的點在圓內部,就繼續不用管(顯然的)。否則就以該點為圓心半徑為\(0\)開始列舉\(j(1\le j < i)\) 。

如果\(j\)在當前圓的外面就取點\(i\)和點\(j\)的中點為圓心,距離的一半為半徑(兩點的最小覆蓋圓)。以這個圓再列舉\(k(1\le k,然後如果點\(k\)在圓外(這和上面的都是一樣的)。就以\(i,j,k\)三點在計算最小覆蓋圓。

而這個最小覆蓋圓就是前\(i\)個點的最小覆蓋圓。

然後最大的問題就在於這個已知三點求圓的圓心及半徑的過程了。這裡給出弱弱的解析幾何方法計算幾何我不會啊

我們要先知道乙個關於圓的公式:

\(x^2+y^2=r^2\)

然後我們設圓心的座標為\((x_0,y_0)\)然後就可以列乙個三元二次方程解出\(x_0,y_0\)的值。

但是具體的解法太過技術性,找到一篇超級詳細的解法。請仔細參閱。

然後就是堅定不移的相信自己是歐皇然後不被卡精度

但是這個複雜度就是玄學\(o(n)\)(具體證明參考dalao『s blog)

板子(就是那個min_cover_circleenglish level is too low)

inline db power(db x)

inline db dis(node a,node b)

inline bool in_circle(node a)

return dis(a,o)<=r?1:0;

}inline void calc(db a,db b,db c,db d,db e,db f)

inline void min_cover_circle(void)

{ register int i,j,k;

random_shuffle(a+1,a+n+1);

for (i=1;i<=n;++i)

if (!in_circle(a[i]))

{o=a[i]; r=0;

for (j=1;j最後求出的o就是原點,r是半徑。

然後我們來看一些板子題:

hdu3007

這題的資料範圍很小。儘管我們\(o(n^3)\)大暴力是可以過的,但是對於新的演算法還是要練習一下。

bzoj1336&&bzoj1337&&bzoj2823

bzoj的資料強度比較高,但那個神奇精度問題實在是。。。。。。

樣例保留兩位,實際上要保留10位,題目也沒講。這是讓我們猜資料範圍麼?

luogu p1742 最小圓覆蓋&&luogu p2533 [ahoi2012]訊號塔

和bzoj的基本就是重題,但是多虧洛谷才搞懂了資料範圍。

莫名弄了乙個玄學省選演算法。還是挺棒的。

最小覆蓋圓的增量演算法

題意 給出平面上的一些點,要求用乙個最小的圓,把所有的點包圍起來。最小覆蓋圓,增量法 假設圓o是前i 1個點得最小覆蓋圓,加入第i個點,如果在圓內或邊上則什麼也不做。否,新得到的最小覆蓋圓肯定經過第i個點。然後以第i個點為基礎 半徑為0 重複以上過程依次加入第j個點,若第j個點在圓外,則最小覆蓋圓必...

hdu 3932 最小覆蓋圓 隨機演算法做法

找出乙個點使得這個店到n個點的最長距離最短,即求最小覆蓋圓的半徑 用乙個點往各個方向擴充套件,如果結果更優,則繼續以當前步長擴充套件,否則縮小步長 view code include include include const double pi acos 1.0 struct point p 10...

最小生成樹演算法及例題

什麼是生成樹?對連通圖進行遍歷,過程中經過的點和邊的組合可看成一棵樹,也叫生成樹 kruskal演算法 世界上有著許許多多的鐵路線 公路線,想要從乙個城市到另乙個城市修一條線路需要許多資金,當然,修路的方式有多種多樣,現在我們想知道如何修路能使得這些城市之間形成乙個通訊網,並且使得總耗費最少呢?如何...