[bzoj1997][Hnoi2010]Planar(2-sat||括号序列)
开始填连通分量的大坑了= =
然后平面图有个性质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
//没有样例差评
[bzoj1997][Hnoi2010]Planar(2-sat||括号序列)的更多相关文章
- 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 [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 环上的边,要不在里面,要不在外边. 有的边是不能同时在里面的,可 ...
- BZOJ4350: 括号序列再战猪猪侠
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...
随机推荐
- JSP和JavaBean总结
JSP JSP全名为Java Server Pages,即java服务器页面,其根本是一个简化的Servlet设计.它是在传统的网页HTML文件中插入Java代码,从而形成JSP文件. JSP注释分为 ...
- 两个HC-05蓝牙模块互相绑定构成无线串口模块
HC-05 嵌入式蓝牙串口通讯模块(以下简称模块)具有两种工作模式:命令响应工作模式和自动连接工作模式,在自动连接工作模式下模块又可分为主(Master).从(Slave)和回环(Loopback)三 ...
- HyperV下安装Centos 7全屏显示方法
Hyper-v一般模式的分辨率很小,所以我们在电脑上显示的时候往往不能全屏,即使全屏了也只是轮廓全部工作区并没有全屏显示.导致这个问题的原因是:我们在装系统时,没有选择合适的屏幕分辨率,所以这里只要在 ...
- CRM项目总结
CRM项目总结 一:开发背景 在公司日益扩大的过程中,不可避免的会伴随着更多问题出现. 对外 : 如何更好的管理客户与公司的关系?如何更及时的了解客户日益发展的需求变 ...
- mvc4.5更改为mvc4.0方法总结
一:使用MVC4.5创建的项目结果IIS服务器不支持(windows server2008 支持.net4.0),整了半天终于有点眉目了,方法如下: 1.先将项目所在的文件夹找到,去掉文件夹及其文件的 ...
- Life in Changsha 第一次scrum冲刺
第一次冲刺任务 基于大局的全面性功能框架定位,要求能实现用户基于自己的需求进行的一系列操作. 用户故事 用户打开“生活在长大”的界面 程序首页展示校园服务,论坛等相关信息 用户选择某个功能 程序界面跳 ...
- SQLServer LinkServer 链接服务器
Linked Server简介 我们日常使用SQL Server数据库时,经常遇到需要在实例Instance01中跨实例访问Instance02中的数据.例如在做数据迁移时,如下语句: insert ...
- Java笔记:开发环境
Java开发环境 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java平台的总称.由James Gosling和同事们共同研发,并在1995年正 ...
- Python核心编程笔记--私有化
一.私有化的实现 在Python中想定义一个类是比较简单的,比如要定义一个Person类,如下代码即可: # -*- coding: utf-8 -*- # __author : Demon # da ...
- SQL Server Service Broker创建单个数据库会话
概述 SQL Server Service Broker 用来创建用于交换消息的会话.消息在目标和发起方这两个端点之间进行交换.消息用于传输数据和触发消息收到时的处理过程.目标和发起方既可以在同一数据 ...