凸包模板——Graham扫描法

First

标签: 数学方法——计算几何

题目:洛谷P2742[模板]二维凸包/[USACO5.1]圈奶牛Fencing the Cows

yyb的讲解:https://www.cnblogs.com/cjyyb/p/7260523.html

模板

#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<iomanip>
#include<algorithm>
#include<ctime>
#include<queue>
#include<stack>
#include<vector>
#define lst long long
#define ldb long double
#define N 50050
using namespace std;
const int Inf=1e9;
int read()
{
int s=0,m=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')m=1;ch=getchar();}
while(ch>='0'&&ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
return m?-s:s;
} int n,top;
struct NODE{ldb x,y;}ljl[N],tb[N];
//tb[]用来储存在凸包上的点(数组模拟栈来维护) //极角排序的cmp
bool cmp(const NODE &a,const NODE &b)
{
ldb A=atan2((a.y-ljl[1].y),(a.x-ljl[1].x));//就是那个角度(极角)
ldb B=atan2((b.y-ljl[1].y),(b.x-ljl[1].x));
if(A==B)return a.x<b.x;
return A<B;
}
/************************
计算叉积(向量之间)(向量用坐标法表示)
A×B>0 则说明B在A的左上方
A×B<0 则说明B在A的右下方
************************/
ldb Cross(NODE a,NODE b,NODE c)
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
void Get_tb()
{
NODE hh=(NODE){Inf,Inf};int kk=0;
for(int i=1;i<=n;++i)
if((ljl[i].y<hh.y)||(ljl[i].y==hh.y&&ljl[i].x<hh.x))
hh=ljl[i],kk=i;
swap(ljl[1],ljl[kk]);//先找一个凸包的“起点”放在第一个
sort(&ljl[2],&ljl[n+1],cmp);//极角排序
tb[0]=ljl[1],tb[top=1]=ljl[2];
for(int i=3;i<=n;++i)//按极角排序的顺序一个一个判断
{
while(top&&Cross(tb[top-1],ljl[i],tb[top])>=0)top--;
//如果凸包还存在 且 叉积>=0(新加的这个向量在从前向量的左上方)就要一直弹
tb[++top]=ljl[i];
}
} ldb Dist(NODE a,NODE b)
{//两点之间的距离
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void Get_zc()
{
ldb C=0;
for(int i=1;i<=top;++i)
C+=Dist(tb[i-1],tb[i]);//凸包上两点的距离
if(top>1)C+=Dist(tb[top],tb[0]);//记得首尾相接
printf("%.2Lf\n",C);
} int main()
{
n=read();
for(int i=1;i<=n;++i)
scanf("%Lf%Lf",&ljl[i].x,&ljl[i].y);
Get_tb(),Get_zc();
return 0;
}

凸包模板——Graham扫描法的更多相关文章

  1. 计算几何--求凸包模板--Graham算法--poj 1113

    Wall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 28157   Accepted: 9401 Description ...

  2. 凸包入门(Graham扫描法)(A - Wall POJ - 1113)

    题目链接:https://cn.vjudge.net/contest/276359#problem/A 题目大意:有一个国王,要在自己的城堡周围建立围墙,要求围墙能把城堡全部围起来,并且围墙距离城堡的 ...

  3. poj1113Wall 求凸包周长 Graham扫描法

    #include<iostream> #include<algorithm> #include<cmath> using namespace std; typede ...

  4. (模板)poj1113(graham扫描法求凸包)

    题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是kuangbin的. AC code ...

  5. (模板)graham扫描法、andrew算法求凸包

    凸包算法讲解:Click Here 题目链接:https://vjudge.net/problem/POJ-1113 题意:简化下题意即求凸包的周长+2×PI×r. 思路:用graham求凸包,模板是 ...

  6. 【BZOJ-1670】Building the Moat护城河的挖掘 Graham扫描法 + 凸包

    1670: [Usaco2006 Oct]Building the Moat护城河的挖掘 Time Limit: 3 Sec  Memory Limit: 64 MBSubmit: 464  Solv ...

  7. 凸包算法(Graham扫描法)详解

    先说下基础知识,不然不好理解后面的东西 两向量的X乘p1(x1,y1),p2(x2,y2) p1Xp2如果小于零则说明  p1在p2的逆时针方向 如果大于零则说明 p1在p2的顺时针方向 struct ...

  8. 计算几何 : 凸包学习笔记 --- Graham 扫描法

    凸包 (只针对二维平面内的凸包) 一.定义 简单的说,在一个二维平面内有n个点的集合S,现在要你选择一个点集C,C中的点构成一个凸多边形G,使得S集合的所有点要么在G内,要么在G上,并且保证这个凸多边 ...

  9. Graham 扫描法找凸包(convexHull)

    凸包定义 通俗的话来解释凸包:给定二维平面上的点集,凸包就是将最外层的点连接起来构成的凸多边型,它能包含点集中所有的点  Graham扫描法 由最底的一点 \(p_1\) 开始(如果有多个这样的点, ...

随机推荐

  1. ElasticSearch基本概念阐述

    下面阐述一下ES当中的一些常见词语含义: 集群 集群由一个或多个节点组成,对外提供服务,索引和搜索功能.在所有的节点中,一个集群有一个唯一的名称默认为“ElasticSearch”,此名称很重要,因为 ...

  2. 详解webpack4打包--新手入门(填坑)

    注意,这个dev和build好像在哪儿见过??对了, 刚刚才在package.json里配置的“scripts”这一项的值就有“dev”和“build”.对,一点都不错,就是这2个值,这2个值代表的是 ...

  3. linux--基础知识2

    #超级用户root的家目录是/root ,而普通用户的家目录被存放在/home目录下 cd /目录  切换到指定目录 注意 /  是根目录 linux的一些重要目录 1.bin目录,用来存放常用的可执 ...

  4. thinkphp 响应对象response

    1.可以通过修改配置文件的 default_return_type修改输出类型 // 默认输出类型 'default_return_type' => 'html', 2. 可以通过Config类 ...

  5. 数据库(一):事务的特性与事务(在同一个 JVM 中)的传递

    参考文章 https://blog.csdn.net/shuaihj/article/details/14163713 https://blog.csdn.net/shfqbluestone/arti ...

  6. 实现bind函数

    面试中碰到的bind函数,今天来研究下 //1.bind的返回值是函数 var obj={ name:"zhouy" } function f() { console.log(th ...

  7. Graph Convolutional Network

    How to do Deep Learning on Graphs with Graph Convolutional Networks https://towardsdatascience.com/h ...

  8. CSS基础知识总结之css样式引用的三种方式

    在html中增加css样式有三种: 1.在标签中增加style属性: <!DOCTYPE html> <html lang="en" xmlns="ht ...

  9. 让VirtualBox虚拟机实现开机自动后台运行

    转至:http://www.cnblogs.com/top5/archive/2012/01/19/2326234.html 测试环境:Host OS: Windows 7 x64 Guest OS: ...

  10. 定时任务cron表达式解析

    cron表达式2种: Seconds Minutes Hours DayofMonth Month DayofWeek Year或 Seconds Minutes Hours DayofMonth M ...