演算法:隨機增量法、最小圓覆蓋、單點確定乙個最小圓
隨機增量法簡介:略,見:oi-wiki
最小圓覆蓋:在平面上有n個點,求乙個半徑最小的圓,能覆蓋所有的點。
演算法:
假設圓o是前i-1個點的最小覆蓋圓,那麼在加入乙個點i,如果在圓上或圓內不考慮,否則新得到的最小覆蓋圓一定經過第i個點。
以p[1]為基礎一直加j點。
因為三點確定乙個圓,所以迴圈三次。
時間複雜度:o(n)
解決問題:洛谷1742:最小圓覆蓋
模板:
#include #define ll long long
using namespace std;
const ll maxn = 1e5 + 10;
const double eps = 1e-8;
struct mincircle p[maxn], st[maxn], o;
double sqr(double x)
double dis(point a, point b)
bool cmp(double a, double b)
//讀入
void read()
//三點確定乙個圓。也可以當作是乙個模板
point geto(point a, point b, point c) else if (cmp(b1, 0)) else
return ans;
}void mainwork(ll il, ll ir) }}
}//列印都給放進來,當然,可以按需要自己列印。不呼叫他就ok了
void print()
} m;
int main()
最小圓覆蓋 模板題
include const int maxn 1005 struct tpoint struct tcircle struct t tcircle c tpoint a maxn double distance tpoint p1,tpoint p2 double area t t tcircle ...
最小圓覆蓋
最小圓覆蓋。神奇的隨機演算法。當點以隨機的順序加入時期望複雜度是線性的。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 的最小圓覆蓋內...