2-SAT超入门讲解
Preface
说实话2-SAT的题目我都没怎么做过,所以这里讲的都是些超入门什么的
还有一些板子题,由于是暑假的时候学的所以有些我也记不清了
主要学习参考自:Mancher的课件&&dalao's blog&&Another dalao
What is 2_SAT?
SAT是适定性(Satisfiability)问题的简称 。一般形式为k-适定性问题,简称 k-SAT。
可以证明,当\(k>2\)时,k-SAT是NP完全的。因此一般讨论的是\(k=2\)的情况,即2-SAT问题。
我们通俗的说,就是给你\(n\)个变量\(a_i\),每个变量能且只能取\(0/1\)的值。同时给出若干条件,形式诸如\((not)a_i\operatorname{opt}(not)\ a_j=0/1\),其中\(opt\)表示\(and,or,xor\)中的一种
而求解2-SAT的解就是求出满足所有限制的一组\(a\)
Change 2-SAT into Graph Theory
首先我们考虑将2-SAT问题往图论的方向靠,我们发现每个点要么取\(0\),要么取\(1\)。因此对于\(a_i\),我们建两个点\(2i-1\)与\(2i\)分别表示\(a_i\)取\(0\)和\(1\)
然后我们考虑建边来表示这些关系,我们令一条有向边的意义:\(x\to y\)表示如果选择了\(x\)就必须选\(y\)
那么我们可以举一些简单的例子来总结下连边的规律(用\(i'\)表示\(i\)的反面):
- \(i,j\)不能同时选:选了\(i\)就要选\(j'\),选\(j\)就要选\(i'\)。故\(i\to j',j\to i'\)。一般操作即为\(a_i \operatorname{xor} a_j=1\)
 - \(i,j\)必须同时选:选了\(i\)就要选\(j\),选\(j\)就要选\(i\)。故\(i\to j,j\to i\)。一般操作即为\(a_i \operatorname{xor} a_j=0\)
 - \(i,j\)只且只且选一个:选了\(i\)就要选\(j'\),选\(j\)就要选\(i'\),选\(i'\)就要选\(j\),选\(j'\)就要选\(i\)。故\(i\to j',j\to i',i'\to j,j'\to i\)。一般操作即为\(a_i \operatorname{or} a_j=1\)
 - \(i\)必须选:直接\(i'\to i\),可以保证无论怎样都选\(i\)。一般操作为给出的\(a_i=1\)或\(a_i \operatorname{and} a_j=1\)
 
建好图然后就是考虑怎么用图论的方式解决2-SAT了。
How to solve 2-SAT——DFS
- 对于每个当前不确定的变量\(a_i\),令\(a_i=0\)然后沿着边DFS访问相连的点。
 - 检查如果会导致任意一个\(j\)与\(j'\)都被选,那么撤销。否则令\(a_i=0\)
 - 否则令\(a_i=1\),重复2。如果还不行就无解。
 - 继续考虑下一个不确定的变量
 
这样的话正确性显然,由于这里的DFS涉及到全局,因此复杂度是\(O(n(n+m))\)的。
一般情况下已经很优秀了,而且还可以改进:
只需要在DFS之前判断\(i'\)能否走到\(i\)就可以省略撤销标记的过程,所以我们可以bitset优化传递闭包做到\(O(\frac{n+m}{w})\)预处理,然后就可以\(O(n+m)\)的DFS了。
这种做法还可以保证解的字典序,有时不失为一种不错的方法。
How to solve 2-SAT——SCC
考虑我们上面的判断有无解的情况,我们想到完全可以借助SCC来判断两个点是否互相到达。
那么我们先缩点,如果\(i\)与\(i'\)在同一SCC里那么显然无解。
否则选择\(i\)与\(i'\)中拓扑序较大的一个就可以得到一组可行解。
不是很常用(主要是一般题目的数据范围都不需要),用来判可行性比较好。
两道例题
- HDU 3062Party 2-SAT建图后判断可行性即可。
 - HDU 1814Peaceful Commission 2-SAT建图后求字典序最小解,就用DFS的方法不预处理也可以过。
 
Postscript
这真的是一篇超入门博客,没有涉及特别多的难点以及姿势。
像数据结构优化建图我是肯定不会的啦,最后推荐一道比较有难度的2-SAT好题:Luogu P3825 [NOI2017]游戏&&Sol
2-SAT超入门讲解的更多相关文章
- Mysql C语言API编程入门讲解
		
原文:Mysql C语言API编程入门讲解 软件开发中我们经常要访问数据库,存取数据,之前已经有网友提出让鸡啄米讲讲数据库编程的知识,本文就详细讲解如何使用Mysql的C语言API进行数据库编程. ...
 - 超细讲解Django打造大型企业官网
		
本文为知了课堂黄勇老师讲的<超细讲解Django打造大型企业官网>的笔记. 第一章 Django预热 1.创建virtualenv虚拟环境 2.URL组成部分详解 3.Django介绍 4 ...
 - #001 CSS快速入门讲解
		
CSS入门讲解 HTML人+CSS衣服+JS动作=>DHTML CSS: 层叠样式表 CSS2.0 和 CSS3.0 版本,目前学习CSS2, CSS3只是多了一些样式出来而已 CSS 干啥用的 ...
 - HTML5游戏开发引擎Pixi.js新手入门讲解
		
在线演示 本地下载 这篇文章中,介绍HTML5游戏引擎pixi.js的基本使用. 相关代码如下: Javascript 导入类库:(使用极客的cdn服务:http://cdn.gbtags.com) ...
 - AngularJS入门讲解4:多视图,事件绑定,$resource服务讲解
		
上一课,大家知道,手机详细模板我们没有写出来,使用的是一个占位模板. 这一课,我们先实现手机详细信息视图,这个视图会在用户点击手机列表中的一部手机时被显示出来. 为了实现手机详细信息视图,我们将会使用 ...
 - poj2104 k-th number 主席树入门讲解
		
poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树 刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...
 - #001 HTML快速入门讲解
		
整理了下最早开始学习技术的笔记 3W1H学习法? (其他技术同理) What HTML是什么? When 什么时候使用HTML? Why 为什么使用HTMl? HOW 怎么使用HTML ...
 - 原生AJAX入门讲解(含实例)
		
相对于jQuery.YUI以及其他一些类库的AJAX封装,原生JS的AJAX显得那么的尴尬,兼容性不好,要记很多的方法属性,调用不便捷,代码臃肿...但我还是想说,原生JS才是最根本最底层的知识(虽然 ...
 - win8.1上wamp环境中利用apache自带ab压力测试工具使用超简单讲解
		
2015.10.4apache自带ab压力测试工具使用:本地环境:win8.1 wampserver2.5 -Apache-2.4.9-Mysql-5.6.17-php5.5.12-64b 可以参考一 ...
 
随机推荐
- Loadrunner 脚本开发-利用Loadrunner生成Web service测试脚本
			
脚本开发-利用Loadrunner生成Web service测试脚本 1.选择协议--Web Service,如下图 2.导入服务 入口1:点击Manage Services ->弹出窗中选择“ ...
 - 喜闻乐见-Activity生命周期
			
Activity的生命周期,对于Android开发者来说,再熟悉不过了.但是我们接触到的资料,绝大部分都只是谈了一些表面上的东西,例如各个回调的顺序等等.本文试图换个角度来讲解,也希望对各位读者有所帮 ...
 - 最全的android学习资料
			
一.开发环境搭建 (已完成) 负责人:kris 状态:已完成 所整理标签为:搭建 SDK JDK NDK Eclipse ADT 模拟器 AVD 调试器(DEBUG) DDMS 测试 日志 Logca ...
 - json替换jsonp实现跨域请求
			
最近遇到h5前端页面和web后端双方的请求存在跨域,普通的jquery.ajax请求已不能实现(因为js是不允许跨域的(如果可以跨域,那就能随便改别人的网页了),js的原理), 最后经过艰苦奋斗,终于 ...
 - [20171223]grid用户的环境变量问题.txt
			
[20171223]grid用户的环境变量问题.txt --//oracle 11G 安装RAC,一般需要建立grid用户,使用这个用户管理asm,群集信息.--//在安装过程中,同事的疑问实际上也是 ...
 - 前端使用 validate , 根据条件进行动态的验证添加
			
需求如下: 审核操作的时候,选择“通过” 就不需要验证审核意见,但是选择的是“不通过”,那么需要进行审核意见验证 <script> $(function () { InitValidate ...
 - Java同步、异步区别
			
一.概念: 1.同步:所有的操作都做完,才返回给用户.这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉).这种情况下,用户不 ...
 - C#语言————格式化数值结果表
			
字符 说明 示例 输出结果.C ...
 - iTween for Unity
			
你曾经在你的游戏中制作过动画吗?问这个问题可能是愚蠢的,几乎每个Game都有动画,虽然有一些没有,但你必须处理有动画和没有动画.让我们结识 ITween. iTween 官方网站:http://itw ...
 - Sender IP字段为"0.0.0.0"的ARP请求报文
			
今天在研究免费ARP的过程中,抓到了一种Sender IP字段为“0.0.0.0”的ARP请求报文(广播),抓包截图如下: 这让我很疑惑.一个正常的ARP请求不应该只是Target MAC字段为全0吗 ...