zoj 2107 Quoit Design

/*
zoj_2107    計算幾何
分治法求最近點對,模板題
*/
#include <iostream>
#include <cstdio>
#include <limits.h>
#include <math.h>
#include <algorithm>
//#define min(a,b) a<b?a:b 居然不能這樣寫??爲什麼??
using namespace std;
struct node
{
    double x,y;
}p1[100010],p2[100010];

double min(double a,double b) { return a<b?a:b; }

bool cmpx( node a,node b ) { return a.x<b.x; }

bool cmpy( node a,node b ) { return a.y<b.y; }

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 solve( int l,int r )
{
    int mid,m,i,j;
    double d;
    if( r==l+1 ) return dis( p1[l],p1[r] );
    if( r==l+2 ) return min( dis( p1[l],p1[l+1] ),min( dis(p1[l],p1[r]),dis(p1[l+1],p1[r]) ) );
    mid=( l+r )/2;
    d=min( solve(l,mid),solve(mid+1,r) );
    m=0;
    for( i=l;i<=r;i++ )
        if( p1[i].x>=p1[mid].x-d && p1[i].x<=p1[mid].x+d )
            p2[m++]=p1[i];
    sort( p2,p2+m,cmpy );
    for( i=0;i<m;i++ )
        for( j=i+1;j<m;j++ )
        {
            if( p2[j].y-p2[i].y>=d )  break;
            d=min( d,dis( p2[i],p2[j] ) );
        }
    return d;
}

int main()
{
    int i,j,n;
    while( scanf("%d",&n) && n )
    {
        for( i=0;i<n;i++ )
            scanf( "%lf%lf",&p1[i].x,&p1[i].y );
        sort( p1,p1+n,cmpx );
        printf( "%.2lf\n",solve( 0,n-1 )/2 );
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章