點集的最小圓覆蓋

2021-05-28 08:07:39 字數 1823 閱讀 7691

包含點集所有點的最小圓的演算法

最小圓覆蓋

相關題目最小球包含 平面上有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 ...