題目: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...