andrew演算法是graham的變種,相較graham,其更快,數值穩定性更好。 ——《藍書》
struct nodep[maxn], ch[maxn];
bool cmp(node a, node b)
int cross(node p0, node p1, node p2)
//凸包邊上可以有點,則<,否則<=
int convex_hull(polygon &pol, int n);
for(int i=0; i1 && cross(ch[top-1] - ch[top-2], pol[i] - ch[top-1]) < 0) top --;
ch[top ++] = pol[i];
}int mid = top;
for(int i=n-2; i>=0; --i)
// printf("#%d\n", top);
if(n > 1) top --;
return top;
}
練習:zoj-3537
凸包+區間dp+三角剖分
可參見:
#include#include#includeusing namespace std;
const int maxn = 305, inf = 1e9;
struct nodep[maxn], ch[maxn];
int dp[maxn][maxn], cost[maxn][maxn];
bool cmp(node a, node b)
int cross(node p0, node p1, node p2)
int abs(int x)
int convex_hull(node *p, int n)
return top; //凸包節點個數 ,因為0與top存的節點相同,所以不是top+1
}int main()
// for(int len=1; len<=n; ++len)
// for(int i=0; i+lenprintf("%d\n", dp[0][n-1]);
} return 0;
}
凸包 Andrew演算法
凸包的定義如下 在乙個點集d中,按一定順序選取子集q 使得q中所有點順次連線所構成的封閉凸多邊形包住d中所有點 可以形象地理解為 有許多個釘子釘在平面上,用一根牛皮筋把所有點包住 如下圖 andrew演算法是graham演算法的變種。其主要思想為把凸包上的點依次放入棧中,如果發現形成了凹多邊形 叉積...
Andrew 演算法(構造凸包)
這是乙個基 graham 思想的又乙個演算法,我個人認為其中複雜度的改進應該是在 sort 的 cmp 部分吧,graham 的 cmp 部分需要對兩個點算出叉乘,甚至在某些情況還要算出兩個點的距離,這一步驟應該相對而言複雜度是較高的。而 andrew 很好的避免了這一步驟,直接通過對點的 x,y ...
二維凸包 Andrew演算法
把給定點包圍在內部的 面積最小的凸多邊形 設向量 p x1,y1 q x2,y2 則 p q x1 y2 x2 y1 其結果是乙個由 0,0 p,q,p q 所組成的平行四邊形的 帶符號的面積,p q q p p q p q 叉積的乙個非常重要的性質是可以通過它的符號來判斷兩向量相互之間的順逆時針關...