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