[学习笔记] 2-SAT
引入
有 \(n\) 个变量 \(x_1 \cdots x_n\),每个变量的取值范围为 \(\{0,1\}\),另有 \(m\) 个条件,每个条件都是对其中两个变量的取值限制,形如要么 \(x_i = 0/1\) 要么 \(x_j = 0/1\)。求是否存在 \(n\) 个变量的合法赋值。
这样的问题就被称为 \(\text{2-SAT}\) 问题。
求解
首先将每个变量拆成两个点 \(x_i = 0,x_i = 1\),因为一个变量也只有两种取值。
然后对这些点连边,每条边 \((u,v)\) 的含义为:选了 \(u\) 就必须选 \(v\)。对于一个条件:要么 \(x_i = p\) 成立,要么 \(x_j = q\) 成立。我们就将 \(x_i = p\) 向 \(x_j = \lnot q\) 连一条有向边,意为 \(x_i = p\) 成立了,\(x_j = q\) 就不能成立;还需要将 \(x_j = q\) 向 \(x_i = \lnot p\) 连一条有向边,意为 \(x_j = q\) 成立了,\(x_i = p\) 就不能成立。
图建好后,就得到了很多有向图,那么对这些图分别求一次强联通分量,根据边的定义,我们知道,每个强联通分量内的点,要么都成立,要么就都不成立。如果 \(x_i = p\) 和 \(x_i = \lnot p\) 点处于同一个强联通分量内,那么就矛盾了,无解,反之则有解。
对于有解的情况,我们希望能构造出一种解。在有解的情况下,一个变量的两个取值点可能会间接影响,例如 \(x_i = 0\) 成立可能会推导出 \(x_i = 1\) 成立。解决方案就是对 SCC 缩点后的图跑一遍拓扑(因为有解所以无环),每个变量取拓扑序最大的那个取值点,如果取了小的那个,那么他就会将大的推导出来。
但在实际中,我们不需要再跑一遍拓扑,因为在做强联通分量缩点的过程中,我们已经将拓扑序求出来了,就体现在 \(col\) 染色数组中,只不过是反序,所以取 \(col\) 值小的那个即可。
应用
对称性
\(\text{2-SAT}\) 具有对称性。若存在一条边 \((u,v)\),那么也需要存在 \((\lnot v,\lnot u)\) 这条边,因为原命题和其逆否命题真假相同。
构造解
见前文。
特殊边
若 \(p\) 不能取,那么就把 \(p\) 向 \(\lnot p\) 连一条边。这条边也应当满足对称性。
题
\(\text{2-SAT}\) 的题多半不会给你很裸的的条件,需要你自行推导成那种形式。
暂无。
[学习笔记] 2-SAT的更多相关文章
- <老友记>学习笔记
这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...
- OGG学习笔记02-单向复制配置实例
OGG学习笔记02-单向复制配置实例 实验环境: 源端:192.168.1.30,Oracle 10.2.0.5 单实例 目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1. ...
- python数据分析入门学习笔记
学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...
- 【MarkMark学习笔记学习笔记】javascript/js 学习笔记
1.0, 概述.JavaScript是ECMAScript的实现之一 2.0,在HTML中使用JavaScript. 2.1 3.0,基本概念 3.1,ECMAScript中的一切(变量,函数名,操作 ...
- Linux 学习笔记之超详细基础linux命令 Part 13
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...
- Linux 学习笔记之超详细基础linux命令 Part 8
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 7----------------- ...
- Deep learning with Python 学习笔记(5)
本节讲深度学习用于文本和序列 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所有神经网络一 ...
- 【Redis】命令学习笔记——字符串(String)(23个超全字典版)
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 本篇基于redis 4.0.11版本,学习字符串( ...
- programming-languages学习笔记--第3部分
programming-languages学习笔记–第3部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src ...
- 学习笔记 - 2sat
学习笔记 - 2sat 决定重新启用Markdown--只是因为它支持MathJax数学公式 noip考完,既轻松又无奈,回来慢慢填坑 这篇博客也是拖了好久,通过kuangbin的博客才弄懂2-sat ...
随机推荐
- Java 集合框架Collection
集合容器主要用于保存对象,主要分类有三种List.Set.Map List有序.可重复的集合 常见的List有ArrayList.Vector.LinkedList等类 Set无序.不可重复 常见Se ...
- 全网最适合入门的面向对象编程教程:05 类和对象的Python实现-PyCharm代码标签(一个帮你提升coding效率的小技巧)
摘要: 本文介绍了PyCharm IDE中代码标签的定义.类型和使用方法. 往期推荐: 学嵌入式的你,还不会面向对象??! 全网最适合入门的面向对象编程教程:00 面向对象设计方法导论 全网最适合入门 ...
- 解决方案 | MiKTex SSL connect error code 35
可能是:你的网络屏蔽了需要连接的网站,更换手机流量热点即可解决
- ABC361-D题解
背景 保佑LC能来一中. 题意 给你一个长度为 \(n\) 的初始字符串和目标字符串,都由 W 和 B 两种字符构成. 现在初始字符串末尾接有两个空格字符,每次你可以在该字符串中选出连续两个非空格字符 ...
- 【JavaScript高级03】执行上下文和执行上下文栈
1,函数提升和变量提升 编写以下代码: var a = 3 function fn () { console.log(a) var a = 4 } fn() 上面的JavaScript代码执行结果为一 ...
- odoo 给form表单视图内联列表添加按钮
实践环境 Odoo 14.0-20221212 (Community Edition) 代码实现 模块文件组织结构 说明:为了更好的表达本文主题,一些和主题无关的文件.代码已略去 odoo14\cus ...
- Django 处理http请求之使用session
Django 处理http请求之使用session by:授客 QQ:1033553122 欢迎加入全国软件测试交流群:7156436 测试环境 Win7 Django 1.11 Django提供 ...
- Known框架实战演练——进销存业务单据
本文介绍如何实现进销存管理系统的业务单据模块,业务单据模块包括采购进货单.采购退货单.销售出货单.销售退货单4个菜单页面.由于进销单据字段大同小异,因此设计共用一个页面组件类. 项目代码:JxcLit ...
- Pulsar客户端消费模式揭秘:Go 语言实现 ZeroQueueConsumer
前段时间在 pulsar-client-go 社区里看到这么一个 issue: import "github.com/apache/pulsar-client-go/pulsar" ...
- Jmeter函数助手27-urlencode
urlencode函数用于将字符串进行application/x-www-form-urlencoded编码格式化. String to encode in URL encoded chars:填入字 ...