題意: 在座標上有n個點,和另外n個點,求這兩個點集合之間的最短點對距離是多少
思路:分治的思想,把點對分成兩半,分別比較距離。然後再尋找這兩半之間有沒有更短的距離。
時間複雜度為:n*logn*logn
**:
#include#include#includeusing namespace std;
#define n 200010
struct my
go[n],cur[n];
int n;
bool cmpx(my a,my b)
double min(double a,double b)
double mindis(int l,int r)
{ //cout<<"**** "<=r)
return dis(go[l],go[r]);
if (l+2==r)
return min(dis(go[l],go[l+1]),min(dis(go[l],go[r]),dis(go[l+1],go[r])));
int mid=(l+r)/2;
double ans=min(mindis(l,mid),mindis(mid+1,r));
int i,j;
int num=0;
for (i=l;i<=mid;i++) if (go[mid].x-go[i].x<=ans)
cur[num++]=go[i];
for (i=mid+1;i<=r;i++) if (go[i].x-go[i].x<=ans)
cur[num++]=go[i];
for (i=0;i
28 幾何演算法 點集中最短距離點對的距離
求取輸入點集最近點對的距離 相比於對所有點對窮舉,並得出結果的方式相比,本演算法時間複雜度為 nlg n 優於窮舉下的 n 2 extern c class algorithmlib mindistance class flagpoint mindistance mindistance double...
全點對間最短路徑(弗洛伊德演算法)
之前學單源最短路徑的時候,學到狄克斯特拉演算法,我在想,如果對每個頂點都求它的單源最短路徑,那不就可以得到全點對之間的最短路徑了嗎?這樣算下來時間複雜度在o v v e log v 但是,狄克斯特拉演算法有個問題,不能適用於權值為負數的邊,所以,當有權值為負數的邊的時候,需要用到弗洛伊德演算法。弗洛...
平面二維點對最短距離求解問題
二維點對,先隨機生成平面點,再把平面上的點劃分成左右兩部分,我覺得其實無所謂左右點的多少,對結果沒有影響,記錄最短距離的點,比較中線附近的點的距離。include include include include using namespace std const double inf 1e20 相當...