UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY。
纯暴力是会超时的,所以得另辟蹊径,用分治算法。
递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中的一块中,就会存在于跨越中线的点对中。
查找跨越中线的点比较麻烦,之前已经求出两块中的最小距离,只要在x范围在[m-d,m+d]的点中找对,更新最小距离,最后返回最小距离即可。
代码:
/*
* Author: illuz <iilluzen[at]gmail.com>
* Blog: http://blog.csdn.net/hcbbt
* File: uva10245.cpp
* Lauguage: C/C++
* Create Date: 2013-09-04 19:57:26
* Descripton: UVA 10245 The Closest Pair Problem, partitation
*/
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
#define sqr(x) ((x) * (x))
#define dis(i, j) (sqrt(sqr(p[i].x - p[j].x) + sqr(p[i].y - p[j].y))) const int MAXN = 10010;
struct Point {
double x;
double y;
} p[MAXN];
int n, t[MAXN];
double Min; bool cmp1(Point a, Point b) {
return a.x < b.x;
} bool cmp2(int a, int b) {
return p[a].y < p[b].y;
} double solve(int l, int r) {
if (l == r) return 0xfffffff;
if (l + 1 == r) return dis(l, r);
int mid = (l + r) / 2;
double d = min(solve(l, mid), solve(mid + 1, r));
int c = 0;
for (int i = l; i <= r; i++)
if (fabs(p[mid].x - p[i].x) <= d)
t[c++] = i;
sort(t, t + c, cmp2);
for (int i = 0; i < c; i++)
for (int j = i + 1; j < c && p[t[j]].y - p[t[i]].y < d; j++) {
double td = dis(t[i], t[j]);
if (d - td > 1e-9) d = td;
}
return d;
} int main() {
while (scanf("%d", &n) && n) {
rep(i, n) scanf("%lf%lf", &p[i].x, &p[i].y);
sort(p, p + n, cmp1);
Min = solve(0, n - 1);
if (Min - 10000 <= 1e-9) printf("%.4lf\n", Min);
else printf("INFINITY\n");
}
return 0;
}
UVA 10245 The Closest Pair Problem 最近点问题 分治算法的更多相关文章
- UVA 10245 - The Closest Pair Problem
Problem JThe Closest Pair ProblemInput: standard inputOutput: standard outputTime Limit: 8 secondsMe ...
- UVA 10245 The Closest Pair Problem【分治】
题目链接: http://acm.hust.edu.cn/vjudge/problem/visitOriginUrl.action?id=21269 题意: 求平面最近点对. 分析: 经典问题. n比 ...
- UVa 10245 The Closest Pair Problem (分治)
题意:给定 n 个点,求最近两个点的距离. 析:直接求肯定要超时的,利用分治法,先把点分成两大类,答案要么在左边,要么在右边,要么一个点在左边一个点在右边,然后在左边或右边的好求,那么对于一个在左边一 ...
- uva 10245 The Closest Pair Problem_枚举
题意:求任意两点之间的距离的最少一个距离 思路:枚举一下就可以了 #include <iostream> #include<cstdio> #include<cmath& ...
- 2.11 2D平面最近点对问题[closest pair problem]
[本文链接] http://www.cnblogs.com/hellogiser/p/closest-pair-problem.html [题目] 给定平面上N个点的坐标,找出距离最近的两个点之间的距 ...
- uva10245-The Closest Pair Problem(平面上的点分治)
解析:平面上的点分治,先递归得到左右子区间的最小值d,再处理改区间,肯定不会考虑哪些距离已经大于d的点对,对y坐标归并排序,然后从小到大开始枚举更新d,对于某个点,x轴方向只用考虑[x-d,x+d]( ...
- HDU 6697 Closest Pair of Segments (计算几何 暴力)
2019 杭电多校 10 1007 题目链接:HDU 6697 比赛链接:2019 Multi-University Training Contest 10 Problem Description T ...
- Codeforces Round #185 (Div. 2) C. The Closest Pair 构造
C. The Closest Pair Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/312/p ...
- 【Codeforces Round #185 (Div. 2) C】The Closest Pair
[链接] 链接 [题意] 让你构造n个点,去hack一种求最近点对的算法. [题解] 让x相同. 那么那个剪枝就不会起作用了. [错的次数] 在这里输入错的次数 [反思] 在这里输入反思 [代码] # ...
随机推荐
- android开发隐藏了actionbar仍然短暂闪现的解决方法
有时候我们在代码里隐藏了actionbar,在打开应用时,仍然短暂闪现下actionbar,用户体验很不好. 最简单的方法是 在AndroidManifest.xml中设置主题中配置不显示titl ...
- 【通信框架】Apache的开源通信框架thrift概述
在阅读的过程中有不论什么问题.欢迎一起交流 邮箱:1494713801@qq.com QQ:1494713801 一.作用 Thrift("Scalable Cross-Languag ...
- 减少可执行程序size的三个常用软件
减少可执行程序size的三个常用软件 linux下面,直接用strip 这个命令 #:strip xxx 可以去掉编译调试信息和各种符号表,能够大大减小可执行程序size windows下面这种exe ...
- boost ini
#include <boost/property_tree/ptree.hpp>#include <boost/property_tree/ini_parser.hpp> .. ...
- python模块介绍- xlwt 创建xls文件(excel)
python模块介绍- xlwt 创建xls文件(excel) 2013-06-24磁针石 #承接软件自动化实施与培训等gtalk:ouyangchongwu#gmail.comqq 37391319 ...
- PHP $_SERVER
$_SERVER 是一个包括了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组.这个数组中的项目由 Web server创建.不能保证每一个 ...
- linux 进程线程拓展
依次参考: 多线程和多进程的区别(小结) Linux内核源代码分析——fork()原理&多进程网络模型 Linux写时拷贝技术(copy-on-write) linux内核 do_fork 函 ...
- 重操JS旧业第九弹:函数表达式
函数表达式,什么概念,表达式中的函数表达式. 1 函数申明 function 函数名([函数参数]){ //函数体 } js中无论像这样的显示函数什么放在调用之前还是调用之后,都不影响使用,因为js解 ...
- 基于visual Studio2013解决C语言竞赛题之1074八皇后
题目 解决代码及点评 /************************************************************************/ /* ...
- 一个能够自己主动生成静态库,自己主动安装程序的Makefile
.PHONY:clean install CC=g++ CFLAGS=-Wall -g BIN=libecho.a INCLUDE=echo SRC=src OBJS=Socket.o Rio.o T ...