【模板】Andrew算法 求凸包
来源:互联网 发布:阿里云总部地址 编辑:程序博客网 时间:2024/06/05 09:26
凸包问题的一般解法有:Graham算法、Melkman算法、Andrew算法等
Andrew算法是Graham算法的变种。
由于Andrew算法代码简便,效率比较高,笔者更推荐使用Andrew算法
参考博客:凸包——Andrew算法
#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const double eps=1e-7;const int maxn=105;int n;struct point{ double x,y; point() {} point(double a,double b):x(a),y(b) {} bool operator<(const point&b)const{ if (x<b.x) return 1; if (x>b.x) return 0; return y<b.y; } point operator-(const point&b) {return point(x-b.x,y-b.y);}}a[maxn],stk[maxn];typedef point vec;int dcmp(double x){ if (fabs(x)<=eps) return 0; return x>0?1:-1;}double getdst(point a,point b){ return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}double cross(vec a,vec b){ return a.x*b.y-a.y*b.x;}int Andrew(){ sort(a+1,a+1+n); int len=0; for (int i=1;i<=n;i++){ while (len>1&&dcmp(cross(stk[len]-stk[len-1],a[i]-stk[len-1]))==-1) len--; stk[++len]=a[i]; } int k=len; for (int i=n-1;i>=1;i--){ while (len>k&&dcmp(cross(stk[len]-stk[len-1],a[i]-stk[len-1]))==-1) len--; stk[++len]=a[i]; } return len;}int main(){ for (scanf("%d",&n);n;scanf("%d",&n)){ for (int i=1;i<=n;i++) scanf("%lf%lf",&a[i].x,&a[i].y); int t=Andrew(); double ans=0; for (int i=1;i<t;i++) ans+=getdst(stk[i],stk[i+1]); printf("%.2lf\n",n==2?ans/2:ans); } return 0;}
阅读全文
2 0
- 【模板】Andrew算法 求凸包
- 【凸包模板】Graham算法、Andrew算法
- 【几何】-Andrew算法求凸包
- Andrew算法求凸包
- 1214:凸包模板(Andrew算法)
- 凸包之Andrew算法——模板整理
- 凸包 andrew模板
- UVA 11168 - Airport (Andrew算法)
- 二维凸包 Andrew算法
- 凸包——Andrew(安德鲁)算法
- zoj 1453 Surround the Trees Andrew算法
- 凸包——Andrew算法
- 计算几何--凸包--Andrew算法--HDU1392
- 计算几何凸包的算法 Andrew和Melkman算法
- 【解题报告】 NYOJ 78 -- 圈水池 Andrew 凸包算法
- 束搜索算法(Andrew Jungwirth 初稿)BEAM Search
- 计算几何 二维凸包问题 Andrew算法
- POJ 1228 || Grandpa's Estate(凸包andrew算法
- 正则表达式大全
- Django11-表单(Form)
- 比较好的网址记录
- c语言实现fcfs,rr_1,spn,srt4种调度算法(无数据结构)
- php判断session是否设置
- 【模板】Andrew算法 求凸包
- codeforces 812B Sagheer, the Hausmeister dp
- 关于HTML中scr与href的区别
- 1344 走格子
- JNI多线程与内存回收
- 微服务可靠性设计
- 登录窗口界面
- 1381 硬币游戏
- mysql主从,主主备份原理及实践