首先感謝博主讓我收穫很多,今天感覺很睏,狀態不佳,解析與講解會改天補上,註明:我這裡採用遞迴時是左閉右開區間,而博主採用的左閉右閉。
還有感謝「nx」童鞋為我調好vs2017,之前因為環境問題一直裝不上,不過vs2017的除錯是真的好用啊,哈哈!
code
#include #include #include #define inf 0x3f3f3f3f
using namespace std;
const int maxn = 1005;
typedef struct point
point;
int n;
point p[maxn];
double dist(point p1, point p2)
bool cmp(point p1, point p2)
bool cmp2(point p1, point p2)
double solve(int left, int right)
if (right - left == 2)
int mid = (left + right) / 2;
double d1 = solve(left, mid);
double d2 = solve(mid, right);
double d = min(d1, d2);
int l = left;
while (p[l].x < p[mid].x - mid && l < right) l++;
int r = right - 1;
while (p[r].x > p[mid].x + d && r >= left) r--;
sort(p + l, p + r + 1, cmp2);
double d3;
for (int i = l; i <= r; i++) }
return d;
}int main()
分治法求最近點對問題
分治法 1 演算法描述 已知集合s中有n個點,分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次 選擇一條垂線l,將s拆分左右兩部分為sl和sr l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有 可能導致sl 和sr中點數...
分治法求最近點對問題
1 演算法描述 已知集合s中有n個點,分治法的思想就是將s進行拆分,分為2部分求最近點對。演算法每次 選擇一條垂線l,將s拆分左右兩部分為sl和sr,l一般取點集s中所有點的中間點的x座標來劃分,這樣可以保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有 可能導致sl 和sr中點數目乙個為...
分治法求最近點對
1 演算法描述 1.分割 將集合s進行以垂直於x軸的直線l進行平均劃分,並且保證sl和sr中的點數目各為n 2,否則以其他方式劃分s,有可能導致sl和sr中點數目乙個為1,乙個為n 1,不利於演算法效率,要盡量保持樹的平衡性 依次找出這兩部分中的最小點對距離 l和 r,記sl和sr中最小點對距離 m...