給你n個點,讓你求出最近的兩個點的距離。
第一行輸入乙個整數n,接下來n行,每行兩個數,表示點的橫縱座標。
測試樣例:
12-1 3
-2 -2
1 -4
2 11 5
3 33 0
5 17 3
7 65 6
3 7輸出結果:
1.41421
solve方法
暴力法:理所當然,就是遍歷所有的點,求出所有可能的結果,取最小值。
時間複雜度:o(n^2)
/*
最近點對問題------暴力法
*/#include#include#includeusing namespace std;
const int maxn = 1e5 + 5;
struct nodea[maxn];
void solve(int n)}}
cout << "最近點對為點" << p1 << "和點" << p2 << endl;
cout << "最近點對的距離為" << sqrt(min_dis) << endl;
}int main()
分治法:用分治法解決最近點對問題,很自然的想法就是將這個集合分成兩個子集s1和s2,每個子集中有n/2個點,然後在每個子集中遞迴求其最近點對。
當然,在這過程中要注意一種特殊情況,就是在求完每個子集的最近點對合併的時候,從在乙個漏洞,那就是中軸線兩邊的點還沒有考慮(這個圖中表現為p3和q3),此時還需在求一下中軸線兩端最近點對的情況。
最近點對問題------分治法
*/#include#include#include#includeusing namespace std;
const int maxn = 1e5 + 5;
struct nodep[maxn], q[maxn];
bool cmp(node a, node b)
bool cmp1(node a, node b)
double solve_dis(node a, node b)
double solve(node p, int l, int r)
sort(q, q + t, cmp1);
for(int i = 0; i < t; i++)
}return res;
}int main()
分治 最近點對問題
利用分治方法的經典問題 最近點對問題 closest pair of points problem 問題描述 n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。問題分析 該題直觀的解決方法便是brute force 暴力求解 利用分治思想進行求解。首先分析題目,符合分治法的適用條件,規模越小...
分治 最近點對問題
最近點對問題 在平面內有點集 s s 包含 n 個點。已知每個點的座標 x,y 求最近的兩點之間的距離 n 2 如果存在重合的兩個點,最近距離記為0。列舉的方法時間複雜度是o n 2 通過分治可以將時間複雜度降為o nlog n 利用一條直線將平面上的所有點集 s 分成兩部分s1 s2,分別計算這兩...
最近點對問題 遞迴,分治
問題描述 在二維平面上的n個點中,找出最近的一對點,就是最近點對問題。如下 include include include using namespace std 頂點座標 typedef struct point 操作頂點座標 typedef struct tpoint double d 10e6...