1997: [Hnoi2010]Planar

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 2317  Solved: 850
[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

Day1

太强辣。

平面图的边数不大于3*n-6剪枝。

先将环提出来,对于剩下的边,我们可以选择在环外连还是在环内连。

对于不相交的边,显然在环外连和在环内连都不会相交。

对于相交的边,显然不能同时在环外连或在环内连。只能一个在环外一个在环内。

将一条边拆为环外、环内两条边,构造2-sat。

判断2*i和2*i-1是否在同一个联通分量里。

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#define LL long long
#define mod 19650827
using namespace std;
int read() {
char ch=getchar();int x=,f=;
while(!isdigit(ch)){ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x;
}
int T;
int n,m;
struct data {
int u,v;
}a[];
int pos[];
int cnt=;
int head[],cntt;
struct edge {
int to,next;
}e[];
void add(int u,int v) {e[cntt].to=v;e[cntt].next=head[u];head[u]=cntt++;}
int dfn[],low[],inq[],sz;
int sta[],top,bl[],scc;
void tarjan(int now) {
dfn[now]=low[now]=++sz;
sta[++top]=now;inq[now]=;
for(int i=head[now];i>=;i=e[i].next) {
int to=e[i].to;
if(!dfn[to]) {tarjan(to);low[now]=min(low[now],low[to]);}
else if(inq[to]) {low[now]=min(low[now],dfn[to]);}
}
if(low[now]==dfn[now]) {
int x=-;
scc++;
while(x!=now) {
x=sta[top--];inq[x]=;
bl[x]=scc;
}
}
}
int main() {
T=read();
while(T--) {
cnt=;cntt=;top=;scc=;sz=;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));memset(low,,sizeof(low));
memset(inq,,sizeof(inq));
n=read(),m=read();
for(int i=;i<=m;i++) a[i].u=read(),a[i].v=read();
for(int i=;i<=n;i++) pos[read()]=i;
if(m>*n-){printf("NO\n");continue;}
for(int i=;i<=m;i++) {
int c=abs(pos[a[i].u]-pos[a[i].v]);
if(c==||(max(pos[a[i].u],pos[a[i].v])==n&&min(pos[a[i].u],pos[a[i].v])==)) continue;
a[++cnt]=a[i];
}
for(int i=;i<=cnt;i++) {
for(int j=i+;j<=cnt;j++) {
int t1=pos[a[i].u],t2=pos[a[i].v];
if(t1>t2) swap(t1,t2);
int t3=pos[a[j].u],t4=pos[a[j].v];
if(t3>t4) swap(t3,t4);
if((t1<t3&&t2<t4&&t2>t3)||(t1>t3&&t2>t4&&t1<t4)) {
add(*i-,*j);add(*j,*i-);
add(*i,*j-);add(*j-,*i);
}
}
}
for(int i=;i<=*cnt;i++) if(!dfn[i]) tarjan(i);
bool flag=;
for(int i=;i<=cnt;i++) if(bl[*i]==bl[*i-]){printf("NO\n");flag=;break;}
if(flag)printf("YES\n");
}
}

[BZOJ1997][Hnoi2010]Planar 2-sat (联通分量) 平面图的更多相关文章

  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)

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

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

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

  5. bzoj1997: [Hnoi2010]Planar

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

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

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

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

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

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

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

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

随机推荐

  1. PowerCmd

    今天在手机上看慕课网,看到一个好玩的东西.Powercmd. 一开始的感觉是,妈的,我会cmd命令,为什么要用你的cmd? 后来,用了之后,感觉,嗯,还是Powercmd好用.功能强大. 我们来看看它 ...

  2. erlang节点互通查看

    在局域网内部,一般用短节点名来完成短节点的全联通.     全联通的前提之一是cookie要相同,cookie记录在一个文件中.     对于同一个物理机上的两个erlang节点,不用其他配置就可以全 ...

  3. 就算WORD高手也无法解释的Word的一些疑惑.,一些已经解决,一些没有解决

    如下功能如何用? 1.选项->保存->显示其他保存位置(即使可能需要登录)? 解答:您能告诉我吗? 2.字体->为字体调整字间距? 解答:自动调整某些字符之前的距离,使得更加美观.例 ...

  4. Javascript在浏览器中的加载顺序详解!

    现在前端用javascript用的比较多,当然真心的说这个语言是一个非常业余的语言,但是用的人很多,所以也比较火.今天想完成一个javascript外部文件自动加载的设计(类似于java或者php的i ...

  5. 孤荷凌寒自学python第七天 列表的复制与序列的基本运算

    孤荷凌寒自学python第七天 列表的复制与序列的基本运算 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) (同步语音:https://www.ximalaya.com/keji/191030 ...

  6. (原) Unreal创建自定义MeshCompoent

    @author:白袍小道 随缘查看 前言: 绘制相关类 MeshCompoent 模型组件 FVertexBuffer 顶点缓冲区封装 FIndexBuffer 顶点索引缓冲区封装 FRHIResou ...

  7. vue实现数据的增删改查

    在管理员的一些后台页面里,个人中心里的数据列表里,都会有对这些数据进行增删改查的操作.比如在管理员后台的用户列表里,我们可以录入新用户的信息,也可以对既有的用户信息进行修改.在vue中,我们更应该专注 ...

  8. HDU 4665 Unshuffle DFS找一个可行解

    每层找一对相等的整数,分别放在两个不同的串中. 参考了学弟的解法,果断觉得自己老了…… #include <cstdio> #include <cstring> #includ ...

  9. 手机App测试如何获取包名的入口【两种方式】

    在进行手机APP测试的时候经常要获取包名.那么何为包名呢?简单来说其实就是手机APP的安装apk文件的名称,每个手机APP(软件)的包名都是唯一的. 那么我们怎样来获取包名以及包名的入口呢? 方法一: ...

  10. ASP.NET——实现两个下拉框动态联动

    引入: 在网页中,我们经常会遇到下图中的情况.首先在下拉框中选择所在的省,选择之后,第二个下拉框会自动加载出该省中的市.这样设计极大的方便了用户的查找.那这是如何实现的呢? 1.建立数据库 " ...