#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
今日推荐
周排行