标签:
类似分治最近点对的方法乱搞一下就行。
#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