模板 平面最近點對

2022-05-11 05:19:08 字數 2661 閱讀 8501

這個是正確的演算法,但是複雜度可能會卡到 \(o(n^2)\) ,加上每個點最多匹配的臨近點最多15個/30個限制的話複雜度就可以保證了,最多就再做一次增加正確的機率,我確實不行從頭到尾都是隨機的怎麼有人卡得掉。

#includeusing namespace std;

const double pi = acos(-1.0);

struct point p[200000 + 5];

int n;

inline double randomdouble()

inline bool cmp(const point &a, const point &b)

inline double dis(const point &a, const point &b)

double calc(const double &a, double d)

sort(p + 1, p + 1 + n, cmp);

for(int i = 1; i <= n; i++)

return d;

}int main()

分治演算法,雖然每一層裡面都排序,但實際上選出的點並不多。

#includeusing namespace std;

const double inf = 1e36;

const int maxn = 200000;

int n, tmp[maxn];

struct point s[maxn + 5];

bool cmpx(const point &a, const point&b)

bool cmpidy(const int &a, const int &b)

inline double min(const double &a, const double &b)

inline double dist(const int &i, const int &j)

double merge(int left, int right)

return d;

}int main()

效率更高的隨機演算法,但是不能保證正確性因為只取了至多後10個點,假如把這個去掉又有可能被卡成t,不過從旋轉角到旋轉原點都是完全隨機的,多試幾次可能就行了,假如不放心的話可以多calc幾次。

假如取至多後20個點的話應該是極限了,假如後20個點都過不了寧願再重新calc一次吧。

#includeusing namespace std;

const double pi = acos(-1.0);

struct point p[200000 + 5];

int n;

inline double randomdouble()

inline bool cmp(const point &a, const point &b)

inline double dis(const point &a, const point &b)

double calc(const double &a)

sort(p + 1, p + 1 + n, cmp);

double d = 1e36;

for(int i = 1; i <= n; i++)

return d;

}int main()

類似這樣?

#includeusing namespace std;

const double pi = acos(-1.0);

struct point p[200000 + 5];

int n;

inline double randomdouble()

inline bool cmp(const point &a, const point &b)

inline double dis(const point &a, const point &b)

double calc(const double &a, double d)

sort(p + 1, p + 1 + n, cmp);

for(int i = 1; i <= n; i++)

return d;

}int main()

卡了一下常數,有很多多餘的浮點運算。假如把至多後15個點的限制去掉正確性就可以保證了,但是複雜度可能會**,不過這樣子就只需要計算一次就可以了。

#includeusing namespace std;

const double pi = acos(-1.0);

struct point p[200000 + 5];

int n;

inline double randomdouble()

inline bool cmp(const point &a, const point &b)

inline double dis(const point &a, const point &b)

double calc(const double &a, double d)

sort(p + 1, p + 1 + n, cmp);

for(int i = 1; i <= n; i++)

return d;

}int main()

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2 ...

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...

平面最近點對

求點集中的最近點對有以下兩種方法 設p1 x1,y1 p2 x2,y2 pn xn,yn 是平面上n個點構成的集合s,設計演算法找出集合s中距離最近的點對。1 蠻力法 適用於點的數目比較小的情況下 1 演算法描述 已知集合s中有n個點,一共可以組成n n 1 2對點對,蠻力法就是對這n n 1 2對...