//poj3714 平面最近点对,基础见poj1007
//题目意思:有两个阵营,求一阵营的一点到另一个阵营的一个点存在的最小距离,
//注意给每个点添加相应的的阵营,在判断是否不同阵营时异或可得。
//代码如下:1688ms 有点久
#include<iostream>
#include<cstdio>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
#define eps 1e-8
#define INF 1e12
struct Point
{ double x,y;
int flag;
};
int n;
Point px[200002],py[200002];
int temp[200002];
int cmpx(Point &a,Point &b)
{
return a.x<b.x;
}
int cmpy(Point &a,Point &b)
{
return a.y<b.y;
}
double Min(double a, double b)
{
return a < b ?a : b;
}
double distance(Point a,Point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double nearPair(int left,int right)
{
double dis=INF;
if(left+1==right)
return (px[left].flag)^(px[right].flag)==1 ? distance(px[left],px[right]):INF;
int i,j,cnt,mid;
if(left+2==right)
{
for(i=left;i<=right;i++)
{
for(j=i+1;j<=right;j++)
{
if(px[i].flag ^ px[j].flag==1)
dis=Min(dis,distance(px[i],px[j]));
}
}
return dis;
}
mid=(left+right)>>1;
dis=Min(nearPair(left,mid),nearPair(mid+1,right));
for(i=left,cnt=0;i<=right;i++)
{
if(fabs(px[i].x-px[mid].x)<=dis)
{
py[cnt++]=px[i];
}
}
std::sort(py,py+cnt,cmpy);
for(i=0;i<cnt;i++)
{
for(j=i+1;j<cnt;j++)
{
if(py[i].flag^py[j].flag==1 && py[j].y-py[i].y>=dis)
break;
if(py[i].flag^py[j].flag==1)
dis=Min(dis,distance(py[i],py[j]));
}
}
return dis;
}
int main()
{
int cas;
scanf("%d",&cas);
while(cas--)
{scanf("%d",&n);
int i;
for(i=0;i<n;i++)
{
scanf("%lf%lf",&px[i].x,&px[i].y);
px[i].flag=0;
}
for(i=n;i<2*n;i++)
{
scanf("%lf%lf",&px[i].x,&px[i].y);
px[i].flag=1;
}
std::sort(px,px+2*n,cmpx);
printf("%.3lf\n",nearPair(0,2*n-1));
}
return 0;
}
分享到:
相关推荐
三道几何题:hdu 1007、hdu 2289、poj 3714
POJ 最接近点对问题 ACM北大 using namespace std; struct Point { float x; float y; };
POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类
计算几何半平面交,poj2451 一题是模版题,这里的代码可以作为模版使用,速度比较快
poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题报告poj 解题...
很多经典的杭电oj与poj习题的ac代码与详解!全部ac,决对没有错误的代码!
poj1379 给予平面内一个点集; 使用模拟退火求出一个点使该点到上述点集内任意一点最短距离最长。
北大POJ2002-Squares 解题报告+AC代码
poj分类poj分类poj分类poj分类
POJ第1861题源码 POJ第1861题源码 POJ第1861题源码
poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告
poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告
poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告
poj 1659解题报告poj 1659解题报告poj 1659解题报告poj 1659解题报告
北大POJ1159-Palindrome 解题报告+AC代码
poj 百练 题目分类 poj 百练 题目分类
POJ1083的代码,POJ1083的代码,POJ1083的代码
poj 1001答案
POJ1503解答 POJ1503解答,正确答案(已通过POJ)
C语言 poj npu 西工大 C语言Poj答案全完整打包,给有需要的朋友