凸包

凸包模板:

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

你可能感兴趣的:(包)