2-SAT。

首先有平面图定理 m<=3*n-6,如果不满足这条件肯定不是平面图,直接退出。

然后构成哈密顿回路的边直接忽略。

把哈密顿回路当成一个圆,

如果俩条边交叉(用心去感受),只能一条边在圆内,另一条在圆外。

这个是2-sat的A,B要不同时取,要不同时不取模型。

如果俩个交叉,只能一个在内,一个在外。

和A,B俩者不能同时取有区别,需要注意。

可能存在3个方案(A,B’),(B,A’),(A’,B’)。

连方案都不要,直接tarjan完就过了。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. const int maxn = 10000 + 10;
  6. const int maxm = 3000000 + 10;
  7.  
  8. int g[maxn],v[maxm],next[maxm],eid;
  9. int a[maxn],b[maxn],c[maxn],pos[maxn];
  10. bool t[maxn];
  11. int vis[maxn];
  12. int s[maxn],sp;
  13. int dfn[maxn],low[maxn],vid;
  14. int color[maxn],cid;
  15. int T,n,m;
  16.  
  17. void addedge(int a,int b) {
  18. v[eid]=b; next[eid]=g[a]; g[a]=eid++;
  19. v[eid]=a; next[eid]=g[b]; g[b]=eid++;
  20. }
  21.  
  22. bool build() {
  23. scanf("%d%d",&n,&m);
  24. for(int i=1;i<=m;i++) scanf("%d%d",&a[i],&b[i]);
  25. for(int i=1;i<=n;i++) {
  26. scanf("%d",&c[i]);
  27. pos[c[i]]=i;
  28. }
  29. if(m>3*n-6) {
  30. printf("NO\n");
  31. return false;
  32. }
  33. memset(g,-1,sizeof(g)); eid=0;
  34. memset(t,0,sizeof(t));
  35. for(int i=1;i<=m;i++) {
  36. a[i]=pos[a[i]];
  37. b[i]=pos[b[i]];
  38. if(a[i]>b[i]) swap(a[i],b[i]);
  39. }
  40. for(int i=1;i<=m;i++)
  41. if(a[i]+1==b[i] || (a[i]==1&&b[i]==n)) t[i]=true;
  42. for(int i=1;i<=m;i++) if(!t[i]) {
  43. for(int j=1;j<=m;j++) if(i!=j && !t[j])
  44. if(a[i]<a[j] && a[j]<b[i] && b[i]<b[j]) {
  45. addedge((i<<1),(j<<1)|1);
  46. addedge((i<<1)|1,(j<<1));
  47. }
  48. }
  49. return true;
  50. }
  51.  
  52. void tarjan(int u) {
  53. dfn[u]=low[u]=++vid;
  54. vis[u]=1; s[++sp]=u;
  55.  
  56. for(int i=g[u];~i;i=next[i]) {
  57. if(!vis[v[i]]) {
  58. tarjan(v[i]);
  59. low[u]=min(low[u],low[v[i]]);
  60. }
  61. else if(vis[v[i]]==1)
  62. low[u]=min(low[u],dfn[v[i]]);
  63. }
  64.  
  65. if(dfn[u]==low[u]) {
  66. ++cid;
  67. do {
  68. color[s[sp]]=cid;
  69. vis[s[sp]]=2;
  70. }while(s[sp--]!=u);
  71. }
  72. }
  73.  
  74. void solve() {
  75. memset(vis,0,sizeof(vis));
  76. vid=cid=sp=0;
  77. for(int i=1;i<=m;i++) if(!t[i]) {
  78. if(!vis[i<<1]) tarjan(i<<1);
  79. if(!vis[i<<1|1]) tarjan((i<<1|1));
  80. }
  81. for(int i=1;i<=m;i++) if(!t[i]&&color[i<<1]==color[i<<1|1]) {
  82. printf("NO\n");
  83. return;
  84. }
  85. printf("YES\n");
  86. }
  87.  
  88. int main() {
  89. scanf("%d",&T);
  90. while(T--) if(build()) solve();
  91. return 0;
  92. }

bzoj1997: [Hnoi2010]Planar的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. bzoj1997 [Hnoi2010]Planar——2-SAT

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997 神奇的经典2-SAT问题! 对于两个相交的区间,只能一里一外连边,所以可以进行2-SA ...

  7. 【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 ...

  8. bzoj1997 [HNOI2010]平面图判定Plana

    bzoj1997 [HNOI2010]平面图判定Planar 链接 bzoj luogu 思路 好像有很多种方法过去.我只说2-sat 环上的边,要不在里面,要不在外边. 有的边是不能同时在里面的,可 ...

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

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

随机推荐

  1. 交互式shell和非交互式shell、登录shell和非登录shell的区别

    交互式shell和非交互式shell.登录shell和非登录shell的区别.首先,这是两个不同的维度来划分的,一个是是否交互式,另一个是是否登录. 交互式shell和非交互式shell(intera ...

  2. android 解决启动页面加载图片空白以及去掉标题栏

    有时候启动页面根据白天晚上来启动时实现加载不同的图片效果,但是加载时会出现短暂的空白,解决方法如下: android:theme="@android:style/Theme.Transluc ...

  3. IR的评价指标—MAP,NDCG,MRR

    http://www.cnblogs.com/eyeszjwang/articles/2368087.html MAP(Mean Average Precision):单个主题的平均准确率是每篇相关文 ...

  4. 【SharePoint 文档管理解决方案设计系列一】文档使用分析

    在我们在 SharePoint 端设计文档管理解决方案之前我们要了解目前客户在他们已有的系统里是怎么对文档进行使用和管理的.只有了解了当前的使用情况才能根据客户的需求量身定做一套适合他们的有效的解决方 ...

  5. 修改tomcat 启动45秒

    当我们需要增加Tomcat的启动时间,修改方法如下:

  6. java ZIP压缩文件

    问题描述:     使用java ZIP压缩文件和目录 问题解决:     (1)单个文件压缩 注:     以上是实现单个文件写入压缩包的代码,注意其中主要是在ZipOutStream流对象中创建Z ...

  7. PE文件结构详解(三)PE导出表

    上篇文章 PE文件结构详解(二)可执行文件头 的结尾出现了一个大数组,这个数组中的每一项都是一个特定的结构,通过函数获取数组中的项可以用RtlImageDirectoryEntryToData函数,D ...

  8. ECMALL目录结构设置与数据库表

    [Ecmall]ECMALL目录结构设置与数据库表   最近在做ecmall的开发,ecmall在开源方面还有待进步啊,官方没有提供开发文档,也没有关于系统架构组织的贡献,使用者都要自己从0开始,官方 ...

  9. mysql 误删除ibdata1之后如何恢复

    mysql 误删除ibdata1之后如何恢复 如果误删除了在线服务器中mysql innodb相关的数据文件ibdata1以及日志文件 ib_logfile*,应该怎样恢复呢? 这时候应该一身冷汗了吧 ...

  10. UVA 10523 Very Easy!!!(大数据加法、乘法)

    题意:给出N,A,计算i*A^i(i=1~N)的和.1<=N<=30,0<=A<=15. 就是大数据运算,别的没什么,注意细节之处即可. 这题还要注意两个地方: 1.考虑A=0 ...