AOJ 862 平面上最近点对
2017-04-24 12:55
211 查看
平面上最近点对
http://ccpc.ahu.edu.cn:8080/OJ/Problem.aspx?id=862分治思想, 核心是分治算法
分别根据点的 x,y 值进行排序
在 x 轴上划一道垂线, 将点均分成两半
假设最近点对都在左/右部分, 递归计算左/右半部分的最短距离
并返回较小值 dis
假设最近点对分别在左右两个部分, 横跨中心的竖线. 中心线为中心,
2*dis 为宽度画一个矩形, 横跨中心线的最近点对 candidate 都在这个矩形内.
将这些点按照 y 值的大小加入到数组中. 遍历数组中的点, 将该点与其后的
7 个点计算距离, 返回最小距离
为什么仅和 7 个点作对比呢. 因为已经假设 dis 是左右不分最近点对的最小值,
这就说明在一个长(宽)为 dis 的正方形内, 至多有 4 个点. 长为 dis*2,
宽为 dis 的长方形至多 8 个.
#include <cstdio> #include <iostream> #include <cstring> #include<cmath> #include <algorithm> using namespace std; const double INF =1e20; const int N=100005; struct Point { double x; double y; }point ; int n;int tmpt ; double min2(double a, double b) { return a < b ? a : b; } int cmpxy(const void *a,const void *b) { Point *c=(Point *)a; Point *d=(Point *)b; if(c->x!=d->x) return c->x-d->x; return c->y-d->y; } int cmpy(const void *a,const void *b) { int c=*(int*)a,d=*(int *)b; return point[c].y-point[d].y; } double dis(int i,int j) { //return sqrt((point[i].x-point [j].x)*(point[i].x-point [j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y)); return sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y)); } double Closest(int left,int right) { double d=INF; if(left==right)return d; if(left+1==right)return dis(left,right); int mid=(left+right)/2; double d1=Closest(left,mid); double d2=Closest(mid+1,right); d=min2(d1,d2); int i,j,k; for( i=left,k=0;i<=right;i++) { if(abs(point[mid].x-point[i].x)<=d) tmpt[k++]=i; } qsort(tmpt,k,sizeof(int),cmpy); for(int i=0;i<k;i++) for(int j=i+1;j<k;j++) { if(point[tmpt[j]].y-point[tmpt[i]].y<d) { double d3=dis(tmpt[i],tmpt[j]); if(d3<d)d=d3; } } return d; } int main() { scanf("%d",&n); if(n) { for(int i=0;i<n;i++) scanf("%lf%lf",&point[i].x,&point[i].y); qsort(point,n,sizeof(Point),cmpxy); printf("%.4lf\n",Closest(0,n-1)); //scanf("%d",&n); } return 0; }
相关文章推荐
- 平面上最近点对(计算几何,分治,KDtree)(AOJ 862)(待补)
- 求平面最近点对 二分法
- 分治——Luogu1429 平面最近点对(加强版)
- Raid POJ - 3714 (平面最近点对,分治)
- UVA 10245 The Closest Pair Problem(平面最近点对)
- 从平面上最近的点对,谈谈分治算法
- 查找平面见最近点对
- POJ 3714(Raid-平面最近点对)
- 数字之魅:寻找二维平面上的最近的点对
- 平面最近点对
- HDU1007 查找平面最近点对
- [置顶] 平面上求最近点对问题
- 平面最近点对
- hdu1007 平面最近点对
- 平面最近点对问题—分治算法的经典应用
- POJ 3714 Raid(平面最近点对)
- 在一个二维平面上找到离固定点最近的k个点位置
- 平面最近点对
- 分治法求解平面n点中距离最近的两点
- hdu 1007 zoj 2107 Quoit Design 求平面最近点对 分治法