bzoj1997 [HNOI2010]平面图判定Plana
bzoj1997 [HNOI2010]平面图判定Planar
链接
思路
好像有很多种方法过去。我只说2-sat
环上的边,要不在里面,要不在外边。
有的边是不能同时在里面的,可以O(m^2)的连边
但是m是10000,不过平面图内边数不得超过3*n-6,
m太大的直接NO就好了,其他的n,m是一个数量级的,直接2-sat暴力连边做就好了。


细节
双向边
是边m进行2-sat,不是点n
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1207;
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,a[N],u[10005],v[10005],tong[N],rk[10005];
struct node {int v,nxt;}e[N*N*2];
int head[N],tot;
map<pair<int,int >,int > Hash;
void add(int u,int v) {
e[++tot].v=v;
e[tot].nxt=head[u];
head[u]=tot;
}
int low[N],dfn[N],cnt,stak[N],top,vis[N],col,belong[N];
void tarjan(int u) {
dfn[u]=low[u]=++cnt;
vis[u]=1;
stak[++top]=u;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
} else if(vis[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]) {
++col;
while(stak[top]!=u) {
vis[stak[top]]=0;
belong[stak[top]]=col;
top--;
}
vis[u]=0;
belong[u]=col;
top--;
}
}
void clear() {
tot=cnt=col=0;
Hash.clear();
memset(head,0,sizeof(head));
memset(low,0,sizeof(low));
memset(dfn,0,sizeof(dfn));
memset(rk,0,sizeof(rk));
}
void solve() {
clear();
n=read(),m=read();
for(int i=1;i<=m;++i) u[i]=read(),v[i]=read();
for(int i=1;i<=n;++i) a[i]=read();
for(int i=2;i<=n;++i) {
rk[a[i]]=i;
Hash[make_pair(a[i],a[i-1])]=1;
Hash[make_pair(a[i-1],a[i])]=1;
}
Hash[make_pair(a[1],a[n])]=1;
Hash[make_pair(a[n],a[1])]=1;
if(m>3*n-6) return puts("NO"),void();
for(int i=1;i<=m;++i) {
if(!Hash[make_pair(u[i],v[i])]) {
memset(tong,0,sizeof(tong));
for(int j=1,flag=0;j<=n;++j) {
if(u[i]==a[j]||v[i]==a[j]) flag=flag^1;
tong[j]=flag;
}
for(int j=i+1;j<=m;++j) {
if(Hash[make_pair(u[j],v[j])]) continue;
if(u[i]==v[j]||u[i]==u[j]||v[i]==v[j]||v[i]==u[j]) continue;
if(tong[rk[u[j]]]^tong[rk[v[j]]]) {
add(i,j+m);
add(j+m,i);
add(i+m,j);
add(j,i+m);
}
}
}
}
for(int i=1;i<=2*m;++i)
if(!dfn[i])
tarjan(i);
for(int i=1;i<=m;++i)
if(belong[i]==belong[i+m])
return puts("NO"),void();
return puts("YES"),void();
}
int main() {
for(int T=read();T;T--) solve();
return 0;
}
bzoj1997 [HNOI2010]平面图判定Plana的更多相关文章
- [BZOJ1997][HNOI2010] 平面图判定
Description Input Output 是的..BZOJ样例都没给. 题解(from 出题人): 如果只考虑简单的平面图判定,这个问题是非常不好做的. 但是题目中有一个条件— ...
- BZOJ1997 HNOI2010 平面图判定 planar (并查集判二分图)
题意 判断一个存在哈密顿回路的图是否是平面图. n≤200,m≤10000n\le200,m\le10000n≤200,m≤10000 题解 如果一定存在一个环,那么连的边要么在环里面要么在外面.那么 ...
- P3209 [HNOI2010]平面图判定
P3209 [HNOI2010]平面图判定 哈密尔顿环之外的任意一条边,要么连在环内部,要么连在环外部 判断两条边在同一部分会相交,则这两条边必须分开 那么把边看作点连边,跑二分图染色就行 #incl ...
- Luogu P3209 [HNOI2010]平面图判定(2-SAT)
P3209 [HNOI2010]平面图判定 题意 题目描述 若能将无向图\(G=(V,E)\)画在平面上使得任意两条无重合顶点的边不相交,则称\(G\)是平面图.判定一个图是否为平面图的问题是图论中的 ...
- [HNOI2010]平面图判定
Description: 若能将无向图 \(G=(V, E)\) 画在平面上使得任意两条无重合顶点的边不相交,则称 \(G\) 是平面图.判定一个图是否为平面图的问题是图论中的一个重要问题.现在假设你 ...
- Luogu3209 HNOI2010 平面图判定 平面图、并查集
传送门 题意:$T$组数据,每组数据给出一个$N$个点,$M$条边,并存在一个$N$元环的图,试判断其是否为一个可平面图(如果存在一种画法,使得该图与给出的图同构且边除了在顶点处以外互相不相交,则称其 ...
- [HNOI2010] 平面图判定 planar
标签:二分图判定.题解: 首先可以把题目中给你的那个环给画出来,这样就可以发现对于任意一个图来说,如果两条边要相交,就不能让他们相交,那么这两条边就要一条在里面一条在外面,如果把环画成一条链,那么就是 ...
- 洛谷P3209 [HNOI2010]平面图判定(2-SAT)
传送门 看到哈密顿回路就被吓傻了……结果没有好好考虑性质…… 首先,平面图有个性质:边数小于等于$3n-6$(我也不知道为啥),边数大于这个的直接pass 然后考虑原图,先把哈密顿回路单独摘出来,就是 ...
- HNOI2010 平面图判定(planar)
题目链接:戳我 我怎么知道平面图有这个性质?? 对于一个平面图,它的边数不超过点数的\(3n-6\) 所以可以直接把边数多的特判掉,剩下的图中边数和点数就是一个数量级的了. 因为这个图存在欧拉回路,所 ...
随机推荐
- qs.stringify和JSON.stringify()
var a = {name:'hehe',age:10}; qs.stringify(a) // 'name=hehe&age=10' JSON.stringify(a) // '{" ...
- 多线程之Synchronized锁的基本介绍
基本介绍 synchronized是Java实现同步的一种机制,它属于Java中关键字,是一种jvm级别的锁.synchronized锁的创建和释放是此关键字控制的代码的开始和结束位置,锁是有jvm控 ...
- 了解JVM运行时的内存分配
了解JVM运行时的内存分配 前言 上文中,在介绍运行时数据区域中的 JAVA 堆时,提到了 JVM 中的堆,一般分为三大部分:新生代.老年代.永久代,本文将进一步了解运行时的内存分配情况. 正文 1. ...
- vue cli 3.0创建项目
.npm i -g @vue/cli .vue create my-project 此处有两个选择: 1.default (babel, eslint)默认套餐,提供babel和eslint支持 2. ...
- Redis集群方案怎么做?
转载自:https://www.jianshu.com/p/1ecbd1a88924 Redis集群方案 Redis数据量日益增大,而且使用的公司越来越多,不仅用于做缓存,同时趋向于存储这块,这样必促 ...
- JDBC事务的相关知识
事务的定义 事务(Transaction):是并发控制的单元,是用户定义的一个操作序列.这些操作要么都做,要么都不做,是一个不可分割的工作单位.通过事务,sql server 能将逻辑相关的一组操作绑 ...
- java学习之成员内部类
//成员内部类:直接在类中定义 /*成员内部类的通常用法: * 通常是提供给外部类使用不进行内部类的实例化 * 因此一般把他设为私有的类用private限定 * * */ /*Demo*/ class ...
- VMware Workstation 14永久激活密钥
VMware Workstation是一款功能强大的桌面虚拟计算机软件,简单来说就是最强的中文虚拟机了,可以在桌面上运行不同的操作系统 VMware workstation 14永久激活密钥 : CG ...
- 开发宏功能:excel中从sheet批量插入
源数据如图: 宏操作: 生成数据后: 关键操作:在excel中启用开发工具,添加宏,然后添加模块即可,编辑完代码后,自定义功能按钮即可. Sub MakeDataSource() Dim isExis ...
- spring boot + vue + element-ui全栈开发入门——项目部署
前言 常用的部署方式有两种: 1.是把生成好的静态页面放到spring boot的static目录下,与打包后的spring boot项目一起发布,当spring boot运行起来后,自然而然就能访 ...