bzoj1997 [Hnoi2010]Planar——2-SAT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1997
神奇的经典2-SAT问题!
对于两个相交的区间,只能一里一外连边,所以可以进行2-SAT问题的建模;
但 m 太大了,可以用一个平面图的定理,m <= 3*n - 6 来缩小范围;
注意特判要等读入结束后再判掉!!!
代码如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int const maxn=2005,maxm=10005;// int n,m,T,hd[maxn],ct,dfn[maxn],low[maxn],cr,col[maxn]; int tim,l[maxn],r[maxn],a[maxn],sta[maxn],top; bool vis[maxn]; struct N{int to,nxt;N(int t=0,int n=0):to(t),nxt(n) {} }ed[maxn*maxn*2]; void add(int x,int y){ed[++ct]=N(y,hd[x]); hd[x]=ct;} void tarjan(int x) {dfn[x]=low[x]=++tim;sta[++top]=x; vis[x]=1;for(int i=hd[x],u;i;i=ed[i].nxt){if(!dfn[u=ed[i].to])tarjan(u),low[x]=min(low[x],low[u]);else if(vis[u])low[x]=min(low[x],dfn[u]);}if(low[x]==dfn[x]){cr++; int y;while((y=sta[top])!=x){top--; vis[y]=0; col[y]=cr;}top--; vis[x]=0; col[x]=cr;} } int main() {scanf("%d",&T);while(T--){scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d%d",&l[i],&r[i]);for(int i=1,x;i<=n;i++)scanf("%d",&x),a[x]=i;if(m>3*n-6){printf("NO\n"); continue;}//先读完再判NO!!! int tp=0;for(int i=1;i<=m;i++){l[i]=a[l[i]],r[i]=a[r[i]];if(l[i]>r[i])swap(l[i],r[i]); // if(r[i]-l[i]==1||(r[i]==n&&l[i]==1))continue;//没有也可 // l[++tp]=l[i],r[tp]=r[i]; } // m=tp;ct=0; memset(hd,0,sizeof hd);for(int i=1;i<=m;i++)for(int j=i+1;j<=m;j++){if((l[i]<l[j]&&r[i]<r[j]&&r[i]>l[j])||(l[j]<l[i]&&r[j]<r[i]&&r[j]>l[i]))add(i,j+m),add(j+m,i),add(j,i+m),add(i+m,j);}tim=0; top=0; cr=0;memset(low,0,sizeof low); // memset(col,0,sizeof col);memset(dfn,0,sizeof dfn);for(int i=1;i<=m*2;i++)if(!dfn[i])tarjan(i);bool fl=0;for(int i=1;i<=m;i++)if(col[i]==col[i+m]){fl=1; break;}if(fl)printf("NO\n");else printf("YES\n");}return 0; }
转载于:https://www.cnblogs.com/Zinn/p/9280403.html
bzoj1997 [Hnoi2010]Planar——2-SAT相关推荐
- bzoj1997 [HNOI2010]平面图判定Plana
bzoj1997 [HNOI2010]平面图判定Planar 链接 bzoj luogu 思路 好像有很多种方法过去.我只说2-sat 环上的边,要不在里面,要不在外边. 有的边是不能同时在里面的,可 ...
- BZOJ 1997: [Hnoi2010]Planar( 2sat )
平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...
- bzoj 1997: [Hnoi2010]Planar
Description 若能将无向图 G=(V,E)画在平面上使得任意两条无重合顶点的边不相交,则称 G 是平面图. 判定一个图是否为平面图的问题是图论中的一个重要问题.现在假设你要判定的是一类特殊的 ...
- [HNOI2010 Planar平面图判定]
[关键字]:图论 二分图 [题目大意]:给出一个带有汉密尔顿回路的图,判断它是否是一个平面图. //================================================== ...
- 【BZOJ1997】【HNOI2010】Planar(2-SAT,平面图,并查集)
Description Solution 首先如果边数大于 3n−6 3 n − 6 3n-6直接输出NO 我们将哈密顿回路看做一个圆,一对边如果全部在圆内相连会相交,那么它们如果全部在圆外连边也会相 ...
- 一句话题解(20170801~20170125)
8.1 bzoj 4720 noip2016 换教室 floyd预处理+期望(薛定谔的猫) bzoj 4318 OSU! 三次函数期望值 从一次.二次推得 8.2 bzoj 1076 状压+期望DP ...
- 做题记录 To 2019.2.13
2019-01-18 4543: [POI2014]Hotel加强版:长链剖分+树形dp. 3653: 谈笑风生:dfs序+主席树. POJ 3678 Katu Puzzle:2-sat问题,给n个变 ...
- [颓废史]蒟蒻的刷题记录
QAQ蒟蒻一枚,其实我就是来提供水题库的. 以下记录从2016年开始. 1.1 1227: [SDOI2009]虔诚的墓主人 树状数组+离散化 3132: 上帝造题的七分钟 树状数组 二维区间加减+查 ...
- AC日记——[HNOI2010]BOUNCE 弹飞绵羊 洛谷 P3203
[HNOI2010]BOUNCE 弹飞绵羊 思路: SBlct: 代码: #include <bits/stdc++.h> using namespace std; #define max ...
- 模板 - 2 - SAT问题
整理的算法模板合集: ACM模板 注意一个坑,2SAT问题中如果要求你输出方案,如果你的代码输出的跟样例不一样,不要着急,因为2SAT 问题本来就是有多解,结果我样例不过,交上去就A了 方案输出时,c ...
最新文章
- lstm数学推导_手推公式:LSTM单元梯度的详细的数学推导
- 引号不是字符串中唯一的可以被转义字符。下面是常见的转义序列列表:
- html符号纵向,HTML常用特殊符号对照表与一些标签说明.pdf
- 【数据结构与算法】之深入解析“四数之和”的求解思路与算法示例
- 如何写出优雅的异常处理
- hybris安装执行install.sh -r b2c_acc initialize遇到build错误 8983端口
- Spring Boot 的starter pom
- 基于Ubuntu12.04下的Keystone源码安装
- 【leetcode】1023. Camelcase Matching
- sed和awk常用命令式例
- 自我监督学习和无监督学习_弱和自我监督的学习-第4部分
- 浏览器iframe跨域
- 小米路由mini刷潘多拉及老毛子固件-详细教程
- 如何制作unity艺术字体
- 51nod 1108.距离之和最小 V2 - 曼哈顿距离
- RT-Thread:STM32F407虚拟U盘,无法识别拔出问题解决方案
- c++ 中关于引用(1)
- Visual Studio/AnkhSVN在VS中出现SVN代码冲突的解决方法
- Canvas 动画引擎解析与微信小程序中的应用
- Frammer X for Mac(视频截图软件)
热门文章
- 部署Vista(7)——创建一个最基本的应答文件
- WebUI Case(1): www.swt-designer.com 首页 (续)
- linux jvm启动过程,Linux操作系统启动过程详解
- cc ai条码插件_科脉神秘黑科技产品横空出世,AI能为生鲜称重带来哪些变革?
- 设计模式之——抽象工厂模式
- DWR整合Spring
- [渝粤教育] 中国地质大学 管理信息系统 复习题
- 从socket中可以获取信息
- Animal-AI 2.0.0发布了!快来测试你的智能体吧。
- DOM基础操作(三)