Graham 扫描算法求凸包,poj 2187(水题但是是我的第一个求n点集凸包模板)
来源:互联网 发布:天津相声知乎 编辑:程序博客网 时间:2024/05/20 11:51
这个题的题意很简单,就是求两个点之间的最远距离但是数据规模有点大,两个点的枚举是肯定超时的,那么仔细想一下,距离最远的点肯定是最外圈的点中的某两个
那么我们枚举最外层的点就可以了,最外层的最小凸多边形的点集就叫做原点集的凸包,也就是去求n点集对应的凸包
#include<iostream>#include<cstdio>#include<string>#include<vector>#include<cmath>#include<algorithm>using namespace std;double EPS = 1e-10;double add(double a,double b){ if(abs(a+b)<EPS*(abs(a)+abs(b))) return 0; return a+b;}
//二维向量结构体struct P{ double x,y; P() {} P(double x,double y) : x(x),y(y) { } P operator + (P p){ return P(add(x,p.x),add(y,p.y)); } P operator -(P p){ return P(add(x,-p.x),add(y,-p.y)); }
//内积 double dot(P p){ return add(x*p.x,y*p.y); }
//外积 double det (P p){ return add(x*p.y,-y*p.x); }};P ps[10000000];int n;bool cmp(const P& p,const P& q){ if(p.x!=q.x) return p.x<q.x; return p.y<q.y;}vector<P> convex_hull(P* ps,int n){ sort(ps,ps+n,cmp); int k=0; vector<P> qs(n*2); for(int i=0;i<n;i++){ while(k>1 && (qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--; qs[k++]=ps[i]; } for(int i=n-2,t=k;i>=0;i--){ while(k>t && (qs[k-1]-qs[k-2]).det(ps[i]-qs[k-1])<=0) k--; qs[k++]=ps[i]; } qs.resize(k-1); return qs;}double dist(P p,P q){ return (p-q).dot(p-q);}int main(){ while(~scanf("%d",&n)){ for(int i=0;i<n;i++){ scanf("%lf%lf",&ps[i].x,&ps[i].y); } vector<P> qs =convex_hull(ps,n); double res=0; for(int i=0;i<qs.size();i++){ for(int j=0;j<i;j++){ res =max(res,dist(qs[i],qs[j])); } } printf("%.0lf\n",res); } return 0;}
0 0
- Graham 扫描算法求凸包,poj 2187(水题但是是我的第一个求n点集凸包模板)
- 第一个graham扫描法求的凸包程序
- 【POJ 2187】 Beauty Contest (凸包-Graham扫描算法)
- 二维凸包模板 【Graham扫描算法】
- 计算几何--求凸包模板--Graham算法--poj 1113
- POJ 2187 Beauty Contest(凸包-Graham扫描法)
- 这个是我的第一个博客,新人求关照
- poj 2007 Scrambled Polygon(凸包Graham扫描线模板)
- 求凸包——Graham扫描算法
- 我的第一个算法题
- Graham扫描算法(Graham Scan Algorithm)
- poj3348(求凸包的面积)graham算法。
- 凸包模板(分治 or Graham扫描法)
- 好题——hdu2522(小数问题:求1/n的第一个循环节)
- 求大于自己的第一个2的N次方算法
- POJ 2187-Beauty Contest(凸包-Graham扫描法/旋转卡壳法)
- N条线段求交的扫描算法
- 凸包问题的Graham扫描算法实现
- 网络请求
- SAM4S NVIC的理解与分析
- 基于oracle的在线考试系统的设计
- interrupted()
- note
- Graham 扫描算法求凸包,poj 2187(水题但是是我的第一个求n点集凸包模板)
- java单件模式
- python 一些特殊函数!【lambda, map, reduce, filter】
- Fedora 19修改主机名
- 题目1206:字符串连接
- 显著性检测
- poj3085
- EasyGoing(出行无忧)
- C# out和ref