正文

Zoj 2107 Quoit Design2008-02-14 14:03:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/cruxd/32669.html

分享到:

2750801 2008-02-14 13:48:15 Accepted 2107 C++ 00:02.95 4068K C.D.

分治算法的应用。在求左和右之间的最短点对时,先把满足X坐标差值小于CurMin的点对按Y排序,然后可以剪掉Y坐标值差小于CurMin的点对。

/*
    作者    Crux.D
    日期    2008.2.14
    描述    分治求最短距离点对
*/


#include 
<cstdio>
#include 
<string>
#include 
<cstdlib>
#include 
<cmath>

typedef 
struct
{
    
double x, y;
}
 Point;
Point p[
100001];
int N, q[100000];

int init ();
double b_search ( intint );

inline 
double dist ( int i, int j )
{
    
double x = sqrt ( ( p[i].x - p[j].x ) * ( p[i].x - p[j].x ) +
                      ( p[i].y 
- p[j].y ) * ( p[i].y - p[j].y ) );
    
return x;
}


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


int cmpx ( const void *a, const void *b )
{
    Point 
*= ( Point * ) a, *= ( Point * ) b;
    
return A->> B->x;
}


int cmpq ( const void *a, const void *b )
{
    
int *= ( int * ) a, *= ( int * ) b;
    
return p[*A].y > p[*B].y;
}


int main ()
{
    
//freopen ( "in.txt", "r", stdin );
    while ( init () )
    
{
        printf ( 
"%0.2f\n", b_search ( 0, N - 1 ) / 2 );
    }

    
return 0;
}


int init ()
{
    scanf ( 
"%d"&N );
    
int i;
    
for ( i = 0; i < N; i ++ )
    
{
        scanf ( 
"%lf%lf"&p[i].x, &p[i].y );
    }

    qsort ( p, N, 
sizeof ( p[0] ), cmpx );
    
return N;
}


double b_search ( int l, int r )
{
    
if ( l == r - 1 )
    
{
        
return dist ( l, r );
    }

    
else if ( l == r - 2 )
    
{
        
return min ( dist ( r, l + 1 ), min ( dist ( l, r ), dist ( l, l + 1 ) ) );
    }

    
else
    
{
        
int mid = ( l + r ) / 2;
        
double cur_min = min ( b_search ( l, mid ), b_search ( mid + 1, r ) );
        
int size = 0;
        
int i;
        
for ( i = mid - 1; i >= l && p[mid + 1].x - p[i].x < cur_min; i -- )
        
{
            q[size 
++= i;
        }

        
for ( i = mid + 1; i <= r && p[i].x - p[mid].x < cur_min; i ++ )
        
{
            q[size 
++= i;
        }

        qsort ( q, size, 
sizeof ( q[0] ), cmpq );
        
int j;
        
for ( i = 0; i < size - 1; i ++ )
        
{
            
for ( j = i + 1; j < size && p[q[j]].y - p[q[i]].y < cur_min; j ++ )
            
{
                cur_min 
= min ( cur_min, dist ( q[i], q[j] ) );
            }

        }

        
return cur_min;
    }

}
    

 

阅读(4897) | 评论(1)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

loading...
您需要登录后才能评论,请 登录 或者 注册