凸包

凸包模板:

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,直接套用模板就可以了。

posted on 2011-11-08 16:35  buptLizer  阅读(194)  评论(0编辑  收藏  举报

导航