/*
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;
}
zoj 2107 Quoit Design
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.