最近點對可能出現的三個區域: sl 、sr、l兩側(l-d ~ l+d) 其中d為sl sr 中的最近點距離
以下**參照:
1 #include2 #include3 #include4 #include5using
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...