ClosestPair.cpp 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. struct vect {
  2. double x, y;
  3. vect(double a=0.0, double b=0.0) : x(a), y(b) {}
  4. double length() {
  5. return sqrt(x*x+y*y);
  6. }
  7. vect operator-(vect a) {
  8. return vect(x-a.x, y-a.y);
  9. }
  10. };
  11. double CP_Search(vect *s, vect *x[], vect *y[], int n, int &a, int &b, double d) {
  12. if(n == 1) return d;
  13. vect *z[maxn];
  14. int m = n>>1, p = 0;
  15. static bool u[maxn];
  16. for(int i = 0; i < m; i++) u[x[i]-s] = true;
  17. for(int i = 0, j = 0, k = m; i < n; i++)
  18. if(u[y[i]-s]) z[j++]=y[i]; else z[k++]=y[i];
  19. for(int i = 0; i < m; i++) u[x[i]-s] = false;
  20. d = CP_Search(s, x, z, m, a, b, d);
  21. d = CP_Search(s, x+m, z+m, n-m, a, b, d);
  22. for(int i = 0; i < n; i++)
  23. if(fabs(y[i]->x - x[m]->x)<d) z[p++] = y[i];
  24. for(int i = 0; i < p; i++)
  25. for(int j = i+1; j < p && z[j]->y - z[i]->y < d; j++) {
  26. double tmp = (*z[j] - *z[i]).length();
  27. if(d>tmp) { d=tmp; a=z[j]-s; b=z[i]-s; }
  28. }
  29. return d;
  30. }
  31. bool CP_cmpx(const vect *a, const vect *b) {
  32. return a->x < b->x;
  33. }
  34. bool CP_cmpy(const vect *a, const vect *b) {
  35. return a->y < b->y;
  36. }
  37. double ClosestPair(vect s[], int n, int &a, int &b) {
  38. vect *x[maxn], *y[maxn];
  39. for(int i = 0; i < n; i++)
  40. x[i] = y[i] = s+i;
  41. sort(x, x+n, CP_cmpx);
  42. sort(y, y+n, CP_cmpy);
  43. return CP_Search(s,x,y,n,a,b,INF);
  44. }