题目链接

思路

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

如图:

\((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. LeetCode_406. Queue Reconstruction by Height解题思路

    题目如下: Suppose you have a random list of people standing in a queue. Each person is described by a pa ...

  2. 【设计模式】适配器模式 Adapter Pattern

    适配器模式在软件开发界使用及其广泛,在工业界,现实中也是屡见不鲜.比如手机充电器,笔记本充电器,广播接收器,电视接收器等等.都是适配器. 适配器主要作用是让本来不兼容的两个事物兼容和谐的一起工作.比如 ...

  3. 关于boostrap的modal隐藏问题(前端框架)

    Modal(模态框) 首先,外引boostrap和Jquery的文件环境: <link rel="stylesheet" href="https://cdn.sta ...

  4. python字典结构化数据

    https://www.cnblogs.com/evablogs/p/6692947.html dict: 键-值(key-value)对集合{key:value},查找速度极快,但浪费内存. 1 2 ...

  5. iOS 多线程 NSOperation、NSOperationQueue

    1. NSOperation.NSOperationQueue 简介 NSOperation.NSOperationQueue 是苹果提供给我们的一套多线程解决方案.实际上 NSOperation.N ...

  6. Windows 10 远程连接出现函数错误 【这可能由于CredSSP加密Oracle修正】

    win+R 弹出窗口输入gpedit.msc 计算机配置=>管理模板=>系统=>凭据分配=>加密Oracle修正 编辑策略设置=>已启用=>保护级别=>易受攻 ...

  7. HTML基础-------HTML标签(1)

    HTML标签(1) h系列(容器级双标签) h系列标签分为六个等级(h1,h2,h3,h4,h5,h6) 语义:给文本添加一个标题 标题重要程度逐级递减,一个页面只能有一个h1级的标签,并且大多数时候 ...

  8. 浅析CompareAndSet(CAS)

    最近无意接触了AtomicInteger类compareAndSet(从JDK5开始),搜了搜相关资料,整理了一下 首先要说一下,AtomicInteger类compareAndSet通过原子操作实现 ...

  9. ESP8266最小系统

    http://www.dnsj88.com/Products/esp12f.html https://gitai.me/2017/04/Re-Zero-Starting-in-IoT/

  10. Fuck me

    know how to deal with \(\sum_i\binom{n}{i}a^i\)??