hdu3007 最小覆蓋圓問題

2021-06-16 21:31:30 字數 2055 閱讀 3990

題目:buried memory

最小圓覆蓋,很經典的問題。

題目大概是,平面上n個點,求乙個半徑最小的圓,能夠覆蓋所有的點。

如果要求乙個最小覆蓋圓,這個圓至少要由三個點確定。有一種演算法就是任意取三個點作圓,然後判斷距離圓心最遠的點是否在圓

內,若在,則完成;若不在則用最遠點更新這個圓。這裡不仔細介紹。

這裡介紹的演算法是,先任意選取兩個點,以這兩個點的連線為直徑作圓。再以此判斷剩餘的點,看它們是否都在圓內(或圓上),

如果都在,說明這個圓已經找到。如果沒有都在:假設我們用的最開始的兩個點為p[1],p[2],並且找到的第乙個不在圓內(或圓

上)的點為p[i],於是我們用這個點p[i]去尋找覆蓋p[1]到p[i-1]的最小覆蓋圓。

那麼,過確定點p[i]的從p[1]到p[i-1]的最小覆蓋圓應該如何求呢?

我們先用p[1]和p[i]做圓,再從2到i-1判斷是否有點不在這個圓上,如果都在,則說明已經找到覆蓋1到i-1的圓。如果沒有都

在:假設我們找到第乙個不在這個圓上的點為p[j],於是我們用兩個已知點p[j]與p[i]去找覆蓋1到j-1的最小覆蓋圓。

而對於兩個已知點p[j]與p[i]求最小覆蓋圓,只要從1到j-1中,第k個點求過p[k],p[j],p[i]三個點的圓,再判斷k+1到j-1

是否都在圓上,若都在,說明找到圓;若有不在的,則再用新的點p[k]更新圓即可。

於是,這個問題就被轉化為若干個子問題來求解了。

由於三個點確定乙個圓,我們的過程大致上做的是從沒有確定點,到有乙個確定點,再到有兩個確定點,再到有三個確定點來求圓的工作。

關於正確性的證明以及複雜度的計算這裡就不介紹了,可以去看完整的演算法介紹:

恩。關於細節方面。

a.通過三個點如何求圓?

先求叉積。

若叉積為0,即三個點在同一直線,那麼找到距離最遠的一對點,以它們的連線為直徑做圓即可;

若叉積不為0,即三個點不共線,那麼就是第二個問題,如何求三角形的外接圓?

b.如何求三角形外接圓?

假設三個點(x1,y1),(x2,y2),(x3,y3);

設過(x1,y1),(x2,y2)的直線l1方程為ax+by=c,它的中點為(midx,midy)=((x1+x2)/2,(y1+y2)/2),l1中垂線方程為a1x+b1y=c1;則它的中垂線方程中a1=-b=x2-x1,b1=a=y2-y1,c1=-b*midx+a*midy=((x2^2-x1^2)+(y2^2-y1^2))/2;

同理可以知道過(x1,y1),(x3,y3)的直線的中垂線的方程。

於是這兩條中垂線的交點就是圓心。

c.如何求兩條直線交點?

設兩條直線為a1x+b1y=c1和a2x+b2y=c2。

設乙個變數det=a1*b2-a2*b1;

如果det=0,說明兩直線平行;若不等於0,則求交點:x=(b2*c1 -b1*c2)/det,y=(a1*c2-a2*c1)/det;

#include #include #include #include using namespace std;

struct point

;point a[1005],d;

double r;

double dist(point a,point b)

double cross(point a,point b,point c)

void minidiscwith2point(point p,point q,int n)

else

else if(t2>=t1&&t2>=t3)

else}}

}void minidiscwithpoint(point pi,int n)

}}int main()

r=dist(a[1],a[2])/2.0;

d.x=(a[1].x+a[2].x)/2.0;

d.y=(a[1].y+a[2].y)/2.0;

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

printf("%.2lf %.2lf %.2lf\n",d.x,d.y,r);

}return 0;

}

HDU 3007 最小圓覆蓋

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

HDU3007 求解最小圓覆蓋 模擬退火?

這次先上 再證明 的可行性,感覺有點不像模擬退火,因為這個 借用的實際上是乙個完全單調的函式 只有乙個極值點,就是說只有乙個低谷,那個點實際上就是答案,就是全域性最優 就不自己寫 了,獻上網上找到的一段 這段 的思路其實就是先找乙個點作為起始點p,然後不斷找到和該點距離最遠的點a,然後將p向a慢慢挪...

HDU 3007 隨機增量法

題目大意 給定平面上 n 個點,求最小圓覆蓋 我就是抄了個板而已 q 為什麼是 o n 的 a 搖頭搖頭搖頭 q 三角形外心怎麼求 a 不知道 q 學這個有什麼用 a 一臉懵逼 q 怎麼什麼都不知道 a 窩弱嘛tat 怎麼覺得自己又抽了 三角形外心 我知道泥萌都會。因為到各點距離相等,有 x 1 x...