标签:
类似分治最近点对的方法乱搞一下就行。
#include<bits/stdc++.h>
#define N 200010
#define M (s+t>>1)
using namespace std;
struct vec{
int x,y;
}u[N],v[N];
bool foo(vec a,vec b){
return a.x<b.x;
}
bool bar(vec a,vec b){
return a.y<b.y;
}
double sqr(double x){
return x*x;
}
double dist(vec a,vec b){
return sqrt(sqr(a.x-b.x)+sqr(a.y-b.y));
}
double dist(vec a,vec b,vec c){
return dist(a,b)+dist(b,c)+dist(a,c);
}
double d=1e64;
void solve(int s,int t){
if(t-s>2){
solve(s,M);
solve(M,t);
int m=0;
for(int i=s;i!=t;++i)
if(abs(u[i].x-u[M].x)<<1<d)
v[m++]=u[i];
sort(v,v+m,bar);
for(int i=0;i!=m;++i)
for(int j=i+1;j!=m
&&v[j].y-v[i].y<<1<d;++j)
for(int k=i+1;k!=j;++k)
d=min(d,dist(v[i],v[j],v[k]));
}
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i!=n;++i)
scanf("%d%d",&u[i].x,&u[i].y);
sort(u,u+n,foo);
solve(0,n);
printf("%.6f\n",d);
}
bzoj2458: [BeiJing2011]最小三角形 最近点对
标签:
原文地址:http://www.cnblogs.com/f321dd/p/5496034.html