平面最近点对(HDU 1007)

题解:点击

#include <stdio.h> 
#include <string.h> 
#include <algorithm> 
#include <iostream> 
#include <math.h> 
using namespace std; 
const double eps = 1e-6; 
const int MAXN = 100010; 
const double INF = 1e20; 
struct Point 
{ 
    double x,y; 
}; 
double dist(Point a,Point b) 
{ 
    return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y)); 
} 
Point p[MAXN]; 
Point tmpt[MAXN]; 
bool cmpxy(Point a,Point b) 
{ 
    if(a.x != b.x)return a.x < b.x; 
    else return a.y < b.y; 
} 
bool cmpy(Point a,Point b) 
{ 
    return a.y < b.y; 
} 
double Closest_Pair(int left,int right) 
{ 
    double d = INF; 
    if(left == right)return d; 
    if(left + 1 == right) 
        return dist(p[left],p[right]); 
    int mid = (left+right)/2; 
    double d1 = Closest_Pair(left,mid); 
    double d2 = Closest_Pair(mid+1,right); 
    d = min(d1,d2); 
    int k = 0; 
    for(int i = left;i <= right;i++) 
    { 
        if(fabs(p[mid].x - p[i].x) <= d) 
            tmpt[k++] = p[i]; 
    } 
    sort(tmpt,tmpt+k,cmpy); 
    for(int i = 0;i <k;i++) 
    { 
        for(int j = i+1;j < k && tmpt[j].y - tmpt[i].y < d;j++) 
        { 
            d = min(d,dist(tmpt[i],tmpt[j])); 
        } 
    } 
    return d; 
} 
int main() 
{ 
    int n; 
    while(scanf("%d",&n)==1 && n) 
    { 
        for(int i = 0;i < n;i++) 
            scanf("%lf%lf",&p[i].x,&p[i].y); 
        sort(p,p+n,cmpxy); 
        printf("%.2lf\n",Closest_Pair(0,n-1)/2); 
    } 
    return 0; 
} 
posted @ 2017-07-27 22:02  GGBeng  阅读(179)  评论(0编辑  收藏  举报