凸包(极角序)模板

来源:互联网 发布:执业药师网络培训 编辑:程序博客网 时间:2024/05/29 12:38
#include<cstdio>#include<iostream>#include<cmath>#define INF 1000000000using namespace std;struct Point{    double x,y;}p[100005],st[100005];int n,top;double multiply(Point sp,Point ep,Point op){    return (sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y);}double dist(Point sp,Point op){    return sqrt((sp.x-op.x)*(sp.x-op.x)+(sp.y-op.y)*(sp.y-op.y));}bool cmp(const Point &a,const Point &b){    double tmp=multiply(a,b,p[0]);    return !(tmp<0||tmp==0&&dist(a,p[0])>dist(b,p[0]));}int main(){    freopen("convex.in","r",stdin);    freopen("convex.out","w",stdout);    cin>>n;    int i,mini;    double minx=INF,miny=INF;    for(i=1;i<=n;i++){        scanf("%lf %lf",&p[i].x,&p[i].y);        if(p[i].y<miny||p[i].y==miny&&p[i].x<minx){            minx=p[i].x;            miny=p[i].y;            mini=i;        }    }    p[0]=p[mini];    p[mini]=p[n--];    sort(p+1,p+n+1,cmp);/*    for(i=0;i<=n;i++)        printf("%.2lf %.2lf\n",p[i].x,p[i].y);*/    st[1]=p[0];    st[2]=p[1];    top=2;    for(i=2;i<=n;i++){        double tmp=multiply(st[top],p[i],st[top-1]);        while(tmp<=0&&top>=2){            top--;            if(top>=2)tmp=multiply(st[top],p[i],st[top-1]);        }        st[++top]=p[i];    }    for(i=1;i<=top;i++)        printf("%.0lf %.0lf\n",st[i].x,st[i].y);    return 0;}
0 0