当前位置: 首页 > news >正文

东莞网站建设平台河南网络推广那家好

东莞网站建设平台,河南网络推广那家好,wordpress菜单移动,做网站怎么在国外服务器租用文章目录 平面最近点对(分治算法)Solution流程完整模板代码 平面最近点对(分治算法) 文章首发于我的个人博客:欢迎大佬们来逛逛 平面最近点对(加强版) - 洛谷 给你一些点,求两点之…

文章目录

  • 平面最近点对(分治算法)
  • Solution
  • 流程
  • 完整模板代码

平面最近点对(分治算法)

文章首发于我的个人博客:欢迎大佬们来逛逛

平面最近点对(加强版) - 洛谷

给你一些点,求两点之间距离最小的两个点之间的最短距离。

分治算法是解决这类问题的关键。

Solution

首先将所有的点按照 x x x 为第一关键字, y y y 为第二关键字进行排序。

排序后如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pGAMATS2-1685532860870)(%E5%B9%B3%E9%9D%A2%E6%9C%80%E8%BF%91%E7%82%B9%E5%AF%B9%EF%BC%88%E5%88%86%E6%B2%BB%E7%AE%97%E6%B3%95%EF%BC%89%204c3ad0a0ba5c4743aed687f933a3e85a/Untitled.png)]

我们可以将所有的点分治:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7vB6twgs-1685532860871)(%E5%B9%B3%E9%9D%A2%E6%9C%80%E8%BF%91%E7%82%B9%E5%AF%B9%EF%BC%88%E5%88%86%E6%B2%BB%E7%AE%97%E6%B3%95%EF%BC%89%204c3ad0a0ba5c4743aed687f933a3e85a/Untitled%201.png)]

在这些点中我们用一条分割线来隔开,如果我们一直分割,则到最后 l + 1 = r l+1=r l+1=r 的时候,就表明划分到了最后的两个点,因此直接计算两个点之间的**距离;**如果最后只有一个点,即 l = r l=r l=r ,则我们规定此距离为无穷大。

因此我们得到两个点之间距离之后再回溯,寻找相对于这两个点有没有更优的点对出现,则更新,继续回溯。最后结束的时候,我们一定可以得到所有点的距离最短的距离。

树型图表示如下:

  • 首先递归到 [ 1 , 2 ] [1,2] [1,2] 发现此时只有 p 1 和 p 2 p1 和p2 p1p2 两个点,因此我们计算他们的最短距离,假设为 3
  • 接着进入 [ 3 , 3 ] [3,3] [3,3] 此时只有一个点,因此规定距离为无穷大
  • 然后我们回溯到 [ 1 , 3 ] [1,3] [1,3] ,取两个孩子节点的最小值,为3;但是此时并没有结束,我们获得的 3 只是分割线两侧分别计算的最优解,我们此时还需要得到去除分割线之后的所有点的之间的最短距离,更新为 p 1 和 p 3 p1 和 p3 p1p3 之间的距离,为 2.
  • 然后递归到 [ 4 , 5 ] [4,5] [4,5] 区间,得到 p 4 和 p 5 p4 和 p5 p4p5 之间距离为 2.5。
  • 然后回溯到 根节点 [ 1 , 5 ] [1,5] [1,5] ,得到分割线两侧的点之间的最优解,为2;接着计算去除分割线之后的两点之间的最优解,得到 1.2 ,为 p 3 和 p 4 p3 和 p4 p3p4 之间的距离

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QEeXFBNB-1685532860871)(%E5%B9%B3%E9%9D%A2%E6%9C%80%E8%BF%91%E7%82%B9%E5%AF%B9%EF%BC%88%E5%88%86%E6%B2%BB%E7%AE%97%E6%B3%95%EF%BC%89%204c3ad0a0ba5c4743aed687f933a3e85a/Untitled%202.png)]

如何计算去除分割线之后的区间的两点的最短距离?

我们称之为 跨中线处理

  1. 首先由目标区间 [ l , r ] [l,r] [l,r] 得到所有 x x x 的差值小于 d d d 的点集合。
  2. 将这些点按照 y y y 值排序
  3. 最后直接两两之间暴力枚举 y y y 值的差值小于 d d d 的点对距离

流程

因此我们很轻松的得到分治求平面最近点对的流程:

  • 首先将所有的点按照 x x x y y y 为第一第二关键字排序。
  • 然后递归分治所有的点,递归到终点时计算点的距离,回溯返回局部最优解。
  • 然后计算全局最优解,即跨中线处理。

时间复杂度: O ( n l o g 2 n ) O(nlog^2n) O(nlog2n)

使用归并排序会降低为 O ( n l o g n ) O(nlogn) O(nlogn)


完整模板代码

#include<bits/stdc++.h>
#if 0#define int long long
#endifconst int N=200010;
int n;
struct point{double x,y;
}A[N],B[N],T[N];
double get_dis(const point& a,const point& b){return std::sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double solve(int l,int r){//分治if (l==r){   //只有一个点return 1e9;}if (l+1==r){ //有两个点则算距离return get_dis(A[l],A[r]);}int mid=l+r>>1;double d=std::min(solve(l,mid),solve(mid+1,r)); //跨中线处理int k=0;for (int i=l;i<=r;i++){if (fabs(A[i].x-A[mid].x)<d){B[++k]=A[i];}}//按照y值排序std::sort(B+1,B+1+k,[&](const point& a,const point& b){return a.y<b.y;});for (int i=1;i<k;i++){//枚举两个点进行距离的更新for (int j=i+1;j<=k && B[j].y-B[i].y<d;j++){d=std::min(d,get_dis(B[i],B[j]));}}return d;
}
signed main(){std::cin>>n;for (int i=1;i<=n;i++){std::cin>>A[i].x>>A[i].y;}//1. 按照x为第一关键字,y为第二关键字排序std::sort(A+1,A+1+n,[&](const point& a,const point& b){if (a.x==b.x) return a.y<b.y;return a.x<b.x;});printf("%.4lf\n",solve(1,n));return 0;
}
http://www.yidumall.com/news/38010.html

相关文章:

  • 深圳网站开百度排名点击
  • 成绩分析智能网站怎么做企业文化案例
  • 深圳市专业制作网站公司软文广告示范
  • 台州网站建设 网站制作 网站设计企业营销管理
  • 模板网站建设教程沈阳seo排名外包
  • 具有品牌的网站建设靠谱的广告联盟
  • 网站怎么做查询系统全网搜索指数查询
  • 宁乡县建设局网站搜索引擎排行榜
  • 学做实体店网站360关键词排名推广
  • 合肥制作网站价格网络优化工程师有前途吗
  • 美国旅游网站排名百度云登录
  • 网站优化 西安百度竞价推广投放
  • 网站优化的核心不包括营销网站建设软件下载
  • 开发公司委合同引擎优化seo怎么做
  • 类似织梦的建站cms网站seo优化发布高质量外链
  • 电影网站标题怎么做流量多怎样给自己的网站做优化
  • 贵阳建设工程招投标网站网站底部友情链接代码
  • 滨州网站开发免费的舆情网站app
  • 织梦软件网站模板下载地址站长工具服务器查询
  • 做一套公司网站费用拼多多怎么查商品排名
  • 做金融的免费发帖的网站有哪些福州seo结算
  • 厦门网站建设公司推荐现在外贸推广做哪个平台
  • bootstrap怎么做响应式网站教程seo推广排名网站
  • 校园网站建设必要性seo实战教程
  • 哪些公司提供微信做网站服务无锡百度竞价推广
  • 北京朝阳区地图如何网站关键词优化
  • 酒店网站报价方案免费网站建设制作
  • 做移动端电影网站河南制作网站公司
  • 给境外赌博网站做代理指数函数图像
  • 广州专门做网站的公司公司官网怎么做