区间点集最短两点距离
2017-03-03 16:22
281 查看
findd函数模板,分治 #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include<math.h> using namespace std; struct node1 { int x,y; }node[100010],node2[100010]; int cmpx(node1 p1,node1 p2) { return p1.x<p2.x; } int cmpy(node1 p1,node1 p2) { return p1.y<p2.y; } long long Distance(node1 p1,node1 p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } long long findd(int l,int r) { if(r==l+1) return Distance(node[l],node[r]); if(r==l+2) return min(Distance(node[l],node[l+1]),min(Distance(node[l+1],node[r]),Distance(node[l],node[r]))); int mid=l+(r-l)/2; long long ans=min(findd(l,mid),findd(mid+1,r)); int v=0; for(int i=l;i<=r;i++) { if(node[i].x>=node[mid].x-ans&&node[i].x<=node[mid].x+ans) node2[v++]=node[i]; } sort(node2,node2+v,cmpy); for(int i=0;i<v-1;i++) for(int j=i+1;j<v;j++) { if(node2[j].y-node2[i].y>=ans) break; else ans=min(ans,Distance(node2[i],node2[j])); } return ans; } int main() { int t; scanf("%d",&t); while(t--) { int n; scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&node[i].x,&node[i].y); } sort(node,node+n,cmpx); long long ans=0; ans=findd(0,n-1)*(n-2); ans+=findd(1,n-1); node[1]=node[0]; ans+=findd(1,n-1); printf("%lld\n",ans); } return 0; }
相关文章推荐
- 平面点集最短距离,记录两点的代码!
- HDU 4460 求任意两点最短距离的最大距离
- 求DAG上两点的最短距离
- hdu 6097 Mindis(圆上一点到圆内(距圆心相等的)两点的距离和最短)
- Poj 1986 Distance Queries (LCA 树上两点间最短距离)
- 分治法求两点间最短距离->HDU5721
- 迪杰斯特拉算法处理无向图中最短路径的(dijkstra)Java实现(指定两点,求最短距离及路径)
- 关于已知两点经纬度求球面最短距离的公式推导
- 任意两点间最短距离floyd-warshall ---- POJ 2139 Six Degrees of Cowvin Bacon
- hdu 6097 Mindis(圆上一点到圆内(距圆心相等的)两点的距离和最短)
- Dijkstra [迪杰斯特拉]算法思路(求单点到其他每个点的各个最短路径)Floyd算法:任意两点间最短距离
- hdu 6097 Mindis(圆上一点到圆内(距圆心相等的)两点的距离和最短)
- hdu 6097 Mindis(圆上一点到圆内(距圆心相等的)两点的距离和最短)
- 地球上两点间最短距离及计算方法
- hdu 2544 最短路 图论-求两点之间的最短距离 Dijkstra
- 点集最短欧几里德距离
- ★1007 给定一些点求两点之间的最短距离
- Dijkstra 算法,用于对有权图进行搜索,找出图中两点的最短距离
- 经典c程序(0038)---矩阵中两点最短距离BFS
- 已知两点的经纬度,求某点到该两点的连线的最短距离