洛谷P1429 平面最近點對(加強版)

2022-08-19 22:18:17 字數 1115 閱讀 5725

核心是分治演算法

分別根據點的 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中...