二维凸包模板

double cross(Point a,Point b)

{

    return a.x*b.y-a.y*b.x;

}

double mul(Point p0,Point p1,Point p2)

{

    return cross(p1-p0,p2-p0);

}

double dis(Point a)

{

    return sqrt(a.x*a.x+a.y*a.y);

}

bool cmp(Point a,Point b)

{

    if(dcmp(mul(p[0],a,b))==0)

        return dis(a-p[0])<dis(b-p[0]);

    else

        return dcmp(mul(p[0],a,b))>0;

}

int Graham(int n)

{

    int i,k = 0,top;

    Point tmp;

    for(i = 0 ; i < n; i++)

    {

        if(p[i].y<p[k].y||(p[i].y==p[k].y&&p[i].x<p[k].x))

            k = i;

    }

    if(k!=0)

    {

        tmp = p[0];

        p[0] = p[k];

        p[k] = tmp;

    }

    sort(p+1,p+n,cmp);

    ch[0] = p[0];

    ch[1] = p[1];

    top = 1;

    for(i = 2; i < n ; i++)

    {

        while(top>0&&dcmp(mul(ch[top-1],ch[top],p[i]))<0)

            top--;

        top++;

        ch[top] = p[i];

    }

    return top;

}

 

你可能感兴趣的:(模板)