凸包和最小覆蓋圓問題

2022-04-11 17:22:42 字數 1427 閱讀 3642

給出平面上的一些點,求覆蓋這些點的最小圓。

具體問題可以見hdu 2215。

具體解法是,先求凸包,然後列舉凸包上任意3個點,若列舉的三個點構成鈍角三角形,則最大半徑為最長邊的一半

否則,半徑r=a*b*c/(4*s)其中s是面積,具體面積可以用叉乘求得,s=(向量a叉乘向量b)的絕對值的一半。

view code

1 #include2 #include

3 #include4 #include5

using

namespace

std;67

struct

node8;

1213 node point[110

];14

intn;

1516

double

dist(node a,node b)

1720

21double

mul(node p,node a,node b)

2225

26int

cmp(node a,node b)

2735

36int stack[110

],top;

3738

void

tubao()

3949}50

51double max(double a,double

b)52

5556

intmain()

5770

/*********************************

*///

凸包71 k=0;72

for(i=1;i)

7379 swap(point[0

],point[k]);

80 sort(point+1,point+n,cmp);

81tubao();

82/*

********************************

*/83

double ans=0

,temp,ares;

84if(top<3)85

90for(i=0;i)

91106

else

if(b==d)

107111

if(a*a+b*b//

鈍角三角形

112115

else

116119 ans=max(ans,temp);

120}

121}

122}

123 printf("

%.2lf\n

",ans+0.5

);124

}125

return0;

126 }

最小覆蓋圓

最小覆蓋圓解決的問題模板大概是 在乙個平面內的很多點中,找出乙個最小的圓,使之覆蓋所有的點。假設點的個數為 n nn,最小覆蓋圓面積為 rrr。當 n 1 n 1 n 1 時,毋庸置疑,此時 r 0 r 0 r 0 當 n 2 n 2 n 2 時,此時r應該為 r d is p oint 1,po ...

hdu3007 最小覆蓋圓問題

題目 buried memory 最小圓覆蓋,很經典的問題。題目大概是,平面上n個點,求乙個半徑最小的圓,能夠覆蓋所有的點。如果要求乙個最小覆蓋圓,這個圓至少要由三個點確定。有一種演算法就是任意取三個點作圓,然後判斷距離圓心最遠的點是否在圓 內,若在,則完成 若不在則用最遠點更新這個圓。這裡不仔細介...

FJOI2015 最小覆蓋雙圓問題

給定平面上n個點 x 1,y 1 x n,y n x1 y1 xn yn 找出2個半徑相同的圓r 1r1 和r 2r2 覆蓋給定的n個點,且半徑最小。設計乙個演算法,計算出所求最小覆蓋雙圓 r 1r1 和 r 2r2 的半徑。輸入有多個測試例項。每個例項的第1行中給出正整數n,n 1000,表示平面...