凸包真是乙個神奇的演算法。。
對於平面上的一些點,我們要求凸包上所有的點,可以使用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...