Graham凸包演算法簡介

2021-08-04 15:05:25 字數 1265 閱讀 1750

凸包真是乙個神奇的演算法。。

對於平面上的一些點,我們要求凸包上所有的點,可以使用graham演算法 時間複雜度o(nlogn)

先找到最左下的點,把其他的點按叉積排序。然後維護乙個堆疊,每次利用叉積和棧頂比較判斷當前列舉到的點是否是凸包上的點,是則彈出棧頂元素

具體演算法click here

常熟巨大的醜陋**

# include 

# include

# include

# include

# include

# include

# define rg register

# define il inline

# define ll long long

# define mem(a, b) memset(a, b, sizeof(a))

# define min(a, b) (((a) > (b)) ? (b) : (a))

# define max(a, b) (((a) < (b)) ? (b) : (a))

# define sqr(a) ((a) * (a))

using

namespace

std;

const

int maxn = 50001;

int n, top;

struct point p[maxn], point_a, s[maxn]; //最左下的點

//求叉積(向量ab,向量ac)

il double cross(point a, point b, point c)

il double dis(point a, point b)

//極角排序

il bool cmp(point a, point b)

//查詢起始點,最左下

il void find()

p[temp] = p[1];

p[1] = a;

point_a = a;//儲存起始點

}//求凸包周長

il double length()

//計算面積

il double area()

il void graham()

s[++top] = p[1];

}int main()

return

0;}

板子題 1.surround the trees hdu - 1392 2.cows poj - 3348

Graham演算法 凸包問題

graham演算法的思路,大概如下 對平面上的點的集合,從中找到有最小的y座標值的點p,然後根據其它點和p的連線與正x軸所成的角度將平面上的點進行排序,排序後,掃瞄從p開始的有序列表,如果所有的這些點都在凸包上,那麼每三個相繼的點,會組成乙個左旋,從另一方面說,如果相繼的三個點,p1,p2,p3,組...

graham求凸包演算法

問題 點集q的凸包 convex hull 是指乙個最小凸多邊形,滿足q中的點或者在多邊形邊上或者在其內。這個演算法是由數學大師葛立恆graham發明的,他曾經是美國數學學會ams att 首席科學家.see 模板 see include include using namespace std cl...

幾何 凸包(Graham)

在凸包內部的點肯定不會是最遠點對之一,可以不考慮,只列舉在凸包上的所有點對距離長度,並進行比較即可 建凸包 當加入乙個新的點1,這個點和上兩個點2 3組成的角是銳角,則表示點2凹進去了,不是凸包上的點,把點2刪去 include include include include include inc...