核心是分治演算法
分別根據點的 x,y 值進行排序
在 x 軸上劃一道垂線, 將點均分成兩半
假設最近點對都在左/右部分, 遞迴計算左/右半部分的最短距離
並返回較小值 dis
假設最近點對分別在左右兩個部分, 橫跨中心的豎線. 中心線為中心,
2*dis 為寬度畫乙個矩形, 橫跨中心線的最近點對 candidate 都在這個矩形內.
將這些點按照 y 值的大小加入到陣列中. 遍歷陣列中的點, 將該點與其後的
7 個點計算距離, 返回最小距離
為什麼僅和 7 個點作對比呢. 因為已經假設 dis 是左右不分最近點對的最小值,
這就說明在乙個長(寬)為 dis 的正方形內, 至多有 4 個點. 長為 dis*2,
寬為 dis 的長方形至多 8 個.
上**
#include #include #include #include const double inf = 1e20;//10^20,科學計數方法
const int n = 100005;
struct point
point[100005]; //point用來儲存輸入的坐班點
int n;
int tmpt[100005];//tmpt用來儲存,中間區域點的順序
int cmpxy(const void *a, const void *b) //對所有的點進行橫座標公升序排序
int cmpy(const void *a, const void * b) //中間區域排序
double min(double a, double b)
double dis(int i, int j)//計算兩點間的距離
double closest_pair(int left, int right)//求解最近點對
qsort(tmpt,k,sizeof(int),cmpy);//分離出來的區間點,縱座標進公升序排序
// for(i=0;id3)
d = d3;}}
}// printf("d02=%.4f\n",d);
return d; }
int main()
洛谷P1429 平面最近點對(加強版)
給定平面上n個點,找出其中的一對點的距離,使得在這n個點的所有點對中,該距離為所有點對中最小的 輸入格式 第一行 n 2 n 200000 接下來n行 每行兩個實數 x y,表示乙個點的行座標和列座標,中間用乙個空格隔開。輸出格式 僅一行,乙個實數,表示最短距離,精確到小數點後面4位。輸入樣例 1 ...
題解 洛谷 P1429 平面最近點對(加強版)
p1429 平面最近點對 加強版 分治。左邊的最近距離為 dl 右邊的最近距離為 dr 如何得到整塊的最近距離?我們所需要做的就是計算兩塊之間距離小於 d min dl,dr 的點之間的距離然後取最小值。先把兩塊中距離 mid 的水平距離小於 d 的點加入乙個集合,然後按縱座標排序暴力去計算距離。可...
p1429 平面最近點對
題意 給平面n個點,求最近的兩個點的距離。思路 運用分治思想,對於n個點,可以分成t n 2 t n 2 的規模,分界線是x座標的中位數,假設左邊點集合為s1,右邊點集合為s2,那麼最小值存在於以下三種情況中。1.s1中任意兩點距離的最小距離 2.s2中任意兩點距離的最小距離 3.s1中的點到s2中...