算法-分治 最近点问题
2017-03-28 17:40
435 查看
最近点问题的分治思路:假定一个垂线L将所有点分成2份,递归求出左边和右边的最短距离dl,dr,当前最短距离便是d = min(dl,dr) 需要处理的便是在中间部分是否存在过穿过L的两点之间距离小于d
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1007
/**分治 最近点问题***/ #include <iostream> #include <cmath> #include <cstdio> #include <algorithm> #define INF (1<<31-1) #define MAX 100005 using namespace std; typedef struct Point{ double x; double y; }Node; Node p[MAX]; int temp[MAX]; bool cmpx(Node a, Node b) { return a.x < b.x; } bool cmpy(int a, int b) { return p[a].y < p[b].y; } double dist(Node a, Node b) { double x = a.x-b.x; double y = a.y-b.y; return sqrt(x*x+y*y); } double solve(int left, int right) { double dis = 0; if(right-left == 0)//当只有一个点的时候,表示没有最近点距离返回inf return INF; if(right-left == 1)//存在2个点时,最近距离即这两个点 return dist(p[left], p[right]); int mid = (right+left)/2;//中间点 double dl = solve(left, mid);//递归求左边和右边的最近距离 double dr = solve(mid+1, right); dis = min(dl, dr); int k = 0; for(int i=mid; i>=left && p[mid].x-p[i].x<=dl; i--)//收集mid左边和右边的范围分别在dl和dr的点,即图中L-d和L+d范围内点 temp[k++] = i; for(int i=mid+1; i<=right && p[i].x-p[mid].x<=dr; i++) temp[k++] = i; sort(temp, temp+k, cmpy);//按y坐标从小到大对这些点进行排序 for(int i=0; i<k; i++) { for(int j=i+1; j<k; j++) { if(p[temp[j]].y-p[temp[i]].y >= dis)//因为已经按y坐标排序后,一旦两点距离大于最小距离就可以跳出循环减少运行时间 break; if(dist(p[temp[i]], p[temp[j]]) < dis)//如果中间部分有更近的距离则更新dis dis = dist(p[temp[i]], p[temp[j]]); } } return dis; } int main() { int n; while(cin >> n && n!=0) { for(int i=0; i<n; i++) { cin >> p[i].x >> p[i].y; } sort(p, p+n, cmpx); printf("%.2f\n", solve(0, n-1)/2); } return 0; }
相关文章推荐
- 最近点对问题的分治算法分析与实现
- 求二维平面最近点对算法; 分治思想; 递归写的好精准,模仿ACM模板写的.;很多细节处理的很漂亮;
- 最近滴日子相当充实啊..关于视频录制的帧率问题、opencv中文字以及部分很主观的算法唠嗑[2011.8.4]
- 最近公共祖先 Least Common Ancestors(LCA)算法 --- 与RMQ问题的转换
- 最近点对问题(分治)
- 杭电1007————最近点对问题(分治问题)
- [算法实现]基于分治的二维平面最近点对算法实现
- zoj 2107 Quoit Design(最近点对问题,好好思考,分治)
- 分治算法思想解决找假硬币的问题
- 近似最近邻问题相关算法总结
- 算法笔记(问题分解,分治与动态规划)
- c++实现分治法最近点对算法
- 最近点对问题(分治思想的经典应用)
- 分治法求最近点对问题
- 算法设计--蛮力法&&分治法求最近对问题(C++实现)
- 最近遇到的一个算法问题
- 【算法复习二】传统基本算法(分治----残缺棋盘问题)
- 递归和分治思想4|八皇后问题 - 数据结构和算法34
- 第四章 分治策略 4.1 最大子数组问题 (暴力求解算法)
- 每周算法练习——最近对问题