//closest pair
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define Max 100000
#define Inf 0x7fff
typedef struct point{
double x;
double y;
}point;
point buffer[Max];
point tmp[Max];
int cmp(const void *a, const void *b){
point *ap = (point*)a;
point *bp = (point*)b;
if(ap->x < bp->x)
return -1;
return 1;
}
int cmpy(const void *a, const void *b){
point *ap = (point*)a;
point *bp = (point*)b;
if(ap->y < bp->y)
return -1;
return 1;
}
double distance(point *arr, int a, int b){
double p = arr[a].x-arr[b].x, q = arr[a].y - arr[b].y;
return sqrt(p*p+q*q);
}
double closestPair(point *arr, int a, int b){
double dis, disr, tmpdis;
int m = a+(b-a)/2;
int i, j, u , v;
if(b == a) return Inf;
if(b-a == 1) return distance(arr,a, b);
dis = closestPair(arr, a, m);
disr = closestPair(arr, m+1, b);
if(disr < dis) dis = disr;
for(i = a; i <= m; ++i) if(arr[i].x >= arr[m].x - dis) break;
for(j = b; j >= m+1; --j) if(arr[j].x <= arr[m].x + dis) break;
for(u = i; u <= j; ++u) {
tmp[u].x = arr[u].x;
tmp[u].y = arr[u].y;
}
if(i<=m && j>=m+1){
qsort(tmp+i, j-i+1, sizeof(point), cmpy);
for(u = i; u < j; ++u){
for(v = u+1; v <= j && tmp[v].y - tmp[u].y < dis; ++v)
if((tmpdis = distance(tmp,u, v)) < dis) dis = tmpdis;
}
}
return dis;
}
int main(void){
int i, n;
while(scanf("%d", &n) != EOF){
if(n==0) break;
for(i = 0; i < n; ++i)
scanf("%lf%lf", &buffer[i].x, &buffer[i].y);
qsort(buffer, n, sizeof(point), cmp);
printf("%.2lf\n", closestPair(buffer, 0, n-1)/2);
}
system("pause");
return 0;
}
zoj2107 最近点对问题 分治思想
最新推荐文章于 2019-08-06 14:03:10 发布