开始填连通分量的大坑了= =

  然后平面图有个性质m<=3*n-6.....

  由平面图的欧拉定理n-m+r=2(r为平面图的面的个数),在极大平面图的情况可以代入得到m=3*n-6。

  网上的证明(雾?):

 http://blog.chinaunix.net/uid-26510579-id-3183558.html

 http://www.zybang.com/question/673815bbe56e8b5639f95234b515b8c5.html

  这题把哈密顿回路看成圆,就变成圆上的点之间的边是否能不相交。。和某次模拟赛的T3一模一样= =

  显然对于两条会相交的边x,y,x和y既不能同时在圆内,也不能同时在圆外。。。就转换成2-sat问题了。。

  若使x表示x在圆内,x'表示x在圆外,因为x,y不能同时在圆内,所以连上(x,y')和(y,x'),然后还不能同时在圆外,就再连(x',y)和(y',x)。

  然后就是模板了。。。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
const int maxm=;
struct zs{
int too,pre;
}e[maxm];
struct zzs{
int from,too;
}a[maxn*];
int last[maxn**],dfn[maxn**],low[maxn**],st[maxn**],bel[maxn**];
bool ins[maxn**];
int from[maxn*],too[maxn*],id[maxn];
int tot,tim,num,i,j,k,n,m,x,y,top,tt;
inline bool cant(int x,int b){
if(a[x].from>a[b].from)swap(x,b);
if(a[b].from>a[x].from&&a[b].from<a[x].too&&a[b].too>a[x].too)return ;
return ;
}
void insert(int a,int b){
// printf("%d-->%d\n",a,b);
e[++tot].too=b;e[tot].pre=last[a];last[a]=tot;
e[++tot].too=a;e[tot].pre=last[b];last[b]=tot;
}
void tarjan(int x){
dfn[x]=low[x]=++tim;
st[++top]=x;;ins[x]=;
for(int i=last[x];i;i=e[i].pre)if(!dfn[e[i].too]){
tarjan(e[i].too);low[x]=min(low[x],low[e[i].too]);
}else if(ins[e[i].too])low[x]=min(low[x],dfn[e[i].too]);
if(dfn[x]==low[x]){
num++;
while(st[top+]!=x){
ins[st[top]]=;bel[st[top]]=num;
top--;
}
}
}
bool cmp(zzs a,zzs b){
return a.from<b.from||(a.from==b.from&&a.too<b.too);
}
int main(){
scanf("%d",&tt);
while(tt--){
scanf("%d%d",&n,&m);
if(m>n*-){
for(i=;i<=m<<;i++)scanf("%d",&j);
for(i=;i<=n;i++)scanf("%d",&j);
printf("NO\n");continue;
}
top=tim=tot=num=;
memset(dfn,,*(*m+));
memset(last,,*(*m+));
for(i=;i<=m;i++)scanf("%d%d",&a[i].from,&a[i].too); for(i=;i<=n;i++)scanf("%d",&j),id[j]=i;
for(i=;i<=m;i++){
a[i].from=id[a[i].from];a[i].too=id[a[i].too];
if(a[i].from>a[i].too)swap(a[i].from,a[i].too);
}//按哈密顿回路给点重新编号,使1~n依次对应环中的点
sort(a+,a++m,cmp);j=;
for(i=;i<=m;i++){
if(a[i].from+==a[i].too||a[i].too%n+==a[i].from)continue;
j++;
a[j].from=a[i].from,a[j].too=a[i].too;
}
m=j;
for(i=;i<m;i++)for(j=i+;j<=m;j++){
if(cant(i,j))insert(i*,j*-),insert(j*,i*-);//,printf("%d&&&%d\n",i,j);
if(a[j].from>=a[i].too)break;
}
for(i=;i<=*m;i++)if(!dfn[i])tarjan(i);
bool flag=;
for(i=;i<=m;i++)if(bel[i*]==bel[i*-]){flag=;break;
}
if(flag)printf("NO\n");else printf("YES\n");
}
return ;
}

  系统:正在比对你的代码和黄学长的代码。。。。

     找不到差异QAQ

  当然了kpm大爷那场是玩成括号序列。。。。把边的两端点看成是左括号和右括号,那么圆内和圆外分别是一个合法的括号序列。。算括号序列的时候记录一下每条边会与别的哪些边冲突,按冲突关系建图后二分染色就知道是否可能合法了。。。

  感觉也可以两个括号序列一起上。。其中一个出现冲突后就把冲突的那些边都扔到另外一个括号序列里面,如果再冲突就是无解了。。当然了我只是嘴巴选手(跑

1997: [Hnoi2010]Planar

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1093  Solved: 428
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

 

Sample Output

 

HINT

 

Source

Day1

//没有样例差评

[bzoj1997][Hnoi2010]Planar(2-sat||括号序列)的更多相关文章

  1. bzoj千题计划231:bzoj1997: [Hnoi2010]Planar

    http://www.lydsy.com/JudgeOnline/problem.php?id=1997 如果两条边在环内相交,那么一定也在环外相交 所以环内相交的两条边,必须一条在环内,一条在环外 ...

  2. [BZOJ1997][Hnoi2010]Planar 2-sat (联通分量) 平面图

    1997: [Hnoi2010]Planar Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 2317  Solved: 850[Submit][Stat ...

  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]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. BZOJ4350: 括号序列再战猪猪侠

    Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...

随机推荐

  1. Android 环境搭建、基础窗口window/Mac

    1.五步搞定Android开发环境部署--非常详细的Android开发环境搭建教程 2.Android开发学习之路--MAC下Android Studio开发环境搭建 4.Android常用开发工具以 ...

  2. c语言项目流程开发三部曲

    一.这一部曲是紧接第二部没有介绍完的内容,主要是函数接口实体的实现,代码比较多,如果没有看前两部曲的先去看看,再来看这里,不然不好理解,话不说多上代码, #define _CRT_SECURE_NO_ ...

  3. 【quickhybrid】iOS端的项目实现

    前言 18年元旦三天内和朋友突击了下,勉强是将雏形做出来了,后续的API慢慢完善.(当然了,主力还是那个朋友,本人只是初涉iOS,勉强能看懂,修修改改而已) 大致内容如下: JSBridge核心交互部 ...

  4. MySQL连接方式及大小写问题

     一.连接数据库 在命令行连接MySQL有这两种方式,一种是使用命令行参数:另一种是将参数信息写入配置文件 1.命令行中使用参数 -u用户名 -p密码 -D数据库名 -P数据库服务端口 -s安静模式 ...

  5. Hello TensorFlow

    官方说明:https://www.tensorflow.org/install/ 环境: 操作系统 :Windows 10 家庭中文版 处理器 : Intel(R) Core(TM) i7-7700 ...

  6. PHP函数register_shutdown_function的使用

    函数简介当PHP程序执行完成后,自动执行register_shutdown_function函数,该函数需要一个参数,用来指定由谁处理这些后续的工作.其中,程序执行完成,分为以下几种情况:第一种:ph ...

  7. SQL基础学习_05_函数、谓词、CASE表达式

    函数 算术函数 1. 四则运算: +.-.*./  2. ABS:求绝对值, ABS(数值) 3. MOD: 求余,MOD(被除数,除数) 4. ROUND:四舍五入,ROUND(对象数值,保留小数的 ...

  8. vue实现登录后跳转到之前的页面

    在开发中我们经常遇到这样的需求,需要用户直接点击一个链接进入到一个页面,用户点击后链接后会触发401拦截返回登录界面,登录后又跳转到链接的页面而不是首页,这种问题该如何去做呢? 先说一下我们需要用到的 ...

  9. 使用MethodType函数将方法绑定到类或实例上

    在开始正文之前,需要了解下Python的绑定方法(bound method)和非绑定方法. 简单做个测试: 定义一个类,类中由实例方法.静态方法和类方法. class ClassA: def inst ...

  10. 在macOS上通过pyenv安装和切换多版本Python

    1. 安装homebrew 官网 http://brew.sh/index_zh-cn.html 打开终端,在终端中粘贴如下脚本 /usr/bin/ruby -e "$(curl -fsSL ...