Graham算法
前言:本菜鸡的第一篇算几,记录一下我有多菜 Graham算法 一种凸包算法,扫描部分的时间复杂度为 O ( n ) \mathcal{O}(n) O ( n ) ,总的时间复杂度 O ( n l o g n ) \mathcal{O}(nlogn) O ( n l o g n ) 原理:从点集中先找出一个最左下方的点,易证这个点肯定在凸包上,然后以这点为极点,将所有点根据与这点的极角进行排序,并且同时使用一个栈结构维护凸包上的点。按照极角序依次将当前点与栈顶的两个点作拐向判断:若右拐,则将当前点加入栈中,否则将栈顶点弹出。当点集遍历完之后,还在栈中的点就是凸包上的点。 算法步骤 对所有点进行排序,选择 x x x 坐标最小的点作为极点,即找到第一个一定在凸包上的点 bool cmp1 ( const Pnt & a , const Pnt & b ) { return a . x != b . x ? a . x < b . x : a . y < b . y ; } 将其余所有点按照极角排序,在极角相同的情况下比较与极点的距离,按极角序依次处理每一个点 inline bool cmp2 ( const Pnt & st , const Pnt & ed ) { //按极角排序 int del = p [ st ] * p [ ed ] ; if ( del != 0 )