最近点对问题(平面分治算法)

#include<iostream>
#include<algorithm>
#include<string.h>
#include<cstdio>
#include<math.h>
using namespace std;
#define maxn 1000500
#define INF 1e50
struct point 
{
	double x,y;
	int flag;
}s[maxn],re[maxn];
bool cmpx(point a,point b)
{
	return a.x<b.x;
}
bool cmpy(point a,point b)
{
	return a.y<b.y;
}
double dis(point a,point b){
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

double ab(double a){
	return a>=0?a:-a;
}

double solve(int l,int r){
	if(l==r) return INF;
	int mid=(l+r)>>1;
	int cnt=0;
	double ans=min(solve(l,mid),solve(mid+1,r));
	for(int i=l;i<=r;i++){
		if(ab(s[i].x-s[mid].x)<=ans){
			re[cnt++]=s[i];
		}
	}
	sort(re,re+cnt,cmpy);
	for(int i=0;i<cnt;i++){
		for(int j=i+1;j<cnt;j++){
			if(re[j].y-re[i].y>ans) break;
			else ans=min(ans,dis(re[i],re[j]));
		}
	}
	return ans;
}

int main(){
	int n,t;
	scanf("%d",&t);
	while(t--){
	memset(re,0,sizeof(re));
	memset(s,0,sizeof(s));
	scanf("%d",&n);
	for(int i=0;i<n;i++){
		scanf("%lf%lf",&s[i].x,&s[i].y);
	}
	sort(s,s+n,cmpx);
	printf("%.3lf\n",solve(0,n-1));
}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/duanghaha/article/details/81390929
今日推荐