hdu 1007 二維最近點問題 分治法

2022-08-17 14:39:18 字數 1646 閱讀 3449

最近點對可能出現的三個區域: sl 、sr、l兩側(l-d ~ l+d) 其中d為sl sr 中的最近點距離 

以下**參照:

1 #include2 #include3 #include4 #include5

using

namespace

std;67

const

int n = 100005;8

9 typedef struct

tagpoint point;

1314

point a[n], b[n], c[n];

1516

bool cmp_x(const point a, const

point b)

1920

bool cmp_y(const point a, const

point b)

2324

double

dis(point p, point q)

2829

void merge(point b, point c, int l, int m, int

r) 35

while(p1 <= m) b[i++] = c[p1++];

36while(p2 <= r) b[i++] = c[p2++];

37 memcpy(c+l, b+l, (r-l+1)*sizeof

(point));38}

3940

double closest(point a, point b, point c, int l, int

r) 50

int mid = (l+r)/2;51

inti, j, k;

52for(i = l, j = l, k = mid+1; i <= r; ++i)

56double d1 =closest(a, c, b, l, mid);//次操作會使」b的值「改變,因此60行要通過c還原b;

57double d2 = closest(a, c, b, mid+1

, r);

58double dm =min(d1, d2);

5960

merge(b, c, l, mid, r);

61for(i = l, k = l; i <= r; ++i) 65}

66for(i = l; i != k; ++i) 71}

72return

dm;73}74

75int

main()

81 sort(a, a+n, cmp_x);

82for(int i = 0; i != n; ++i)

85 memcpy(b, a, sizeof

(a));

86 sort(b, b+n, cmp_y);//b存點按縱座標公升序後的排列

87 printf("

%.2lf\n

", closest(a, b, c, 0, n-1) / 2

);88}89

return0;

90 }

HDU 1007 二維最近點對問題 分治

發現兩兩比較的問題都可以用分治辦法解決 很多排序都這樣 hdu 1007 問題描述 找到最小的圓半徑,使得每次套中的玩具只能是乙個。就是找最近點對的距離,再除2 include include include include using namespace std struct pointp 100...

hdu1007 最近點對

題意 給你n個點,讓你求最近的兩個點的距離是多少.思路 這個題目我沒思路,我在網上看的是什麼分治 鴿巢原理,分治我知道,鴿巢原理我也知道,但是這個題目就是沒有證明出來他和鴿巢原理有jm關係,總之就是先以x或者y優先sort一下,然後每次列舉每個相鄰點的附近5個就行了 加自己一共六個 而且這個題目的前...

HDU 1007 最近點對

分治法求最近點對 遞迴將點不斷分成小組,計算最短距離。此時的最短距離僅僅是兩點都屬兩塊的某一塊 這裡的分割點是mid點 還需要考慮兩點分屬兩塊的情況。這時對於選點則把範圍縮小到了以mid為中心。再將距離mid點x軸2 mindist範圍點考慮在內。在這些點中,再取mid點,留下那些 y的距離不大於m...