(最短點對) Raid P3417

2021-06-19 03:55:27 字數 817 閱讀 6455

題意: 在座標上有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 相當...