完整教程:二维凸包——Andrew 算法学习笔记

news/2025/10/1 9:49:28/文章来源:https://www.cnblogs.com/slgkaifa/p/19122122

完整教程:二维凸包——Andrew 算法学习笔记

例题:洛谷P2742【模板】二维凸包

更适合初学者体质的题解。

1.凸包介绍

在平面上能包含所有给定点的最小凸多边形叫做凸包。

根据三角不等式,凸包也一定是包含所有给定点的周长最小多边形

同样行理解为,我们在地上钉了一些钉子,有一个有弹性皮筋,我们把它拉大框住所有钉子,然后松手,皮筋的形状就是凸包。

上凸壳(qiao or ke?)一般指凸包的上半部分,看完本篇题解应该会有更深刻的理解。

凸包的周长。就是显然,这个题目求的

2.Andrew 算法介绍

一个求凸包的算法,或许也叫安德鲁算法?

我们先按照横坐标为第一关键字,纵坐标为第二关键字,从小到大排序。显然,第一个点和最后一个点一定在凸包上。

大家先考虑求上凸壳,下凸壳同理。

在排好序的点中从小到大枚举,加入一个新点ccc时,如果形成了凹多边形(如下图),那么不合法,依照三角不等式,连接点aaa 和点 ccc更优,我们直接删掉点bbb,连接点 aaa 和点 ccc。否则直接加入点ccc,连接点 bbb 和点 ccc


这样就可能求出上凸壳了。

完成过程其实就是单调栈。

其实按照双关键字排序的作用只有求出第一个和最后一个点,在后续算法中,只需要按照横坐标排序即可。同样,我们发现,除了最后一个点之外,其余相同横坐标的情况下,只有纵坐标最高的点有可能成为上凸壳上的点。当然,这里直接用排序好的数组即可,方便,并且相同横坐标下纵坐标低的也不会影响结果。

如何判断是否形成凹多边形?可以发现,直线ababab的斜率小于直线bcbcbc的斜率,据此判断即可。如果求斜率有精度难题,可以去分母求(详见代码)。

这样,我们就得到了上凸壳的一个性质:其斜率依次递减。

时间复杂度 $O(n\log_{2}{n}) $,瓶颈在于排序。

3.代码

#include<bits/stdc++.h>//#define printf __mingw_printf//在一些本地编译器(如DEV和小熊猫)中,long double有兼容性问题,需要用//__mingw_printf输出,不过洛谷不需要,而且用__mingw_printf会报错using namespace std;const int N=1e5+5;struct point{double x,y;}a[N],q[N];int n,tp;bool cmp(point a,point b){return a.x==b.x?a.y<b.y:a.x<b.x;}int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%lf%lf",&a[i].x,&a[i].y);sort(a+1,a+1+n,cmp);q[++tp]=a[1];for(int i=2;i<=n;i++)//求上凸壳{while(tp>=2&&(a[i].y-q[tp].y)*(q[tp].x-q[tp-1].x)>=(q[tp].y-q[tp-1].y)*(a[i].x-q[tp].x))tp--;q[++tp]=a[i];}long double ans=0;//以防万一爆掉for(int i=1;i<tp;i++)//计算凸包周长ans+=sqrt((q[i].y-q[i+1].y)*(q[i].y-q[i+1].y)+(q[i].x-q[i+1].x)*(q[i].x-q[i+1].x));tp=1,q[tp]=a[n];for(int i=n-1;i>=1;i--){while(tp>=2&&(a[i].y-q[tp].y)*(q[tp].x-q[tp-1].x)>=(q[tp].y-q[tp-1].y)*(a[i].x-q[tp].x))tp--;q[++tp]=a[i];}for(int i=1;i<tp;i++)ans+=sqrt((q[i].y-q[i+1].y)*(q[i].y-q[i+1].y)+(q[i].x-q[i+1].x)*(q[i].x-q[i+1].x));printf("%.2Lf",ans);	//用Lf输出return 0;}

4.扩展用途

有什么用呢?有没有发现凸包和斜率优化很像?当然还有更多用途,这里就不多说了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑性能优化综合指南:从网络到硬件的不全面解答

目录 网络速度篇 硬件维护篇 系统优化篇 内存管理篇 CPU优化篇 综合建议 网络速度篇 Q1: 下载速度和上传速度跟什么有关?和网页加载速度有关联吗? ​​A:​​ 下载速度和上传速度是衡量网络性能的两个关键指标:…

宁波网站推广软件哪家强网站突然打不开

下载jenkins 官方下载地址&#xff1a;Jenkins 的安装和设置 清华源下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/windows-stable/ 最新支持java8的版本时2.346.1版本&#xff0c;在清华源中找不到&#xff0c;在官网中没找到windows的下载历史&#xff…

深度学习中Bootstrap详解 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

设计师需要了解的网站手机百度网页版 入口

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言评价AI模型“好不好”及“有没有发展”开源与闭源&#xff1a;两种发展路径的比较开源的优势与劣势闭源的优势与劣势 开源与闭源&#xff1a;你更看好哪一种&#x…

莆田做网站网站页面app下载大全

Vue思维导图目录MVC与MVVM的区别Vue基本代码结构Vue指令Vue组件class和style动态绑定computed计算属性EventBusfilter过滤器方法Vue是一套构建用户界面的框架&#xff0c;只关注视图层&#xff0c;它不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。(Vue有配套的第三…

电子商务网站建设课程站长工具成品源码

出现这个问题的原因在于系统分配的“恢复分区”空间不足&#xff0c;该更新在安装时会失败。大致的思路是利用dispart工具收缩C盘空间&#xff0c;扩展该分区的空间。本人开始的“恢复分区”的空间是603MB&#xff0c;安装更新失败&#xff0c;扩充了250MB后&#xff0c;成功了…

深入解析:【数据结构】不带头节点单链表的基本操作

深入解析:【数据结构】不带头节点单链表的基本操作2025-10-01 09:21 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; disp…

少儿舞蹈小脚本(20):手机号登录与多角色注册

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

私活做网站企业建设网站的重要性

大家好&#xff0c;我是阿星&#xff0c;好久不见&#xff0c;欢迎来到Java并发编程系列番外篇线程状态转换&#xff0c;内容通俗易懂&#xff0c;请放心食用。线程状态先来个开场四连问Java线程状态有几个&#xff1f;Java线程状态是如何转换&#xff1f;Java线程状态转换什么…

ps做网站动图wordpress数据库访问慢

安装pygame本人电脑是windows 10、python3.6&#xff0c;pygame下载地址&#xff1a;pypi.python.org/pypi/Pygame…请自行下载对应python版本的pygame运行以下命令创建Pygame窗口及响应用户输入新建一个文件夹alien_invasion&#xff0c;并在文件夹中新建alien_invasion.py文件…

网站分为几种类型重庆建设工程信息网查询平台入口官网

2019独角兽企业重金招聘Python工程师标准>>> 描述&#xff1a; 在文档流中&#xff0c;父元素的高度默认是被子元素撑开的&#xff0c;也就是子元素多高&#xff0c;父元素就多高。但是当子元素设置浮动之后&#xff0c;子元素会完全脱离文档流&#xff0c;此时将会…

MySQL 8 密码验证组件 validate_password 的详细指南

MySQL 8 密码验证组件 validate_password 的详细指南一、组件核心认知与环境准备1. 组件本质与版本差异validate_password 在 MySQL 8 中由「插件」升级为「内置组件」,解决了旧版插件依赖系统库的问题。核心优势:无…

珠海网站定制开发网站备案需要那些资料

1.磁盘分区 1.分区有固定大小 2.直接写在这块盘的磁盘分区表中&#xff08;DPT&#xff09;&#xff0c;和上面装什么操作系统没有任何关系 2.每一个磁盘分区都要先有一个磁盘分区类型 GPT&#xff08;首选&#xff09; MBR 3.磁盘专业术语叫做块设备&#xff08;Block Dev…

网站地图用什么格式网站后台有显示前台没有

04-15 周一 GitHub仓库CI服务器配置过程文档 时间版本修改人描述2024年4月15日10:35:52V0.1宋全恒新建文档2024年4月17日10:33:20v1.0宋全恒完成github actions CI的配置和工作流配置文件解读文档的撰写 简介 一些基础概念 前提知识 仓库介绍 地址镜像介绍https://github.…

实用指南:语义三角论对人工智能自然语言处理中深层语义分析的影响与启示

实用指南:语义三角论对人工智能自然语言处理中深层语义分析的影响与启示2025-10-01 09:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: a…

Android开发-存储框架技术总结 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

国内网站模板郑州纯手工seo

JAVA开发的一套&#xff08;智造制造领航者云MES系统成品源码&#xff09;saas云MES制造执行系统源码&#xff0c;全套源码&#xff0c;支持二次开发 1990年11月&#xff0c;美国先进制造研究中心AMR&#xff08;Advanced Manufacturing Research&#xff09;就提出了MES&#…

TensorFlow 详细安装指南与常见问题解决方案 - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

MySQL 8 密码验证组件(validate_password)

MySQL 8 密码验证组件(validate_password)在数据库安全体系中,“弱密码” 是最易被突破的防线之一。MySQL 8 引入的 validate_password 组件,通过标准化的密码强度检测与策略管控,从源头杜绝弱密码风险 —— 它替…

搜索引擎网站分析深圳龙霸网站建设物三

bash知识点&#xff1a;文件测试&#xff08;测试文件是否存在&#xff0c;文件是某种类型&#xff09;单目测试-e file:测试文件是是否存在-a file&#xff1a;测试文件是是否存在-f file&#xff1a;测试是否为普通文件,是为真&#xff0c;否则为假-d file&#xff1a;测试是…