POJ 3714-Raid解题报告
2012-10-07 16:51
651 查看
二维最近点对问题,关于这个问题网上和算法导论上都由详细的介绍http://hi.baidu.com/bananas122/item/fbc7a2b6d766bf6e254b09e4
这个解释的挺好,并且还有计算,其他的就是代码实现的问题,另外这个题要加一个标志位,就没什么特殊的了
View Code
这个解释的挺好,并且还有计算,其他的就是代码实现的问题,另外这个题要加一个标志位,就没什么特殊的了
View Code
#include<iostream> #include<cstring> #include<cstdio> #include<cstdlib> #include<cmath> #include<algorithm> #define N 200005 #define min(a,b) ((a)<(b)?(a):(b)) #define inf 1e50 using namespace std; struct point { double x,y; int flag; }; point p ; point tmp1 ; point tmp2 ; bool cmp(point a,point b) { if(a.x!=b.x) return a.x<b.x; return a.y<b.y; } double dis(point p1,point p2) { if(p1.flag==p2.flag) return inf; return sqrt(((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))); } double mindis(int l,int r) { double d=inf; if(l==r) return d; if(l+1==r) return dis(p[l],p[r]); int mid=(l+r)>>1; double d1=mindis(l,mid);//分治,这里感觉有些像线段树 double d2=mindis(mid+1,r); d=min(d1,d2); int i,j,k; int cnt1,cnt2; cnt1=cnt2=0; for(i=mid;i>=l;i--)//找两边的点 { if(p[mid].x-p[i].x<d) tmp1[cnt1++]=p[i]; } for(i=mid+1;i<=r;i++) { if(p[i].x-p[mid].x<d) tmp2[cnt2++]=p[i]; } for(i=0;i<cnt1;i++) for(j=0;j<cnt2;j++) { d1=dis(tmp1[i],tmp2[j]); if(d1<d) d=d1; } return d; } int main() { int n,i,j,k; int T; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i=0;i<n;i++) { scanf("%lf%lf",&p[i].x,&p[i].y); p[i].flag=0; } for(i=n;i<2*n;i++) { scanf("%lf%lf",&p[i].x,&p[i].y); p[i].flag=1; } n*=2; sort(p,p+n,cmp);//一定要用sort printf("%.3lf\n",mindis(0,n-1)); } return 0; }
相关文章推荐
- 【解题报告】 POJ 3714 Raid -- 点对最小距离 + 分治法
- poj 1422 Air Raid 最小路径覆盖 二分图匹配 解题报告
- POJ-1422-Air Raid 解题报告
- POJ 1979 Red and Black 解题报告
- poj 2288 Islands and Bridges解题报告-状态压缩dp
- poj 2739 Sum of Consecutive Prime Numbers 解题报告
- poj 3750 小孩报数问题 解题报告
- poj解题报告——2976
- poj解题报告——1159
- POJ 1256解题报告
- POJ 1017解题报告
- 【解题报告】 POJ 1308 Is It A Tree? 并查集判断一棵树
- Poj 败方树 解题报告
- POJ 2774 解题报告
- poj1753解题报告(枚举、组合数)
- poj 3228 Gold Transportation 最小生成树+带权并查集 解题报告
- POJ-2478-Farey Sequence 解题报告
- POJ 3070解题报告
- poj 1088 解题报告(记忆化搜索)
- poj1390解题报告