凸包模板:
struct Point{
int x,y;
Point operator =(const Point & p)
{
x=p.x;
y=p.y;
return *this;
}
};
Point m[N+2],s[N+2];
int cro(Point p0,Point p1,Point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
double dis(Point p1,Point p2)
{
return sqrt(double((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
int cmp(Point p1,Point p2)
{
if(cro(m[0],p1,p2)>eps)
return 1;
else if(cro(m[0],p1,p2)<(-1)*eps)
return 0;
else
{
if(dis(p1,m[0])<dis(p2,m[0]))
return 1;
return 0;
}
}
void Graham()
{
int i,j,top,miny,minx,minIdx,n;
Point tmp;
i=0;
while(scanf("%d%d",&m[i].x,&m[i].y)!=EOF)
{
++i;
if(1==i)
{
miny=m[i].y;
minx=m[i].x;
minIdx=0;
}
else
{
if(m[i].y<miny || ((m[i].y == miny) && (m[i].x<minx)))
{
minIdx=i;
miny=m[i].y;
minx=m[i].x;
}
}
}
n=i;
tmp=m[minIdx];
m[minIdx]=m[0];
m[0]=tmp;
sort(m+1,m+n,cmp);
s[0]=m[0];
s[1]=m[1];
top=1;
for(i=2;i<n;++i)
{
while(1<=top && cro(s[top-1],s[top],m[i])<=0)
--top;
s[++top]=m[i];
}
//top+1为凸包上的顶点个数 }
poj上凸包的题目:
poj1113,poj1228,poj2007,直接套用模板就可以了。