平面最近點對

2022-06-25 01:48:08 字數 1377 閱讀 9578

首先排除暴力列舉.

如果把平面分割為兩個平面,分別求出其中的最近點對的距離,再考慮兩點分別在兩個平面內部的情況,相比暴力列舉就省去了很多不必要的檢查.

假設在左右平面裡分別求最近點對的距離並取兩者最小值得d,那麼現在要檢查是否存在分別位於左右平面的兩點有更短的距離,那麼只需要檢查下圖紅線內的點:

某一平面中在兩條紅線以外並且與另一平面中某點構成距離小於d的點是顯然不存在的.

要檢查紅線內部且跨越兩平面的最近點對問題,這題可以簡單的轉化為規模更大但處理更簡單的問題:尋找紅線內的最近點對距離,不要求跨越兩平面.這裡使用了如下演算法:

①將區域內的點按照y座標公升序排列.初始化這個區域內的ans_mid為d.(或者inf,等效)

②依次對y最小到最大的每乙個點,順序列舉其上方的點(從而列舉的點的y座標是非遞減的),求出距離並更新ans_mid,如果這個過程中發現距離超過ans_mid了,break.

這個方法保證不會發現在同一側的兩點有著小於d的距離.某個點列舉到同側點不會對答案造成影響,所以小於d的ans_mid只可能出現在位於不同側的兩點之間.

以上過程把原始問題分解為了三個問題:左側內部的解,右側內部的解,跨越左右側的中間區域的解.並且這時已經求出了中間區域的解.

現在的問題是求解兩個面積是原始問題面積一半的平面內的解.不斷地這樣分治下去,最終會達到一種情況,使得平面內只有兩個點/乙個點,這時直接返回兩點間的距離/inf即可.後者是由於此規模下的問題無意義,返回inf以避免造成影響.

**實現起來沒有想象的那麼困難.

#include #include 

#include

#include

#include

using

namespace

std;

#define inf 1e9 + 1typedef pair

pdd;

intn;

pdd s[

200010], tmp[200010

];double

dist(pdd a, pdd b)

bool cmpy(pdd a, pdd b)

double solve(int l, int

r)

return

ans;

}int

main()

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...