博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二维凸包
阅读量:6825 次
发布时间:2019-06-26

本文共 1930 字,大约阅读时间需要 6 分钟。

Graham算法

先对所有点极角排序,其实这里有一个比较骚的操作,不用比x,y,直接算两个点的叉积

然后根据叉积的定义就可以看出这个极角的大小啦!

然后我们找到最靠左的那个点,把它压入栈,每次判断下一个点j和当前点i的叉积是否<0

如果小于0,还是由叉积的定义,j与i的连线是向右拐的(形象理解一下),所以就可以把这个点压入栈

持续递归到回到原点,栈里的点就是凸包集合

 

#include
#include
#include
#include
#include
#include
using namespace std;#define O(x) cout << #x << " " << x << endl;#define O_(x) cout << #x << " " << x << " ";#define B cout << "breakpoint" << endl;typedef double db;inline int read(){ int ans = 0,op = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') op = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') { (ans *= 10) += ch - '0'; ch = getchar(); } return ans * op;}const int maxn = 1e5 + 5;int n;struct point{ db x,y; void clear() { x = y = 0; } point operator - (const point &b) { point c; c.clear(); c.x = x - b.x,c.y = y - b.y; return c; } db operator * (const point &b) { return x * b.y - y * b.x; } db dis() { return x * x + y * y; }}p[maxn],st[maxn];db calc(point a,point b){ point c = a - b; return sqrt(c.dis()); }bool cmp(int a,int b){ db dta = (p[a] - p[1]) * (p[b] - p[1]); if(dta != 0) return dta > 0; return (p[a] - p[1]).dis() < (p[b] - p[1]).dis();}int top;void Graham(){ int id = 1; for(int i = 2;i <= n;i++) if(p[i].x < p[id].x || (p[i].x == p[id].x && p[i].y < p[id].y)) id = i; if(id != 1) swap(p[1],p[id]); int tp[maxn]; for(int i = 1;i <= n;i++) tp[i] = i; sort(tp + 2,tp + 1 + n,cmp); st[++top] = p[1]; for(int i = 2;i <= n;i++) { int j = tp[i]; while(top >= 2 && (p[j] - st[top - 1]) * (st[top] - st[top - 1]) >= 0) top--; st[++top] = p[j]; }}db ans;int main(){ n = read(); for(int i = 1;i <= n;i++) scanf("%lf%lf",&p[i].x,&p[i].y); Graham(); st[top + 1] = st[1]; for(int i = 2;i <= top + 1;i++) ans += calc(st[i],st[i - 1]); printf("%.2lf",ans);}
View Code

 

转载于:https://www.cnblogs.com/LM-LBG/p/10877801.html

你可能感兴趣的文章
Varnish介绍,安装与配置详解。
查看>>
CentOS bash漏洞威胁恐比“心脏流血”更大
查看>>
LINUX总结
查看>>
SCOM 2016监控IIS 网页服务
查看>>
通用权限管理系统组件 (GPM - General Permissions Manager) 中最简单的例子程序,如何时间通讯录管理...
查看>>
Ajax
查看>>
端口基础常识大全贴
查看>>
Cisco交换机的经典配置(2)
查看>>
稳扎稳打Silverlight(24) - 2.0通信之Socket, 开发一个多人聊天室
查看>>
毕业论文一次性修改所有字母和数字的字体
查看>>
vsphere5.2.安装部署VMware ESXi 5 上 视频共享
查看>>
impala1.2.3 udf问题
查看>>
数据仓库专题23-原则!原则!原则!
查看>>
细节决定成败2: 链路负载均衡遇到IPS
查看>>
LigerUI中通过加载服务端数据进行表格的分页显示
查看>>
Hyper-V 2016 系列教程40 使用 PowerShell 实现虚拟机自动化和管理虚拟机
查看>>
手把手教你 MongoDB 的安装与详细使用(二)
查看>>
GNS 3所能模拟的硬件以及详解
查看>>
小型机业务迁移到虚拟化PC服务器上之性能换算分析
查看>>
根据Web服务器记录来追击黑客
查看>>