Andrew演算法(我確實不懂Graham)

2022-07-31 03:00:25 字數 1124 閱讀 1889

先解釋一下:這兩個演算法分別都是凸包問題的演算法,然後andrew是graham的變種,速度更快,更穩定,非常優秀,介於我已經把graham寫的莫名其妙的wa了,所以我選擇了這種演算法!

凸包:給你n個散落的點,讓你求出最小的凸多邊形將所有的點包括起來,或者點在邊上。用到的演算法是graham或andrew!

first

首先先按照x座標大小或y座標大小進行排序(如果x座標一樣,y座標就從小到大排序如果y座標一樣那麼x座標就從小到大排序)

second

然後進入程式的主幹部分,先說一下andrew主幹的大體思路,我們分兩次來求這個凸包,先從左到右一遍,再從右到左一遍(或先從下到上一遍,再從上到下一遍)首先我們一定要明白第n-1個點一定會在第一遍時進入凸包棧內(看了上面鏈結的朋友都應該知道這個棧是如何操作的,這裡不再贅述)(因為n個點是從0n-1),所以第二遍的時候不必從n-1開始,從n-20開始就可以了(**上會有體現)然後就完了!

現在我們來詳細講一下如何實現second的操作

我們要實現找凸包,那麼就必須找到最外層的點,這裡就要使用叉積進行判斷(向量a叉向量b=a.x×b.y-b.x×a.y)如果為正a在b的右邊反之在左邊(題目中因為我們只能定義乙個基準座標系,所以為了實現這個功能我們就必須找參照點,參照點作為臨時原點)**中xmult會體現。

然後就差不多了!

下面就是**了:

#include#include#include#includeusing namespace std;

struct point;

bool cmp(point a,point b)

point node[100005];

int num[100005];

int n;

int main()

int basic=top;

for(int i=n-2;i>=0;--i)

double s;

s=0.0;

for(int i=1;i<=top;++i)

printf("%.1lf",s);

return 0;

}

凸包 Andrew演算法

凸包的定義如下 在乙個點集d中,按一定順序選取子集q 使得q中所有點順次連線所構成的封閉凸多邊形包住d中所有點 可以形象地理解為 有許多個釘子釘在平面上,用一根牛皮筋把所有點包住 如下圖 andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積...

凸包(Andrew演算法)模板

andrew演算法是graham的變種,相較graham,其更快,數值穩定性更好。藍書 struct nodep maxn ch maxn bool cmp node a,node b int cross node p0,node p1,node p2 凸包邊上可以有點,則 否則 int conve...

Andrew 演算法(構造凸包)

這是乙個基 graham 思想的又乙個演算法,我個人認為其中複雜度的改進應該是在 sort 的 cmp 部分吧,graham 的 cmp 部分需要對兩個點算出叉乘,甚至在某些情況還要算出兩個點的距離,這一步驟應該相對而言複雜度是較高的。而 andrew 很好的避免了這一步驟,直接通過對點的 x,y ...