题目描述

若能将无向图G=(V,E)画在平面上使得任意两条无重合顶点的边不相交,则称G是平面图。判定一个图是否为平面图的问题是图论中的一个重要问题。现在假设你要判定的是一类特殊的图,图中存在一个包含所有顶点的环,即存在哈密顿回路。

输入输出格式

输入格式:

输入文件的第一行是一个正整数T,表示数据组数(每组数据描述一个需要判定的图)。接下来从输入文件第二行开始有T组数据,每组数据的第一行是用空格隔开的两个正整数N和M,分别表示对应图的顶点数和边数。紧接着的M行,每行是用空格隔开的两个正整数u和v(1<=u,v<=n),表示对应图的一条边(u,v),输入的数据保证所有边仅出现一次。每组数据的最后一行是用空格隔开的N个正整数,从左到右表示对应图中的一个哈密顿回路:V1,V2,…,VN,即对任意i≠j有Vi≠Vj且对任意1<=i<=n-1有(Vi,Vi-1) ∈E及(V1,Vn) ∈E。输入的数据保证100%的数据满足T<=100,3<=N<=200,M<=10000。

输出格式:

包含T行,若输入文件的第i组数据所对应图是平面图,则在第i行输出YES,否则在第i行输出NO,注意均为大写字母

输入输出样例

输入样例#1: 复制

  1. 2
  2. 6 9
  3. 1 4
  4. 1 5
  5. 1 6
  6. 2 4
  7. 2 5
  8. 2 6
  9. 3 4
  10. 3 5
  11. 3 6
  12. 1 4 2 5 3 6
  13. 5 5
  14. 1 2
  15. 2 3
  16. 3 4
  17. 4 5
  18. 5 1
  19. 1 2 3 4 5
输出样例#1: 复制

  1. NO
  2. YES

说明

感谢@hibiki 对题目进行修正

如果你会做POJ3207的话,那么这道题就是道大水题

不过平面图有一个性质

边数$<=$点数$*3-6$

因此可以通过这个性质把数据规模降至$O(n)$

设$i$表示边$i$在圆内,$i'$表示$i$在圆外

若$(i,j)$在圆内相交,那么它们在圆外也一定相交

如果边$i,j$在圆内相交

那么就从$i$连向$j'$(i内j外),从$j'$连向$i$(i内j外),从$j$连向$i'$(j内i外),从$i'$连向$j$(j内i外)

写错了一个字母调了半个小时

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<stack>
  5. #include<vector>
  6. #include<queue>
  7. #include<iostream>
  8. #define Pair pair<int,int>
  9. #define F first
  10. #define S second
  11. using namespace std;
  12. const int MAXN=1e6+;
  13. //#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
  14. char buf[<<],*p1=buf,*p2=buf;
  15. inline int read()
  16. { char c=getchar();int x=,f=;
  17. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  18. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  19. return x*f;
  20. }
  21. struct node
  22. {
  23. int u,v,nxt;
  24. }edge[MAXN];
  25. int head[MAXN],num=;
  26. inline void AddEdge(int x,int y)
  27. {
  28. edge[num].u=x;
  29. edge[num].v=y;
  30. edge[num].nxt=head[x];
  31. head[x]=num++;
  32. }
  33. int happen[MAXN];
  34. int dfn[MAXN],low[MAXN],tot,color[MAXN],colornum=,vis[MAXN];
  35. stack<int>s;
  36. int N,M;
  37. Pair P[MAXN];
  38. void tarjan(int now)
  39. {
  40. dfn[now]=low[now]=++tot;
  41. s.push(now);
  42. vis[now]=;
  43. for(int i=head[now];i!=-;i=edge[i].nxt)
  44. {
  45. if(!dfn[edge[i].v])
  46. tarjan(edge[i].v),low[now]=min(low[now],low[edge[i].v]);
  47. else if(vis[edge[i].v]) low[now]=min(low[now],dfn[edge[i].v]);
  48. }
  49. if(dfn[now]==low[now])
  50. {
  51. int h;colornum++;
  52. do
  53. {
  54. h=s.top();s.pop();
  55. vis[h]=;
  56. color[h]=colornum;
  57. }while(h!=now);
  58. }
  59. }
  60. void pre()
  61. {
  62. memset(dfn,,sizeof(dfn));
  63. memset(low,,sizeof(low));
  64. memset(head,-,sizeof(head));
  65. memset(color,,sizeof(color));
  66. memset(happen,,sizeof(happen));
  67. memset(vis,,sizeof(vis));
  68. num=;
  69. }
  70. int main()
  71. {
  72. #ifdef WIN32
  73. freopen("a.in","r",stdin);
  74. freopen("a.out","w",stdout);
  75. #else
  76. #endif
  77. int QWQ=read();
  78. while(QWQ--)
  79. {
  80. pre();
  81. N=read();M=read();
  82. for(int i=;i<=M;i++)
  83. P[i].F=read(),P[i].S=read();
  84. for(int i=;i<=N;i++)
  85. {
  86. int p=read();
  87. happen[p]=i;
  88. }
  89. if(M>*N-){printf("NO\n"); continue;}
  90. for(int i=;i<=M;i++)
  91. {
  92. P[i].F=happen[P[i].F];
  93. P[i].S=happen[P[i].S];
  94. if(P[i].F>P[i].S) swap(P[i].F,P[i].S);
  95. }
  96. for(int i=;i<=M;i++)
  97. for(int j=i+;j<=M;j++)
  98. if((P[i].S>P[j].F&&P[i].F<P[j].F&&P[i].S<P[j].S)
  99. ||(P[i].F>P[j].F&&P[i].S>P[j].S&&P[i].F<P[j].S))
  100. AddEdge(i,j+M),
  101. AddEdge(j+M,i),
  102. AddEdge(j,i+M),
  103. AddEdge(i+M,j);
  104. for(int i=;i<=*M;i++)
  105. if(!dfn[i])
  106. tarjan(i);
  107. int flag=;
  108. for(int i=;i<=*M;i++)
  109. if(color[i]==color[i+M])
  110. {printf("NO\n");flag=;break;}
  111. if(flag==) printf("YES\n");
  112. }
  113. return ;
  114. }

洛谷P3209 [HNOI2010]PLANAR(2-SAT)的更多相关文章

  1. 洛谷P3209 [HNOI2010]PLANAR

    首先用一波神奇的操作,平面图边数m<=3*n-6,直接把m降到n, 然后对于冲突的边一条环内,一条环外,可以用并查集或者2Sat做, 当然并查集是无向的,2Sat是有向的,显然用并查集比较好 复 ...

  2. 洛谷 P3209 [HNOI2010] 平面图判定

    链接: P3209 题意: 给出 \(T\) 张无向图 \((T\leq100)\),并给出它对应的哈密顿回路,判断每张图是否是平面图. 分析: 平面图判定问题貌似是有线性做法的,这里给出链接,不是本 ...

  3. 洛谷P3209 [HNOI2010]平面图判定(2-SAT)

    传送门 看到哈密顿回路就被吓傻了……结果没有好好考虑性质…… 首先,平面图有个性质:边数小于等于$3n-6$(我也不知道为啥),边数大于这个的直接pass 然后考虑原图,先把哈密顿回路单独摘出来,就是 ...

  4. 洛谷P3203 [HNOI2010]弹飞绵羊(LCT,Splay)

    洛谷题目传送门 关于LCT的问题详见我的LCT总结 思路分析 首先分析一下题意.对于每个弹力装置,有且仅有一个位置可以弹到.把这样的一种关系可以视作边. 然后,每个装置一定会往后弹,这不就代表不存在环 ...

  5. Bzoj2002/洛谷P3203 [HNOI2010]弹飞绵羊(分块)

    题面 Bzoj 洛谷 题解 大力分块,分块大小\(\sqrt n\),对于每一个元素记一下跳多少次能跳到下一个块,以及跳到下一个块的哪个位置,修改的时候时候只需要更新元素所在的那一块即可,然后询问也是 ...

  6. 洛谷P3209平面图判定 [HNOI2010] 2-sat

    正解:2-sat(并茶几/强连通分量 解题报告: 传送门w 难受死了,连WA5次,正确率又-=INF了QAQ 然后先说下这题怎么做再来吐槽自己QAQ 首先这题其实和NOIp2010的关押罪犯挺像的,然 ...

  7. 洛谷 P3205 [HNOI2010]合唱队 解题报告

    P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...

  8. 洛谷 P3203 [HNOI2010]弹飞绵羊 解题报告

    P3203 [HNOI2010]弹飞绵羊 题目描述 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一 ...

  9. 洛谷——P3205 [HNOI2010]合唱队

    P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...

随机推荐

  1. 第39节:Java当中的IO

    Java当中的IO IO的分类 第一种分:输入流和输出流 第二种分:字节流和字符流 第三种分:节点流和处理流 节点流处理数据,处理流是节点流基础上加工的. IO中的重点: InputStream Ou ...

  2. Linux的 Shell 理解和使用

    Shell为命令解释器,把用户命令解释为内核可识别的机器语言,然后翻译命令结果给用户,其也是一个强大的编程语言,是解释执行的脚本语言,无编译,与python机制基本相同. Shell内部可以直接调用L ...

  3. Nginx是什么?Nginx介绍及Nginx的优点

    Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为"engine X", 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP ...

  4. yum install --downloadonly 下载依赖包研究

    在CentOS中可以使用yum自动安装软件,在离线环境中却行不通. Linux localhost 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 U ...

  5. C# 多线程锁之ReaderWriterLockSlim

    1.简介 .NET 3.5 开始 ReaderWriterLockSlim登上舞台,ReaderWriterLockSlim 可以看做是 ReaderWriterLock 的升级版. 由于 Reade ...

  6. nginx 系列 1 linux下安装以及配置IIS分发

    一. 安装 操作系统:centos 7 ,nginx版本1.12.2,windows server 2008 iis 1.1 确认nginx所依赖的工具 Zlib:  nginx提供gzip模块,需要 ...

  7. RocketMQ入门案例

    学习RocketMQ,先写一个Demo演示一下看看效果. 一.服务端部署 因为只是简单的为了演示效果,服务端仅部署单Master模式 —— 一个Name Server节点,一个Broker节点.主要有 ...

  8. MySQL 锁信息和事务

    1 锁概念 1.1 什么是锁 锁是数据库系统区别于文件系统的一个关键特性.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性.例如:操作缓冲池中的LRU列表,删除.添加.移动L ...

  9. Jenkins构建部署Maven项目

    1 创建新项目 2 构建maven项目 3 配置 3.1  源代码管理 svn 用户名,密码 4 配置maven打包 配置SSH 保存之后 立即构建 执行成功

  10. RabbitMQ系列(四)RabbitMQ事务和Confirm发送方消息确认——深入解读

    RabbitMQ事务和Confirm发送方消息确认--深入解读 RabbitMQ系列文章 RabbitMQ在Ubuntu上的环境搭建 深入了解RabbitMQ工作原理及简单使用 RabbitMQ交换器 ...