包含點集所有點的最小圓的演算法
最小圓覆蓋
相關題目最小球包含 平面上有n個點,給定n個點的座標,試找乙個半徑最小的圓,將n 個點全部包圍,點可以在圓上。 1. 在點集中任取3點a,b,c。 2. 作乙個包含a,b,c三點的最小圓,圓周可能通過這3點,也可能只通過其中兩點,但包含第3點.後一種情況圓周上的兩點一定是位於圓的一條直徑的兩端。 3. 在點集中找出距離第2步所建圓圓心最遠的d點,若d點已在圓內或圓周上,則該圓即為所求的圓,演算法結束.則,執行第4步。 4. 在a,b,c,d中選3個點,使由它們生成的乙個包含這4個點的圓為最小,這3 點成為新的a,b,c,返回執行第2步。若在第4步生成的圓的圓周只通過a,b,c,d 中的兩點,則圓周上的兩點取成新的a和b,從另兩點中任取一點作為新的c。 程式設計題解上的解題報告:對於乙個給定的點集a,記mincircle(a)為點集a的最小外接圓,顯然,對於所有的點集情況a,mincircle(a)都是存在且惟一的。需要特別說明的是,當a為空集時,mincircle(a)為空集,當a=時,mincircle(a)圓心座標為a,半徑為0; 顯然,mincircle(a)可以有a邊界上最多三個點確定(當點集a中點的個數大於 1時,有可能兩個點確定了mincircle(a)),也就是說存在著乙個點集b,|b|<=3 且b包含與a,有mincircle(b)=mincircle(a).所以,如果a不屬於b,則 mincircle(a-)=mincircle(a);如果mincircle(a-)不等於mincircle(a),則 a屬於b。 所以我們可以從乙個空集r開始,不斷的把題目中給定的點集中的點加入r,同時維護r的外接圓最小,這樣就可以得到解決該題的演算法。
貼**.
#include
<
stdio.h
>
#include
<
math.h
>
#include
<
string
.h>
#define
maxn 20
struct
pointset;
const
double
precison
=1.0e-8
;pointset maxcic, point[maxn];
double
radius;
intcurset[maxn], posset[3];
intset_cnt, pos_cnt;
inline
double
dis_2(pointset
&from, pointset
&to)
intin_cic(
intpt)
intcal_mincic()
else
if(pos_cnt==2
)return1;
}int
mindisk()
inttt
=curset[
--set_cnt];
intres
=mindisk();
set_cnt++;
if(!res ||!
in_cic(tt))
return
res;
}int
main()
set_cnt
=n; pos_cnt=0
;for(i=
0;i<
n ;i
++) curset[i]=i;
mindisk();
printf(
"%.2lf %.2lf %.2lf\n
", maxcic.x, maxcic.y, radius);
}return0;
}
最小圓覆蓋
最小圓覆蓋。神奇的隨機演算法。當點以隨機的順序加入時期望複雜度是線性的。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 ...