2-SAT。

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

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

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

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

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

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

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

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

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

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 10000 + 10;
const int maxm = 3000000 + 10; int g[maxn],v[maxm],next[maxm],eid;
int a[maxn],b[maxn],c[maxn],pos[maxn];
bool t[maxn];
int vis[maxn];
int s[maxn],sp;
int dfn[maxn],low[maxn],vid;
int color[maxn],cid;
int T,n,m; void addedge(int a,int b) {
v[eid]=b; next[eid]=g[a]; g[a]=eid++;
v[eid]=a; next[eid]=g[b]; g[b]=eid++;
} bool build() {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d",&a[i],&b[i]);
for(int i=1;i<=n;i++) {
scanf("%d",&c[i]);
pos[c[i]]=i;
}
if(m>3*n-6) {
printf("NO\n");
return false;
}
memset(g,-1,sizeof(g)); eid=0;
memset(t,0,sizeof(t));
for(int i=1;i<=m;i++) {
a[i]=pos[a[i]];
b[i]=pos[b[i]];
if(a[i]>b[i]) swap(a[i],b[i]);
}
for(int i=1;i<=m;i++)
if(a[i]+1==b[i] || (a[i]==1&&b[i]==n)) t[i]=true;
for(int i=1;i<=m;i++) if(!t[i]) {
for(int j=1;j<=m;j++) if(i!=j && !t[j])
if(a[i]<a[j] && a[j]<b[i] && b[i]<b[j]) {
addedge((i<<1),(j<<1)|1);
addedge((i<<1)|1,(j<<1));
}
}
return true;
} void tarjan(int u) {
dfn[u]=low[u]=++vid;
vis[u]=1; s[++sp]=u; for(int i=g[u];~i;i=next[i]) {
if(!vis[v[i]]) {
tarjan(v[i]);
low[u]=min(low[u],low[v[i]]);
}
else if(vis[v[i]]==1)
low[u]=min(low[u],dfn[v[i]]);
} if(dfn[u]==low[u]) {
++cid;
do {
color[s[sp]]=cid;
vis[s[sp]]=2;
}while(s[sp--]!=u);
}
} void solve() {
memset(vis,0,sizeof(vis));
vid=cid=sp=0;
for(int i=1;i<=m;i++) if(!t[i]) {
if(!vis[i<<1]) tarjan(i<<1);
if(!vis[i<<1|1]) tarjan((i<<1|1));
}
for(int i=1;i<=m;i++) if(!t[i]&&color[i<<1]==color[i<<1|1]) {
printf("NO\n");
return;
}
printf("YES\n");
} int main() {
scanf("%d",&T);
while(T--) if(build()) solve();
return 0;
}

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. rJava配置

    1. 下载安装R-3.1.1-win.exe: 2. 在R中安装rJava > install.packages("rJava") 3. 设置环境变量: PATH:D:\So ...

  2. Snapchat

    "Mesaging service Snapchat reportedly turned down a $3 billion offer from Facebook?!" Ever ...

  3. 设置google搜索打开链接时在新标签页显示

    百度的搜索结果,打开链接都会在新的页面打开,但是google却直接在本页面打开,有时候我们打开的不一定是自己想要结果,又习惯性的把当前页面给关掉了......这只是习惯问题,可能国人有这个习惯.怎么设 ...

  4. Jenkins入门-转

    reference : http://www.cnblogs.com/itech/archive/2011/11/23/2260009.html 在网上貌似没有找到Jenkins的中文的太多的文档,有 ...

  5. ios 框架学习笔记

    ios主要的系统层次: 一.Cocoa Touch 层:创建应用程序主要使用的框架. 1.关键技术: AirDrop:实现应用间通信. Text Kit:处理文本和排版. UIKit Dynamics ...

  6. 【HDOJ】【1512】Monkey King

    数据结构/可并堆 啊……换换脑子就看了看数据结构……看了一下左偏树和斜堆,鉴于左偏树不像斜堆可能退化就写了个左偏树. 左偏树介绍:http://www.cnblogs.com/crazyac/arti ...

  7. Unity3D开发(五):Unity3D 4.x 使用Mecanim实现连击(转)

    原地址:http://www.unitymanual.com/blog-1801-1221.html unity3d 4.x 版本之后提供了一种新的动画机制Mecanim,虽然目前还支持之前的Anim ...

  8. java poi导入EXCEL xls文件代码

    /** * */ package com.bn.car.common.report.excel; import java.io.FileInputStream; import java.io.IOEx ...

  9. 【redis】06Redis的高级应用之事务处理、持久化操作、pub_sub、虚拟内存

    上节课详细讲解了redis数据库的常用命令,以及redis数据库高级应用当中的, 安全性,跟咱们的主从复制, 这节课呢,咱们继续来讲咱们的高级应用, 首先来看一下咱们的事务处理, 事务处理 我前面说过 ...

  10. Oracle 10 - 数据库表

    Oracle数据库表类型 1.堆表 2.索引组织表 3.索引clustered表 4.散列clustered表 5.有序散列clustered表 6.嵌套表 7.临时表 8.对象表 9.外部表 Ora ...