(分治法求最近对)1007

来源:互联网 发布:hadoop大数据项目实战 编辑:程序博客网 时间:2024/06/11 04:51

查看原题

代码

#include<cmath>#include<algorithm>using namespace std;int n;struct node{  double x;  double y;}p[100005];int a[100005];double cmpx(node a,node b){  return a.x<b.x;}double cmpy(int a,int b){  return p[a].y<p[b].y;}double min(double a,double b){  return a<b?a:b;}double dis(node a,node b){  return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double find(int l,int r){     if(r==l+1)//分割到最后只有两个点时      return dis(p[l],p[r]);     if(l+2==r)//分割到最后有三个点时      return min(dis(p[l],p[r]),min(dis(p[l],p[l+1]),dis(p[l+1],p[r])));     int mid=(l+r)/2;//不断分割     double ans=min(find(l,mid),find(mid+1,r));//寻找两个分区中点对的最小距离     int i,j,cnt=0;     for(i=l;i<=r;i++)     {       if(p[i].x>=p[mid].x-ans&&p[i].x<=p[mid].x+ans)          a[cnt++]=i;//找到在区间上的点     }     sort(a,a+cnt,cmpy);//升序     for(i=0;i<cnt;i++)     {       for(j=i+1;j<cnt;j++)       {         if(p[a[j]].y-p[a[i]].y>=ans) break;         ans=min(ans,dis(p[a[i]],p[a[j]]));       }     }      return ans;}int main(){    int i;    while(scanf("%d",&n)!=EOF)    {      if(!n) break;      for(i=0;i<n;i++)       scanf("%lf %lf",&p[i].x,&p[i].y);      sort(p,p+n,cmpx);      printf("%.2lf%\n",find(0,n-1)/2);    }    return 0;}
0 0
原创粉丝点击