/**
最近点对问题,时间复杂度为O(n*logn*logn)
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const double INF = 1e20;
const int N = 100005;
struct Point
{
double x;
double y;
}point[N];
int n;
int tmpt[N];
bool cmpxy(const Point& a, const Point& b)
{
if(a.x != b.x)
return a.x < b.x;
return a.y < b.y;
}
bool cmpy(const int& a, const int& b)
{
return point[a].y < point[b].y;
}
double min(double a, double b)
{
return a < b ? a : b;
}
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));
}
double closest_pair(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;
int d1=close_pair(left,mid);
int d2=close_pair(mid+1,right);
d=min(d1,d2);
int i,j,k=0;
for(i=left;i!=right;++i)
{
if(fabs(point[mid].x-point[i].x)<d)
tmpt[k++]=i;
}
sort(tmpt,tmpt+k,cmpy);
for(i=0;i!=k;++i)
{
for(j=i+1;j!=k&&point[j].y-point[i].y<d;++j)
{
double d3=dis(point[j],point[i]);
if(d3<d)
d=d3;
}
}
return d;
}
int main()
{
while(true)
{
scanf("%d",&n);
if(n==0)
break;
for(int i = 0; i < n; i++)
scanf("%lf %lf",&point[i].x,&point[i].y);
sort(point,point+n,cmpxy);
printf("%.2lf\n",Closest_Pair(0,n-1)/2);//这个不是很明白,结果不是很正确啊,这个东西不是很正确,关键在于closet_pair的两个参数,对于是一维的话是很正确的,但是对于二维的话就不确定了
}
return 0;
}
分治法之最接近点对问题
最新推荐文章于 2016-10-24 15:51:50 发布