[学习笔记] 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 ...
随机推荐
- ASP.NET Core修改CentOS的IP地址
最近做的一个产品中有个需求,就是客户使用的时候可以通过Web网页修改服务器的IP地址(客户是普通使用者,没有Linux使用经验,我们的产品作为一台服务器部署到客户机房,客户通过HTTP方式访问使用). ...
- [oeasy]python0073_进制转化_eval_evaluate_衡量_oct_octal_八进制
进制转化 回忆上次内容 上次了解的是 整型数字类变量 integer 前缀为i 添加图片注释,不超过 140 字(可选) 整型变量 和 字符串变量 不同 整型变量 是 直接存储二进制形 ...
- 如何在 Vue 和 JavaScript 中截取视频任意帧图片
如何在 Vue 和 JavaScript 中截取视频任意帧图片 大家好!今天我们来聊聊如何在 Vue 和 JavaScript 中截取视频的任意一帧图片.这个功能在很多场景下都非常有用,比如视频编辑. ...
- 深入浅出分析最近火热的Mem0个性化AI记忆层
最近Mem0横空出世,官方称之为PA的记忆层,The memory layer for Personalized AI,有好事者还称这个是RAG的替代者,Mem0究竟为何物,背后的原理是什么,我们今天 ...
- LeetCode513. 找树左下角的值
题目链接:https://leetcode.cn/problems/find-bottom-left-tree-value/description/ 题目叙述: 给定一个二叉树的 根节点 root,请 ...
- php8.3开启jit技术
查看是否开启:$jitEnabled = ini_get('jit.enabled'); echo "JIT Enabled: " . ($jitEnabled == '1' ? ...
- 【Java】线程池配置
先看JUC包自带的一个资源 线程池执行器: 初始化参数如下 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( corePo ...
- 【Vue】11 VueRouter Part1 概述 & 入门
什么是路由? 即通过互联网把信息从源地址传输到目的地址的活动 路由决定数据包从来源到目的地的路径 转送将输入端的数据转移到合适的输出端 后端路由: 早起网站开发全部由服务器渲染,例如 Java的JSP ...
- 为什么是Google创造了AlphaGo,而不是其他公司?
相关: Artificial Intelligence | 60 Minutes Full Episodes 答案: Google一直在进行AI方向的探索: Google有足够的算力.
- 如何访问SCI-Hub上的资源?
答案: 使用tor访问.onion网络资源. tor 下载地址: https://www.torproject.org/ 如果不使用tor方式访问可能会无法访问,被提示: