今天简单学习了一下2-SAT。现在简单地总结一下。至于定义之类的就不写了,这里就写写做法,以防以后忘记。

构图

每个值a,拆为两个点,一个表示a,一个表示^a(非a)。每个点我们可以看成是一个命题(这是我的理解)。

图中如果有一条边有X连向Y,表示如果X为真,那么可以推出Y为真。

注意,这里的图是有对称性的,这样下面的算法正确性才成立。举个例子,如果a连向b,那么必然有^b连向^a;如果^a连向b,那么必然有^b连向a。

算法

构好图后我们对其使用强连通分量算法。接着我们就可以得到一个有向无环图了,注意,这里的有向无环图依然满足对称性,这个证明比较简单。

然后我们还需要一个拓扑序,这个是强连通分量是自带的一个结果(根据染色的次序就可以判断)。

那么对于每个布尔变量x,让:
x所在的强连通分量的拓扑序在^x所在的强连通分量的拓扑序之后\(\Leftrightarrow\)x为真。

当然,如果存在x和^x在一个强连通分量里面,说明无解。否则按照上面的构造是可以得到一组解的。

正确性

一开始看到这样做,我是持有怀疑态度的,主要是下面两个情况,我想,把这些分析清楚之后,正确性就显而易见了。


情况一:x为真,y为假,但x和y是在同一个强连通分量p里面。

那么^x和^y也在同一个强连通分量q里面。

x为真,p的拓扑序在q的后面。

y为假,p的拓扑序在q的前面。

矛盾。


情况二:x为真,^x为假,y为假,^y为真,存在一条边由x连向y。

根据上面的情况一,这里我们可以把x看作x所在的强连通分量。

x为真,^x为假,x在^x的后面。

存在一条边由x连向y,y在x的后面。

y为假,^y为真,^y在y的后面。

这样我们得到了它们的拓扑序^x,x,y,^y。但是,

存在一条边由^y连向^x,^x在^y的后面。

矛盾。

字典序

利用贪心的思想,每次从最高位开始确定。

如果我们要使x为真,那么就是加一条由^x向x的边,如果行不通,就会使得x和^x在同一个强连通分量里面。所以,我们只需判断加了这条边后有没有一条从x到^x的路径,如果有就不可以让x为真。

所以我们要在一开始时处理出每两两点之间的连通性(\(O(nm)\)),逐一判断真假。使x为真,就加一条由^x向x的边,同理,使x为假就由x连向^x,然后继续维护连通性(\(O(n^2)\))。

事实上,我们并不需要继续维护图的连通性,也就是不加上那些边,不妨把这些边称为没用上的边。试想,如果在后面,需判断没有一条从x到^x的路径,如果需经过一些没用上的边,不妨设其中一条是由u连向v(这里注意u,v一对点),根据对称性可以知道有这样一条回路:x,u,v,^x。所以只需逐一能不能用上这些没用上的边(\(O(n)\))。

这样我们总的复杂度就是\(O(nm+n^2)\)。

这里可能会有些题目使用上述方法过不了,我们可以沿着上面的思路,写一个暴力,虽然最坏情况下依然是\(O(nm)\),但一些简单的剪枝可以使实际运行快得飞起来。

习题

CF 538H

这里有个神奇的解法,如果我们要满足一些数量关系,比如说是限制x的大小的,可以采用这样一个技巧。我们新建一些点,点i表示\(x \leq i\),那么点i的反面就是\(x > i\)。
如果x的大小范围比较大,那么就运用离散化的类似思想,这题的话,我们要选出最终答案可能取的所有值就可以了。

吐槽:我发现我越来越水了,debug了两天。。。。还有,为什么我tarjan的手写栈会慢这么多????!!

话说这题的challenge不会做,他还限制了老师的数量。

CF 587D

这题需要满足的一个东西是,若干的变量里,只能有一个为真或者没有真。假设在x1,x2,...,xn之间只有一个为真。我们可以这样构图:新建点y1,y2,...,yn,加这样一些边xi->yi+1,yi->^xi,当然,还有对应的反边^yi+1->^xi,xi->^yi。

转载于:https://www.cnblogs.com/wangck/p/4857775.html

2-SAT 及 一点习题相关推荐

  1. 2021版《数据结构》课程学习指南

    20210308更新 增加好文共赏小节,主要用来存放数据结构优秀的博文链接. 目录 学习准备 学习平台 数据结构课程学习说明 成绩组成 学习目标 几大主要的学习活动 学习方法 资源 好文共赏 学习准备 ...

  2. C# 学习笔记入门篇(上)

    文章目录 C# 学习笔记入门篇 〇.写在前面 Hello World! 这篇学习笔记适合什么人 这篇学习笔记到底想记什么 附加说明 一.命名空间 "进入"命名空间 嵌套的命名空间. ...

  3. 已知长短轴求椭圆上任意一点的坐标_高中数学必修2:平面解析几何——椭圆(经典习题)...

    今天接着给大家分享关于高中数学必修2平面解析几何中椭圆知识点讲解,从三个方面进行讲解:基础梳理.要点整理.经典高考习题解题过程及答案. 一.基础梳理 1.椭圆的定义 2.椭圆的标准方程和几何性质 要点 ...

  4. 计算机操作系统第四版汤小丹主编课后习题答案(更新至第七章)

    第一章 1. 设计现代OS的主要目标是什么? (1)方便性使得计算机更易于使用 (2)有效性提高资源利用效率,使系统的吞吐量更大 (3)可扩充性方便增加新的功能和模块,以适应计算机硬件.体系结构和应用 ...

  5. 吴恩达机器学习入门 2018 高清视频公开,还有习题解答和课程拓展,网友:找不到理由不学!...

    贾浩楠 发自 凹非寺 量子位 报道 | 公众号 QbitAI 机器学习入门课程哪家最强? 斯坦福吴恩达的CS229称第二,恐怕没人敢称第一. 最近,吴恩达在斯坦福的最新CS229 2018课程,已经完 ...

  6. Python 程序设计(第二版)董付国_清华大学出版社_习题答案与分析【针对8.4及其之前的】

    更多精彩内容:(没有设置公众号获得,麻烦动动小手~谢谢) CSDN下载:Python编程无师自通电子书,[美]科里·奥尔索夫(Cory Althoff)-文档类-CSDN下载 百度云:链接:https ...

  7. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  8. 数据结构(C语言版) 第二章 线性表 知识梳理+作业习题详解

    目录 一.线性表顺序存储结构(顺序表) 0.线性表的基本概念 1.样例引入:多项式相加 二.线性表链式存储结构(链表) 0.链表的基本概念 1.前插法代码实例 2.链表尾插法完整代码附带各种操作 三. ...

  9. python编程试题定位列表元素的函数是_笨办法学Python 习题 34: 访问列表的元素

    列表的用处很大,但只有你能访问里边的内容时它才能发挥出作用来.你已经学会了按顺序读出列表的内容,但如果你要得到第 5 个元素该怎么办呢?你需要知道如何访问列表中的元素.访问第一个元素的方法是这样的:a ...

  10. 从一道常见习题的自然延伸谈起

    以下是复旦高代教材复习题六的第 19 题或高代白皮书的例 6.18: 习题 1  设 $A,B,C$ 均为 $n$ 阶复方阵, 满足 $C=AB-BA$, $AC=CA$ 和 $BC=CB$, 求证: ...

最新文章

  1. 且看电脑高手如何优雅的使用windows系统
  2. 每天一个linux命令(2):文件权限详解
  3. 小程序的事件处理参数不能取得
  4. 源码之HashMap
  5. serverless 构建_使用Serverless,StepFunctions和StackStorm Exchange构建社区注册应用程序-Episode…...
  6. BarTender操作遇到OLE DB遇到了错误0x80004005”的问题
  7. [css] 怎么让英文单词的首字母大写?
  8. C#分布式缓存二:Asp.Net中使用Couchbase
  9. [转载] python hasattr函数_Python的hasattr() getattr() setattr() 函数使用方法详解
  10. Django的数据迁移
  11. 推荐5款心仪的电脑软件
  12. cif t t操作流程图_cif流程(cif贸易术语流程图)
  13. 郭德纲家训--话糙理不糙
  14. 固态硬盘是什么接口_ssd固态硬盘是什么意思,有什么好处,固态硬盘和机械硬盘的区别...
  15. 2022高处安装、维护、拆除考试题库及模拟考试
  16. 郭琳加冕 2022第三季完美大师 全球人气季军
  17. 国外电子工程师们国内电子工程师火拼(转)
  18. 电脑疑难杂症之Windows更新
  19. 牛客的AI模拟面试(1)
  20. 利用CMD命令有效的查病毒***方法

热门文章

  1. ubuntu python subprocess模块执行python脚本
  2. MIMO-OTFS in High-Doppler Fading Channels:Signal Detection and Channel Estimation(3)
  3. idea的黄色感叹号之Spring Configuration Check (Please configura/setup Spring facet for modules)
  4. Beautiful Soup 4.2.0 文档
  5. windows anaconda 虚拟环境 与 系统变量冲突 pyinstaller 打包软件过大
  6. 柯特斯公式 | 数值积分
  7. WebShell脚本检测机器学习一
  8. html遍历1到100,bat for循环100次:循环100求和
  9. 计算机与信息安全基本概念和知识,第8章计算机网络应用与信息安全知识.ppt
  10. tornado框架学习