链接

连通图中:

设一个平面图形的顶点数为n,划分区域数为r,一笔画笔数为也就是边数m,则有:
n+r-m=2
那么不算外面的那个大区域的话 就可以写为 n+r-m = 1
那么这个题就可以依次求出每个连通图的r = m-n+1 累加起来 最后加上最外面那个平面。
 
注意交点的去重,对于一个圆的边数其实就是交点的数量(排除没有交点的情况)
 #include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
#include<vector>
#include<cmath>
#include<queue>
#include<set>
using namespace std;
#define N 55
#define LL long long
#define INF 0xfffffff
const double eps = 1e-;
const double pi = acos(-1.0);
const double inf = ~0u>>; struct point
{
double x,y;
point(double x=,double y=):x(x),y(y){}
};
vector<point>ed[N];
vector<int>dd[N];
vector<point>td[N];
struct circle
{
point c;
double r;
point ppoint(double a)
{
return point(c.x+cos(a)*r,c.y+sin(a)*r);
}
};
circle cp[N],cq[N];
int fa[N];
typedef point pointt;
pointt operator -(point a,point b)
{
return point(a.x-b.x,a.y-b.y);
} int dcmp(double x)
{
if(fabs(x)<eps) return ;
return x<?-:;
} bool operator == (const point &a,const point &b)
{
return dcmp(a.x-b.x)==&&dcmp(a.y-b.y)==;
}
double dis(point a)
{
return sqrt(a.x*a.x+a.y*a.y);
}
double angle(point a)//计算向量极角
{
return atan2(a.y,a.x);
}
double sqr(double x) { return x * x; } bool intersection(const point& o1, double r1, const point& o2, double r2,int k,int kk)
{
double d = dis(o1- o2);
if (d < fabs(r1 - r2) - eps || d > r1 + r2 + eps)
{
return false;
}
double cosa = (sqr(r1) + sqr(d) - sqr(r2)) / ( * r1 * d);
double sina = sqrt(max(., . - sqr(cosa)));
point p1 = o1,p2 = o1;
p1.x += r1 / d * ((o2.x - o1.x) * cosa + (o2.y - o1.y) * -sina);
p1.y += r1 / d * ((o2.x - o1.x) * sina + (o2.y - o1.y) * cosa);
p2.x += r1 / d * ((o2.x - o1.x) * cosa + (o2.y - o1.y) * sina);
p2.y += r1 / d * ((o2.x - o1.x) * -sina + (o2.y - o1.y) * cosa);
//cout<<p1.x<<" --"<<p2.x<<" "<<o1.x<<" "<<o1.y<<" "<<o2.x<<" "<<o2.y<<endl;
//printf("%.10f %.10f %.10f %.10f\n",p1.x,p1.y,p2.x,p2.y);
ed[k].push_back(p1);
ed[k].push_back(p2);
ed[kk].push_back(p1);
ed[kk].push_back(p2); return true;
}
bool cmp(circle a, circle b)
{
if(dcmp(a.r-b.r)==)
{
if(dcmp(a.c.x-b.c.x)==)
return a.c.y<b.c.y;
return a.c.x<b.c.x;
}
return a.r<b.r;
}
bool cmpp(point a,point b)
{
if(dcmp(a.x-b.x)==)
return a.y<b.y;
return a.x<b.x;
}
int find(int x)
{
if(fa[x]!=x)
{
fa[x] = find(fa[x]);
return fa[x];
}
return x;
}
int main()
{
int t,i,j,n;
cin>>t;
while(t--)
{
scanf("%d",&n);
for(i = ; i <= n ;i++)
{
ed[i].clear();fa[i] = i;
dd[i].clear();
td[i].clear();
}
for(i = ; i <= n ;i++)
scanf("%lf%lf%lf",&cp[i].c.x,&cp[i].c.y,&cp[i].r);
sort(cp+,cp+n+,cmp);
int g = ;
cq[g] = cp[g];
for(i = ; i <= n; i++)
{
if(cp[i].c==cp[i-].c&&dcmp(cp[i].r-cp[i-].r)==)
continue;
cq[++g] = cp[i];
}
for(i = ; i <= g; i++)
{
for(j = i+ ; j <= g; j++)
{
int flag = intersection(cq[i].c,cq[i].r,cq[j].c,cq[j].r,i,j);
if(flag == ) continue;
int tx = find(i),ty = find(j);
fa[tx] = ty;
}
}
for(i = ; i <= g; i++)
{
int fx = find(i);
dd[fx].push_back(i);
}
int B=,V=;
int ans = ;
int num = ;
for(i = ; i <= g; i++)
{
if(dd[i].size()==) continue;
B = ,V = ;
for(j = ;j < dd[i].size() ; j++)
{
int u = dd[i][j];
if(ed[u].size()==)
{
B++;
continue;
}
sort(ed[u].begin(),ed[u].end(),cmpp);
td[i].push_back(ed[u][]);
int o = ;
for(int e = ; e < ed[u].size() ; e++)
{
//printf("%.10f %.10f\n",ed[u][e].x,ed[u][e].y);
td[i].push_back(ed[u][e]);
if(ed[u][e]==ed[u][e-]) continue;
else o++;
}
B+=o;
}
sort(td[i].begin(),td[i].end(),cmpp);
V+=;
// cout<<td[i].size()<<endl;
for(j = ; j < td[i].size() ; j++)
{
//printf("%.10f %.10f\n",td[i][j].x,td[i][j].y);
if(td[i][j]==td[i][j-]) continue;
else V++; }
// cout<<B+1-V<<" "<<B<<" "<<V<<endl;
ans+=B+-V;
}
cout<<+ans<<endl;
}
return ;
}

zoj2589Circles(平面图的欧拉定理)的更多相关文章

  1. LA 3263 (平面图的欧拉定理) That Nice Euler Circuit

    题意: 平面上有n个端点的一笔画,最后一个端点与第一个端点重合,即所给图案是闭合曲线.求这些线段将平面分成多少部分. 分析: 平面图中欧拉定理:设平面的顶点数.边数和面数分别为V.E和F.则 V+F- ...

  2. Codeforces 1392I - Kevin and Grid(平面图的欧拉定理+FFT)

    Codeforces 题面传送门 & 洛谷题面传送门 模拟赛考到一道和这题有点类似的题就来补了 神仙 GLBR I %%%%%%%%%%%%%%%%%%%% 不过感觉见过类似的题目之后就比较套 ...

  3. poj2284 That Nice Euler Circuit(欧拉公式)

    题目链接:poj2284 That Nice Euler Circuit 欧拉公式:如果G是一个阶为n,边数为m且含有r个区域的连通平面图,则有恒等式:n-m+r=2. 欧拉公式的推广: 对于具有k( ...

  4. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  5. [bzoj1997][Hnoi2010]Planar(2-sat||括号序列)

    开始填连通分量的大坑了= = 然后平面图有个性质m<=3*n-6..... 由平面图的欧拉定理n-m+r=2(r为平面图的面的个数),在极大平面图的情况可以代入得到m=3*n-6. 网上的证明( ...

  6. ●POJ 2284 That Nice Euler Circuit

    题链: http://poj.org/problem?id=2284 题解: 计算几何,平面图的欧拉定理 欧拉定理:设平面图的定点数为v,边数为e,面数为f,则有 v+f-e=2 即 f=e-v+2 ...

  7. NOIP2018 No regrets youth

    NOIP2018在即,20181009总结一些易错的知识点和解题方法 ——by ljc20020730 HGOI NOIP2018 No regrets youth ! NOIP2018 No reg ...

  8. poj 2284 That Nice Euler Circuit 解题报告

    That Nice Euler Circuit Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 1975   Accepted ...

  9. LA_3263_That_Nice_Euler_Circuits_(欧拉定理+计算几何基础)

    描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&category=15& ...

随机推荐

  1. vnc里鼠标拖动终端就会产生ctrl+c终端

    然后把有道词典给关了就好了...

  2. YTU 2335: 0-1背包问题

    2335: 0-1背包问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 15  解决: 12 题目描述 试设计一个用回溯法搜索子集空间树的函数.该函数的参数包括结点可行性判定函数和上界 ...

  3. JSONArray传值的使用小结

    今天使用了SpringMVC+mybatis传值.从controller中传到service中.可是由于版本问题参数中不能有大写和下划线,在service中只能用String 来接受json字符串.接 ...

  4. ASP.NET生成缩略图的代码

    01.        // <summary> 02.        /// 生成缩略图 03.        /// </summary> 04.        /// &l ...

  5. 多校赛3- Painter 分类: 比赛 2015-07-29 19:58 3人阅读 评论(0) 收藏

    D - Painter Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status P ...

  6. UpdatePane中弹出框

    ScriptManager.RegisterClientScriptBlock(this.UpdatePanel21, typeof(UpdatePanel), "提示",&quo ...

  7. C#递归1~100的累加

    public static int Accum(int m, int n) { //对于接受的参数,要考虑m >n,m=n,m<n三种情况. if (m < n) { return ...

  8. Python学习笔记-Day3-python关键字

    1.and 逻辑与 2.assert 判断某个条件是否为真,如果为假,抛出错误 3.break跳出for,while循环 4.class 类定义 5.continue 跳出本次循环,执行下次循环 6. ...

  9. .Net验证码实现基础--Draw

    命名空间 using System.Draw; using System.Draw.Drawing2D; 在form等控件的 事件中 添加 paint事件 ///////画各种形状(空心)////// ...

  10. AVL学习笔记

    AVL,平衡二叉查找树.删除,插入,查找的复杂度都是O(logn).它是一棵二叉树.对于每个节点来说,它的左孩子的键值都小于它,右孩子的键值都大于它.对于任意一个节点,它的左右孩子的高度差不大于1.树 ...