HDU 1665 or UVALive 3263 || That Nice Euler Circuit (欧拉定理求面数 F = E+2-V

HDU 1665 or UVALive 3263 || That Nice Euler Circuit (欧拉定理求面数 F = E+2-V_第1张图片

N个端点的一笔画,第N个端点与点一个端点重合。

求这条闭合曲线,将平面分成多少部分。(包括封闭区域和无限大区域

欧拉定理:

设平面图的顶点数 V ,边数 E ,面数 F ,则 F = E+2-V

分析:

1:算出顶点数,包括交点,有可能三条线段交于一点,需要去重。

2:算出线段数,如果原来的线段新增加一个点,那么一条线段一为二,所以一条线段每新增一个点就多出一条线段。

代码细节见注释。

函数:

unique --》返回去重(需排序)后的数组最后一个元素的地址。(并不是删除元素而是将这些元素后移。

#include
#include
#include
#include
using namespace std;

struct point
{
    double x,y,d;
    point(double a,double b):x(a),y(b){}
    point(){}
};
typedef point vec;
//向量+向量=向量
//点  +向量=点
vec operator +  ( vec a,   vec b)      {  return vec(a.x+b.x,a.y+b.y);}

vec operator -  ( point a, point b)    {  return vec(a.x-b.x,a.y-b.y);}

vec operator *  ( vec a,   double p)   {  return vec(a.x*p,a.y*p);}

vec operator /  ( vec a,   double p)   {  return vec(a.x/p,a.y/p);}

bool operator < ( const point &a,const point &b)
{
     return a.x



你可能感兴趣的:(计算几何,Uva,HDU,1665,UVALive,3263,That,Nice,Euler,Circ)