1997: [Hnoi2010]Planar

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 2224  Solved: 824
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

2
6 9
1 4
1 5
1 6
2 4
2 5
2 6
3 4
3 5
3 6
1 4 2 5 3 6
5 5
1 2
2 3
3 4
4 5
5 1
1 2 3 4 5

Sample Output

NO
YES

HINT

 

Source

  为了做这道题我生生看了大半个小时的各种不靠谱的平面图课件,然后题解告诉我平面图的性质就用到了m>n*3-6不是平面图而且他只是用来剪枝的?Exucse me?
  然后又发现这道题是2-SAT,一个坑了几乎所有NOI2017选手的知识点,然后又斯巴达了一个多小时的2-SAT,回过头来却发现我连如何判断两条边是否会相交都不懂。QAQ……
  然后赶紧向大佬求助,既然这道题把环都给我们了,那么只要两个线段的四个端点是交错排列的那么他们如果把它们同时放在圆内或圆外他们就会相交。这也就是为什么要用2-SAT了。我们可以把它看作2-SAT的一个经典问题:n各组,每组两个人,其中有些人和别的组里的人不能一起选,每个组里必须选一个人,问能否找到合法方案。在这道题里,每一个不在圆上的线段就是我们的组,两个人就是在圆内还是圆外,跑一遍2-SAT即可。
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<algorithm>
  6. #include<cmath>
  7. #include<string>
  8. #include<queue>
  9. #define N 300
  10. using namespace std;
  11. struct ro{
  12. int to;
  13. int next;
  14. }road[**];
  15. int t,n,m,zz,a[],f[][],pos[N],zz1;
  16. void build(int x,int y)
  17. {
  18. zz++;
  19. road[zz].to=y;
  20. road[zz].next=a[x];
  21. a[x]=zz;
  22. }
  23. int dfn[],low[],zz2,top,st[],bel[],zz3;
  24. bool rd[],rd2[];
  25. void tar(int x)
  26. {
  27. zz2++;
  28. dfn[x]=low[x]=zz2;
  29. top++;
  30. st[top]=x;
  31. rd[x]=rd2[x]=;
  32. for(int i=a[x];i>;i=road[i].next)
  33. {
  34. int y=road[i].to;
  35. if(!rd2[y])
  36. {
  37. tar(y);
  38. low[x]=min(low[x],low[y]);
  39. }
  40. else if(rd[y])
  41. {
  42. low[x]=min(dfn[y],low[x]);
  43. }
  44. }
  45. if(dfn[x]==low[x])
  46. {
  47. zz3++;
  48. int v;
  49. do{
  50. v=st[top];
  51. top--;
  52. rd[v]=;
  53. bel[v]=zz3;
  54. }while(dfn[v]!=low[v]);
  55. }
  56. }
  57. int main(){
  58. scanf("%d",&t);
  59. while(t--)
  60. {
  61. memset(a,,sizeof(a));
  62. top=;
  63. memset(rd2,,sizeof(rd2));
  64. zz3=zz2=;
  65. memset(low,,sizeof(low));
  66. memset(dfn,,sizeof(dfn));
  67. zz=zz1=;
  68. memset(bel,,sizeof(bel));
  69. scanf("%d%d",&n,&m);
  70. for(int i=;i<=m;i++)
  71. {
  72. scanf("%d%d",&f[i][],&f[i][]);
  73. }
  74. for(int i=;i<=n;i++)
  75. {
  76. int x;
  77. scanf("%d",&x);
  78. pos[x]=i;
  79. }
  80. if(n*-<m)
  81. {
  82. printf("NO\n");
  83. continue;
  84. }
  85. for(int i=;i<=m;i++)
  86. {
  87. int fr=f[i][],to=f[i][];
  88. fr=pos[fr],to=pos[to];
  89. if(fr>to)swap(fr,to);
  90. if(to-fr==||(to==n&&fr==))continue;
  91. zz1++;
  92. f[zz1][]=fr,f[zz1][]=to;
  93. }
  94. m=zz1;
  95. for(int i=;i<=m;i++)
  96. {
  97. for(int j=i+;j<=m;j++)
  98. {
  99. if(f[i][]<f[j][]&&f[i][]<f[j][]&&f[i][]>f[j][])
  100. {
  101. build(i*,j*-);
  102. build(j*-,i*);
  103. build(j*,i*-);
  104. build(i*-,j*);
  105. }
  106. else if(f[j][]<f[i][]&&f[j][]<f[i][]&&f[i][]<f[j][])
  107. {
  108. build(i*,j*-);
  109. build(j*-,i*);
  110. build(j*,i*-);
  111. build(i*-,j*);
  112. }
  113. }
  114. }
  115. for(int i=;i<=*m;i++)
  116. {
  117. if(!rd2[i])
  118. {
  119. tar(i);
  120. }
  121. }
  122. bool yx=;
  123. for(int i=;i<=m;i++)
  124. {
  125. if(bel[i*]==bel[i*-])
  126. {
  127. yx=;
  128. break;
  129. }
  130. }
  131. if(yx)
  132. {
  133. printf("YES\n");
  134. }
  135. else
  136. {
  137. printf("NO\n");
  138. }
  139. }
  140. return ;
  141. }

Bzoj 1997 [Hnoi2010]Planar题解的更多相关文章

  1. BZOJ 1997: [Hnoi2010]Planar( 2sat )

    平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...

  2. [BZOJ 1997][HNOI2010]Planar(2-SAT)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1997 分析: 考虑每条边是在圈子里面还是圈子外面 所以就变成了2-SAT判定问题了= ...

  3. bzoj 1997 [Hnoi2010]Planar——2-SAT+平面图的一个定理

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997 平面图的一个定理:若边数大于(3*点数-6),则该图不是平面图. 然后就可以2-SAT ...

  4. bzoj 1997: [Hnoi2010]Planar

    #include<cstdio> #include<cstring> #include<iostream> #define M 20005 #define N 20 ...

  5. bzoj 1997: [Hnoi2010]Planar【瞎搞+黑白染色】

    脑补一下给出的图:一个环,然后有若干连接环点的边,我们就是要求这些边不重叠 考虑一下不重叠的情况,两个有交边一定要一个在环内一个在环外,所以把相交的边连边,然后跑黑白染色看是否能不矛盾即可(可能算个2 ...

  6. 1997: [Hnoi2010]Planar

    1997: [Hnoi2010]Planar 链接 分析: 首先在给定的那个环上考虑进行操作,如果环内有有两条边相交,那么可以把其中的一条放到环的外面去.所以转换为2-sat问题. 像这样,由于1-4 ...

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

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

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

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

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

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

随机推荐

  1. Xdite:永葆热情的上瘾式学习法(套路王:每天总结自己,反省自己的作息规律,找到自己的幸运时间、幸运方法,倒霉时间、倒霉方法。幸运是与注意力挂钩的。重复才能让自己登峰造极,主动去掉运气部分来训练自己。游戏吸引自己的几个原因非常适合训练自己)good

    版权声明 本文首发自微信公共帐号: 学习学习再学习(xiaolai-xuexi) 无需授权即可转载, 甚至无需保留以上版权声明: 转载时请务必注明作者. 以下是<共同成长社区>第 58 次 ...

  2. SignalR的简单使用(二)

    原文:SignalR的简单使用(二) 之前提到SignalR代理在网页,通过生成的Js来完成相关的功能.但我不禁想一个问题, 难到SignalR的服务端就能寄存在web端吗,通过访问网页能方式才能启动 ...

  3. C++ 标准库概览(一分钟就看完了)

    C++ 标准库以若干头文件的方式提供. 下面简单介绍一个各头文件的内容. 第一部分 容器 Containers <array> C++11 新增.提供了容器类模板 std::array,固 ...

  4. delphi资源文件制作及使用详解

    一.引子:现在的Windows应用程序几乎都使用图标.图片.光标.声音等,我们称它们为资源(Resource).最简单的使用资源的办法是把这些资源的源文件打入软件包,以方便程序需要的时候调用.资源是程 ...

  5. AngularJS 1.4对动画系统进行了彻底的重构

    分享 <关于我> 分享  [中文纪录片]互联网时代                 http://pan.baidu.com/s/1qWkJfcS 分享 <HTML开发MacOSAp ...

  6. 设置qt插件路径

    1.在Qt中使用 WebKit 浏览器核心 使用 QtWebKit 需要在工程文件(*.pro)中加入: QT +=webkitQT += network 2.QtWebKit的flash支持 QtW ...

  7. iis mime 类型

    application/sqlite3 .db application/octet-stream .MP4 application/vnd.android.package-archive .apk

  8. PHP实现图片(文件)上传

    这几天整理做过的php项目,感觉这个经常会用到,传上来共享一下咯 首先,前端界面 1.表单的首行需要加上enctype="multipart/form-data",需要上传的图片必 ...

  9. Spring cloud stream【消息分区】

      在上篇文章中我们给大家介绍了Stream的消息分组,可以实现消息的重复消费的问题,但在某些场景下分组还不能满足我们的需求,比如,同时有多条同一个用户的数据,发送过来,我们需要根据用户统计,但是消息 ...

  10. Tido c++线段树知识讲解(转载)

    线段树知识讲解 定义.建树.单点修改.区间查询         特别声明:如上的讲解说的是区间最大值 如果想要查询区间和 只需要改变一下建树和查询的代码就行了,如下 其他根据自己的需要进行修改即可