平面最近點對問題正如其名,給定平面上的$n$個點,找出其中的一對點,使得這對點的距離在所有點對中最小。
首先顯而易見地我們可以得到這個問題的$o(n^2)$演算法,列舉所有點對即可。但是很顯然我們可以注意到,這裡面有很多點對顯然不是最優的,那麼我們可以想到一種剪枝方法,就是將只對x座標差值小於當前已知最小值的點對進行判斷(否則必然不是最優解),從而減少判斷量。
我們考慮使用分治來實現這種剪枝,先將平面上的點分為兩部分,分治求出兩部分內部的最近點對距離。之後我們要做的就是列舉兩個集合之間的點對,並與兩部分內部的最近點對距離比較來得到最近點對距離。這裡我們是不需要列舉所有點對的,因為我們已經得到了乙個兩部分各自內部最小的點對距離,因而我們可以結合上面的根據$x$座標的剪枝方法,只列舉分別屬於兩部分的$x$座標差小於已知最小距離的點對。
這樣做的複雜度近似於$o(n\log^2n)$,至於怎麼得到的……我也不知道。_(:зゝ∠)_
例題:另外附上模板:
注意,本模板保留六位小數,不能直接用於提交上面的例題,若要提交請修改輸出精度。
1 #include 2 #include 3 #include 4 #include 5 #include6 #include 7 #include 8 #include 9 #include 10
#define the_best_pony "rainbow dash"
1112
using
namespace
std;
13const
int maxn=220000,inf=~0u>>1;14
15struct
point
22}p[maxn];
2324
intn;
25double
ans;
2627
double disp(int a,int
b)30
31double getans(int l,int
r)42}43
return
len;44}
4546
intmain()
平面最近點對問題詳解
演算法 0 把所有的點按照橫座標排序 1 用一條豎直的線l將所有的點分成兩等份 2 遞迴算出左半部分的最近兩點距離d1,右半部分的最近兩點距離d2,取d min d1,d2 3 算出 乙個在左半部分,另乙個在右半部分 這樣的點對的最短距離d3。4 結果 min d1,d2,d3 關鍵就是這第3步。貌...
平面最近點對問題求解
問題描述 最近點對問題是指求解平面點集n個點中距離最近的兩個點間的問題。為簡單起見,在二維座標平面來考慮該問題。如果說討論的點以標準二維座標給出,則有點 本章主要通過兩種方法來求解 蠻力法分治法 顧名思義,蠻力法指的就是通過遍歷所有解之後通過對比求出最近點對問題。基本思路 對平面中的n個點兩兩進行組...
平面最近點對問題詳解
演算法 0 把所有的點按照橫座標排序 1 用一條豎直的線l將所有的點分成兩等份 2 遞迴算出左半部分的最近兩點距離d1,右半部分的最近兩點距離d2,取d min d1,d2 3 算出 乙個在左半部分,另乙個在右半部分 這樣的點對的最短距離d3。4 結果 min d1,d2,d3 關鍵就是這第3步。貌...