BZOJ1997 [Hnoi2010]Planar (2-sat)
题意:给你一个哈密顿图,判断是不是平面图
思路:先找出哈密顿图来。哈密顿回路可以看成一个环,把边集划分成两个集合,一个在环内,一个在外。如果有两条相交边在环内,则一定不是平面图,所以默认两条相交边,转化成2——sat,两条边不能同时在内或外,注意双向加边。(以边来转化成两倍)
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<stack>
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define clc(a,b) memset(a,b,sizeof(a))
const int maxn = + ;
int r(){
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int T,n,m,ind,top,cnt,scc;
int u[],v[];
int c[],pos[];
int last[],dfn[],low[],q[],bl[];
bool inq[]; struct edge{
int to,next;
}e[]; void add(int u,int v){
e[++cnt].to=v;
e[cnt].next=last[u];
last[u]=cnt;
} void tarjan(int x){
inq[x]=;q[++top]=x;
low[x]=dfn[x]=++ind;
for(int i=last[x];i;i=e[i].next)
if(!dfn[e[i].to])
tarjan(e[i].to),low[x]=min(low[x],low[e[i].to]);
else if(inq[e[i].to])
low[x]=min(low[x],dfn[e[i].to]);
int now=-;
if(low[x]==dfn[x])
{
scc++;
while(now!=x)
{
now=q[top--];inq[now]=;
bl[now]=scc;
}
}
} bool jude(){
for(int i=;i<=m;i++){
if(bl[i*]==bl[i*-])
return false;
}
return true;
}
int main(){
T=r();
while(T--){
n=r(),m=r();
for(int i=;i<=m;i++){
u[i]=r();v[i]=r();
}
clc(last,);
cnt=;
scc=ind=;
clc(low,);
clc(dfn,);
for(int i=;i<=n;i++)
c[i]=r();
if(m>*n-){
printf("NO\n");
continue;
}
for(int i=;i<=n;i++)
pos[c[i]]=i;
top=;
for(int i=;i<=m;i++){
u[i]=pos[u[i]],v[i]=pos[v[i]];
if(u[i]>v[i]) swap(u[i],v[i]);
if(v[i]-u[i]==||v[i]-u[i]==n-) continue;
u[++top]=u[i],v[top]=v[i];
}
m=top;
for(int i=;i<=m;i++){
for(int j=i+;j<=m;j++){
if((u[i]<u[j]&&v[i]>u[j]&&v[i]<v[j])||(u[i]>u[j]&&v[j]>u[i]&&v[i]>v[j])){
add(*i-,*j);
add(*i,*j-);
add(*j-,*i);
add(*j,*i-);
}
}
}
for(int i=;i<=*m;i++){
if(dfn[i]==){
tarjan(i);
}
}
if(jude()) printf("YES\n");
else printf("NO\n"); }
return ;
}
BZOJ1997 [Hnoi2010]Planar (2-sat)的更多相关文章
- [bzoj1997][Hnoi2010]Planar(2-sat||括号序列)
开始填连通分量的大坑了= = 然后平面图有个性质m<=3*n-6..... 由平面图的欧拉定理n-m+r=2(r为平面图的面的个数),在极大平面图的情况可以代入得到m=3*n-6. 网上的证明( ...
- bzoj千题计划231:bzoj1997: [Hnoi2010]Planar
http://www.lydsy.com/JudgeOnline/problem.php?id=1997 如果两条边在环内相交,那么一定也在环外相交 所以环内相交的两条边,必须一条在环内,一条在环外 ...
- [BZOJ1997][Hnoi2010]Planar 2-sat (联通分量) 平面图
1997: [Hnoi2010]Planar Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 2317 Solved: 850[Submit][Stat ...
- BZOJ1997 [Hnoi2010]Planar 【2-sat】
题目链接 BZOJ1997 题解 显然相交的两条边不能同时在圆的一侧,\(2-sat\)判一下就好了 但这样边数是\(O(m^2)\)的,无法通过此题 但是\(n\)很小,平面图 边数上界为\(3n ...
- bzoj1997: [Hnoi2010]Planar
2-SAT. 首先有平面图定理 m<=3*n-6,如果不满足这条件肯定不是平面图,直接退出. 然后构成哈密顿回路的边直接忽略. 把哈密顿回路当成一个圆, 如果俩条边交叉(用心去感受),只能一条边 ...
- bzoj1997 [Hnoi2010]Planar——2-SAT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997 神奇的经典2-SAT问题! 对于两个相交的区间,只能一里一外连边,所以可以进行2-SA ...
- 【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 ...
- bzoj1997 [HNOI2010]平面图判定Plana
bzoj1997 [HNOI2010]平面图判定Planar 链接 bzoj luogu 思路 好像有很多种方法过去.我只说2-sat 环上的边,要不在里面,要不在外边. 有的边是不能同时在里面的,可 ...
- BZOJ 1997: [Hnoi2010]Planar( 2sat )
平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...
随机推荐
- 数列 COGS1048:[Citric S2] 一道防AK好题
[题目描述] Czy手上有一个长度为n的数列,第i个数为xi. 他现在想知道,对于给定的a,b,c,他要找到一个i,使得a*(i+1)*xi2+(b+1)*i*xi+(c+i)=0成立. 如果有多个i ...
- App新版本提醒
童鞋们是否遇过在使用app的时候出现有新版本更新跳转到苹果商店的提示呢? github中有一个三方框架 Harpy 完美实现了这一功能! demo时刻 我的github - Harpy
- Android Learning:微信第三方登录
这两天,解决了微信第三方授权登录的问题,作为一个新手,想想也是一把辛酸泪.我想着,就把我的遇到的坑给大家分享一下,避免新手遇到我这样的问题能够顺利避开. 步骤一 微信开发者平台 我开始的解决思路是,去 ...
- 常用javascript代码片段集锦
常用方法的封装 根据类名获取DOM元素 var $$ = function (className, element) { if (document.getElementsByClassName) { ...
- HTTP Response Spliting 防范策略研究
目录0x1:HTTP请求的格式0x2:HTTP请求的方法0x3:HTTP响应的格式0x4:HTTP响应拆分攻击0x5:防范的方法 HTTP请求的格式 客户端所提出的HTTP请求包含下列信息:(1)请求 ...
- ASP.NET Application_Error错误日志写入
一个web项目开发已完成,测试也通过,但是,bug是测不完的,特别是在一个大的网络环境下.那么,我们就应该记录这些错误,然后改正.这里,我的出错管理页面是在global.asax里面的,利用里面的Ap ...
- Tomcat 6 支持 NIO -- Tomcat的四种基于HTTP协议的Connector性能比较(转载)
Tomcat从5.5版本开始,支持以下四种Connector的配置分别为: <Connector port="8081" protocol="org.apache. ...
- easyui表单提交,后台获取不到值
J2ee开发,使用easyui表单提交,在ie中可以正常将参数传递到后台,但使用firefox,chrome都无法将easyui的combobox值传递到后台,使用alert($('#form').s ...
- Linux内核态抢占机制分析
http://blog.sina.com.cn/s/blog_502c8cc401012pxj.html [摘要]本文首先介绍非抢占式内核(Non-Preemptive Kernel)和可抢占式内核( ...
- 【Linux安全】防止任意用户使用 su 切换到 root
防止任意用户使用 su 切换到 root 在终端中输入下列命令 vim /etc/pam.d/su (按 i 进行编辑,qw 保存并推出) 在头部加入行: auth required pam_whee ...