题目链接

思路

首先以那个环为框架,把所有的边连出来。如果有两条边相交,那么就把其中一条放到环外面去。

如图:

\((1,3)\)与\((2,5)相交,\)(1,4)\(与\)(2,5)相交。所以我们把\((2,5)\)这条边放到外面去。

就成了这样

就不会有边相交了。

显然如果两条边在环内相交,那么全部挪到环外也会相交。所以只要是相交的两条边必定是一个在环内,一个在环外。

然后就是2-sat模型了。

坑点。。。

犯了一些很zz的错误。

1.如果边的数量>点的数量乘3-6,即\((m > n \times 3 - 6)\),可以证明必定无解。这个需要判断掉。

2.没错,这个bug我调了很久233。。。

4.特判的地方要放到全部数据读入之后。。。也调了很久(好zz啊啊啊)

代码

  1. /*
  2. * @Author: wxyww
  3. * @Date: 2019-04-27 19:06:04
  4. * @Last Modified time: 2019-04-27 21:28:17
  5. */
  6. #include<cstdio>
  7. #include<iostream>
  8. #include<cstdlib>
  9. #include<cstring>
  10. #include<algorithm>
  11. #include<queue>
  12. #include<vector>
  13. #include<ctime>
  14. using namespace std;
  15. typedef long long ll;
  16. const int M = 300010;
  17. #define pi pair<int,int>
  18. ll read() {
  19. ll x=0,f=1;char c=getchar();
  20. while(c<'0'||c>'9') {
  21. if(c=='-') f=-1;
  22. c=getchar();
  23. }
  24. while(c>='0'&&c<='9') {
  25. x=x*10+c-'0';
  26. c=getchar();
  27. }
  28. return x*f;
  29. }
  30. struct node {
  31. int v,nxt;
  32. }e[M];
  33. int head[M],ejs;
  34. void add(int u,int v) {
  35. e[++ejs].v = v;e[ejs].nxt = head[u];head[u] = ejs;
  36. }
  37. int n,m,pos[M];
  38. pi tmp[M];
  39. bool pd(int l,int r,int L,int R) {
  40. if(l > r) swap(l,r);if(L > R) swap(L,R);
  41. if((l <= L && r >= R) || (L <= l && R >= r)) return 0;
  42. if(l >= R || L >= r) return 0;
  43. return 1;
  44. }
  45. int tot,vis[M],coljs,sta[M],col[M],top,dfn[M],low[M];
  46. void tarjan(int u) {
  47. dfn[u] = low[u] = ++tot;
  48. sta[++top] = u;vis[u] = 1;
  49. for(int i = head[u];i;i = e[i].nxt) {
  50. int v = e[i].v;
  51. if(!dfn[v]) {
  52. tarjan(v);
  53. low[u] = min(low[u],low[v]);
  54. }
  55. else if(vis[v]) low[u] = min(low[u],low[v]);
  56. }
  57. if(low[u] == dfn[u]) {
  58. ++coljs;
  59. do {
  60. int x = sta[top--];
  61. col[x] = coljs;
  62. vis[x] = 0;
  63. }while(sta[top + 1] != u);
  64. }
  65. }
  66. int main() {
  67. int T = read();
  68. while(T--) {
  69. memset(head,0,sizeof(head));
  70. ejs = 0;
  71. memset(pos,0,sizeof(pos));
  72. coljs = 0;memset(col,0,sizeof(col));
  73. memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));
  74. tot = 0;top = 0;
  75. n = read(),m = read();
  76. for(int i = 1;i <= m;++i) tmp[i].first = read(),tmp[i].second = read();
  77. for(int i = 1;i <= n;++i) pos[read()] = i;
  78. if(m > 3 * n - 6) {
  79. puts("NO");continue;
  80. }
  81. for(int i = 1;i <= m;++i)
  82. for(int j = i + 1;j <= m;++j)
  83. if(pd(pos[tmp[i].first],pos[tmp[i].second],pos[tmp[j].first],pos[tmp[j].second]))
  84. add(i,j + m),add(i + m,j),add(j,i + m),add(j + m,i);
  85. for(int i = 1;i <= m + m;++i) if(!dfn[i]) tarjan(i);
  86. int bz = 0;
  87. for(int i = 1;i <= m;++i) if(col[i] == col[i + m]) bz = 1;
  88. if(bz) puts("NO");else puts("YES");
  89. }
  90. return 0;
  91. }

bzoj1997 Planar的更多相关文章

  1. 【BZOJ1997】Planar(2-sat)

    [BZOJ1997]Planar(2-sat) 题面 BZOJ 题解 很久没做过\(2-sat\)了 今天一见,很果断的就来切 这题不难呀 但是有个玄学问题: 平面图的性质:边数\(m\)的最大值为\ ...

  2. 【BZOJ1997】[Hnoi2010]Planar 2-SAT

    [BZOJ1997][Hnoi2010]Planar Description Input Output Sample Input 2 6 9 1 4 1 5 1 6 2 4 2 5 2 6 3 4 3 ...

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

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

  4. bzoj千题计划231:bzoj1997: [Hnoi2010]Planar

    http://www.lydsy.com/JudgeOnline/problem.php?id=1997 如果两条边在环内相交,那么一定也在环外相交 所以环内相交的两条边,必须一条在环内,一条在环外 ...

  5. BZOJ1997 [Hnoi2010]Planar 【2-sat】

    题目链接 BZOJ1997 题解 显然相交的两条边不能同时在圆的一侧,\(2-sat\)判一下就好了 但这样边数是\(O(m^2)\)的,无法通过此题 但是\(n\)很小,平面图 边数上界为\(3n ...

  6. [BZOJ1997][Hnoi2010]Planar 2-sat (联通分量) 平面图

    1997: [Hnoi2010]Planar Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2317  Solved: 850[Submit][Stat ...

  7. bzoj1997: [Hnoi2010]Planar

    2-SAT. 首先有平面图定理 m<=3*n-6,如果不满足这条件肯定不是平面图,直接退出. 然后构成哈密顿回路的边直接忽略. 把哈密顿回路当成一个圆, 如果俩条边交叉(用心去感受),只能一条边 ...

  8. BZOJ1997 [Hnoi2010]Planar (2-sat)

    题意:给你一个哈密顿图,判断是不是平面图 思路:先找出哈密顿图来.哈密顿回路可以看成一个环,把边集划分成两个集合,一个在环内,一个在外.如果有两条相交边在环内,则一定不是平面图,所以默认两条相交边,转 ...

  9. BZOJ1997:[HNOI2010]PLANAR——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=1997 https://www.luogu.org/problemnew/show/P3209 若能 ...

随机推荐

  1. PHP+nginx 启动后访问超时

    场景 在Windows上, nginx配置并启动后, 访问报504超时 解决 很尴尬, php-cgi没启动 php-cgi -b

  2. 3.SDL落地方案

    01.安全培训 安全意识培训(全员) 邮件安全 钓鱼邮件 邮件伪造 第三方转存 检查发件人 开启二次验证 邮件转发 第三方代收 邮件附件敏感信息加密 病毒防范 什么是木马病毒 我安装哪些杀毒软件? 定 ...

  3. Webpack4教程 - 第三部分,如何使用插件

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者.原文出处:https://wanago.io/2018/07/23/webpack-4-course-part ...

  4. 高通MSM8998 ABL的调试

    高通在MSM8998上引入了UEFI,用来代替LK(Little Kernel).高通UEFI由XBL和ABL两部分组成.XBL负责芯片驱动及充电等核心应用功能.ABL包括芯片无关的应用如fastbo ...

  5. 谈谈git以及如何关联github

    git :一款免费.开源的分布式代码版本管理控制系统 记录当前产品代码的所有版本信息,包括历史修改信息 方便快速回退到某一个具体的版本 方便团队协作开发 可检测代码冲突.合并代码等 1.利用 git ...

  6. sql Server 2008 数据库自动备份维护计划

    数据库中右键-‘管理’-新建维护计划 创建执行计划,设置备份时间 点击保存 完成 执行后报  ‘’错误5:拒绝访问 ’,时需到文件目录‘属性’→‘安全’设置用户的 ‘写入’ 权限

  7. JS中 confirm() 方法

    前言 环境: window 10,google 浏览器 测试代码 <html> <!-- 测试确定框,如果点 "是" ,则返回 true,这样就触发 a 标签的 ...

  8. maven中央仓库、远程仓库地址

    1.http://repo1.maven.org/maven2 (官方,速度一般) 2.http://maven.aliyun.com/nexus/content/repositories/centr ...

  9. C# 中利用 CRC32 值判断文件是否重复

    需要在 NuGet 中引用 Crc32.NET 包 直接贴代码了: using Force.Crc32; using System; using System.Collections.Generic; ...

  10. scala的多种集合的使用(5)之数组Array(ArrayBuffer)的操作

    1.创建和更新数组的不同方式 1)定义一个数组的初始大小和类型,随后填充值. scala> val array = new Array[String](3) array: Array[Strin ...