zoukankan      html  css  js  c++  java
  • 凸包

    凸包模板:

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

  • 相关阅读:
    python3-day6(模块)
    python3-day5(模块)
    python3-day4(re正则表达式,冒泡)
    python3-day4(递归)
    python3-day4(装饰器)
    python3-day3(内置函数)
    python3-day3(函数-参数)
    python3-day3(函数-返回值)
    android 开发学习3
    android 开发学习2
  • 原文地址:https://www.cnblogs.com/buptLizer/p/2241346.html
Copyright © 2011-2022 走看看