最近点对模板题,算法导论P591有具体的证明,我不会实现 - -!,有一个博主写的很好,具体的证明可以见博客:http://blog.csdn.net/zhang20072844/article/details/6776386
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAXN 100010
struct node
{
double x, y;
}p[MAXN*2], ym[MAXN*2];
int n;
int cmpx(const node a, const node b)
{
return a.x < b.x;
}
int cmpy(const node a, const node b)
{
return a.y < b.y;
}
double dist(node a, node b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
double getmind(node *p, int l, int r)
{
if(l == r) return 1e50; //只有一个点
if(l+1 == r) return dist(p[l], p[r]); //只有两个点
int mid = (l+r)/2;
double ans = min(getmind(p, l,mid), getmind(p, mid+1, r)); //注意是getmind(p, l, mid);
int yn = 0;
for(int i = l; i <= r ; i++) //divide
{
if(fabs(p[i].x - p[mid].x) <= ans)
{
ym[yn++] = p[i];
}
}
sort(ym, ym+yn, cmpy); //预排序
for(int i = 0; i < yn; i++)
{
for(int j = i+1; j < yn; j++)
{
if(ym[j].y - ym[i].y >= ans) break; //if(|y1-y2| >= ans) break;
ans = min(ans, dist(ym[i], ym[j]));
}
}
return ans;
}
int main()
{
int T;
while(scanf("%d", &n) && n)
{
for(int i = 0; i < n; i++)
{
scanf("%lf%lf", &p[i].x, &p[i].y);
}
sort(p, p+n, cmpx);
double ans = getmind(p, 0, n-1);
if(ans <= 10000)
{
printf("%.4lf\n", ans);
}
else printf("INFINITY\n");
}
return 0;
}
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define MAXN 100010
struct node
{
double x, y;
}p[MAXN*2], ym[MAXN*2];
int n;
int cmpx(const node a, const node b)
{
return a.x < b.x;
}
int cmpy(const node a, const node b)
{
return a.y < b.y;
}
double dist(node a, node b)
{
return sqrt((a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y));
}
double getmind(node *p, int l, int r)
{
if(l == r) return 1e50; //只有一个点
if(l+1 == r) return dist(p[l], p[r]); //只有两个点
int mid = (l+r)/2;
double ans = min(getmind(p, l,mid), getmind(p, mid+1, r)); //注意是getmind(p, l, mid);
int yn = 0;
for(int i = l; i <= r ; i++) //divide
{
if(fabs(p[i].x - p[mid].x) <= ans)
{
ym[yn++] = p[i];
}
}
sort(ym, ym+yn, cmpy); //预排序
for(int i = 0; i < yn; i++)
{
for(int j = i+1; j < yn; j++)
{
if(ym[j].y - ym[i].y >= ans) break; //if(|y1-y2| >= ans) break;
ans = min(ans, dist(ym[i], ym[j]));
}
}
return ans;
}
int main()
{
int T;
while(scanf("%d", &n) && n)
{
for(int i = 0; i < n; i++)
{
scanf("%lf%lf", &p[i].x, &p[i].y);
}
sort(p, p+n, cmpx);
double ans = getmind(p, 0, n-1);
if(ans <= 10000)
{
printf("%.4lf\n", ans);
}
else printf("INFINITY\n");
}
return 0;
}