题链:

http://poj.org/problem?id=2284

题解:

计算几何,平面图的欧拉定理

欧拉定理:设平面图的定点数为v,边数为e,面数为f,则有 v+f-e=2

即 f=e-v+2

所以$N^2$求出所以线段的交点,并去重,

然后再计算出最后共有多少边,(判断点是否在线段上,是的话则e++)

总的复杂度 $O(N^3)$

代码:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define MAXN 350
  6. using namespace std;
  7. const double eps=1e-8;
  8. struct Point{
  9. double x,y;
  10. Point(double _x=0,double _y=0):x(_x),y(_y){}
  11. };
  12. typedef Point Vector;
  13. int sign(double x){
  14. if(-eps<=x&&x<=eps) return 0;
  15. return x<0?-1:1;
  16. }
  17. bool operator < (const Point &A,const Point &B){return sign(A.x-B.x)<0||(sign(A.x-B.x)==0&&sign(A.y-B.y)<0);}
  18. bool operator == (const Point &A,const Point &B){return sign(A.x-B.x)==0&&sign(A.y-B.y)==0;}
  19. Vector operator + (Vector A,Vector B){return Vector(A.x+B.x,A.y+B.y);}
  20. Vector operator - (Point A,Point B){return Vector(A.x-B.x,A.y-B.y);}
  21. Vector operator * (Vector A,double p){return Vector(A.x*p,A.y*p);}
  22. double operator ^ (Vector A,Vector B){return A.x*B.y-A.y*B.x;}
  23. double operator * (Vector A,Vector B){return A.x*B.x+A.y*B.y;}
  24. Point D[MAXN],V[MAXN*MAXN];
  25. int N;
  26. bool SPI(Point a1,Point a2,Point b1,Point b2){//Segment_Proper_Intersection
  27. static double c1,c2,c3,c4;
  28. c1=(a2-a1)^(b1-a1); c2=(a2-a1)^(b2-a1);
  29. c3=(b2-b1)^(a1-b1); c4=(b2-b1)^(a2-b1);
  30. return sign(c1*c2)<0&&sign(c3*c4)<0;
  31. }
  32. bool OS(Point P,Point a1,Point a2){//On_Segment
  33. return sign((P-a1)^(P-a2))==0&&sign((P-a1)*(P-a2))<0;
  34. }
  35. Point GLI(Point P,Vector v,Point Q,Vector w){//Get_Line_Intersection
  36. static Vector u; u=P-Q;
  37. return P+v*((w^u)/(v^w));
  38. }
  39. int main(){
  40. int Case=0,v,e;
  41. while(scanf("%d",&N)&&N){
  42. for(int i=1;i<=N;i++)
  43. scanf("%lf%lf",&D[i].x,&D[i].y),V[i]=D[i];
  44. N--; v=N; e=N;
  45. for(int i=1;i<=N;i++)
  46. for(int j=1;j<i;j++)
  47. if(SPI(D[j],D[j+1],D[i],D[i+1]))
  48. V[++v]=GLI(D[j],D[j+1]-D[j],D[i],D[i+1]-D[i]);
  49. sort(V+1,V+v+1);
  50. v=unique(V+1,V+v+1)-V-1;
  51. for(int i=1;i<=v;i++)
  52. for(int j=1;j<=N;j++)
  53. if(OS(V[i],D[j],D[j+1])) e++;
  54. printf("Case %d: There are %d pieces.\n",++Case,e-v+2);
  55. }
  56. return 0;
  57. }

  

●POJ 2284 That Nice Euler Circuit的更多相关文章

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

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

  2. POJ 2284 That Nice Euler Circuit (LA 3263 HDU 1665)

    http://poj.org/problem?id=2284 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&a ...

  3. pku 2284 That Nice Euler Circuit

    题意: 给你n个点第n个点保证与第0个点相交,然后求这n个点组成的图形可以把整个平面分成几个面 思路: 这里的解题关键是知道关于多面体的欧拉定理 多面体: 设v为顶点数,e为棱数,f是面数,则v-e+ ...

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

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

  5. POJ2284 That Nice Euler Circuit (欧拉公式)(计算几何 线段相交问题)

                                                          That Nice Euler Circuit Time Limit: 3000MS   M ...

  6. UVa 10735 (混合图的欧拉回路) Euler Circuit

    题意: 给出一个图,有的边是有向边,有的是无向边.试找出一条欧拉回路. 分析: 按照往常的思维,遇到混合图,我们一般会把无向边拆成两条方向相反的有向边. 但是在这里却行不通了,因为拆成两条有向边的话, ...

  7. UVA 10735 Euler Circuit 混合图的欧拉回路(最大流,fluery算法)

    题意:给一个图,图中有部分是向边,部分是无向边,要求判断是否存在欧拉回路,若存在,输出路径. 分析:欧拉回路的定义是,从某个点出发,每条边经过一次之后恰好回到出发点. 无向边同样只能走一次,只是不限制 ...

  8. UVA-10735 - Euler Circuit(混合欧拉回路输出)

    题意:给你一个图,有N个点,M条边,这M条边有的是单向的,有的是双向的. 问你能否找出一条欧拉回路,使得每条边都只经过一次! 分析: 下面转自别人的题解: 把该图的无向边随便定向,然后计算每个点的入度 ...

  9. Uva 1342 - That Nice Euler Circuit

    Little Joey invented a scrabble machine that he called Euler, after the great mathematician. In his ...

随机推荐

  1. Java 密码学算法

    Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...

  2. Archlinux安装和使用技巧

    一 准备工作 1  文件下载及启动盘制作 文件可以在https://mirrors.ustc.edu.cn/,这是个中科大的镜像网,选择如下: 下载完成后,就是制作一个启动盘,我使用的是Linux下强 ...

  3. Django restful-framework初步学习

    urls.py from django.conf.urls import include, url from django.contrib import admin from rest_framewo ...

  4. ord在python是什么意思?

    >>> help(ord)Help on built-in function ord in module builtins:ord(...) #这是一个函数 ord(c) -> ...

  5. Python习题(第一课)

    想了想其他的太简单了,还是不放了,剩三题吧. 一.完美立方 编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a^3= b^3 + c^3 + d^3,其中 ...

  6. navicate连接不上阿里云mysql

    一 用xshell连接进入服务器: 二 使用命令连接mysql mysql -uroot -p 三 更新权限 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDE ...

  7. 数据库 MYSQL操作(一)

    数据库  MYSQL操作总结(一) 本文主要介绍一下笔者在使用数据库操作的过程中的一些总结,主要的内容包括一下几个内容: 一.mysql 使用基础(主要包括数据库的安装.基本操作等内容) 二.mysq ...

  8. sublime使用攻略

    一些常用的快捷键 Ctrl+Enter 在下一行插入新行.举个例子:即使光标不在行尾,也能快速向下插入一行. Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本. Ctrl+Shift ...

  9. angular2 学习笔记 ( Rxjs, Promise, Async/Await 的区别 )

    Promise 是 ES 6 Async/Await 是 ES 7 Rxjs 是一个 js 库 在使用 angular 时,你会经常看见这 3 个东西. 它们都和异步编程有关,有些情况下你会觉得用它们 ...

  10. Linux实战案例(6)yum查找、卸载、和安装软件

    0.查找要安装的软件名字 yum search iostat就能查到以及iostat相干的安装包了, 别的想安装一个程序,只记得一部门名称,也可以用这个措施来实现安装 yum search png | ...