引入

有 \(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的更多相关文章

  1. <老友记>学习笔记

    这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的 ...

  2. OGG学习笔记02-单向复制配置实例

    OGG学习笔记02-单向复制配置实例 实验环境: 源端:192.168.1.30,Oracle 10.2.0.5 单实例 目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1. ...

  3. python数据分析入门学习笔记

    学习利用python进行数据分析的笔记&下星期二内部交流会要讲的内容,一并分享给大家.博主粗心大意,有什么不对的地方欢迎指正~还有许多尚待完善的地方,待我一边学习一边完善~ 前言:各种和数据分 ...

  4. 【MarkMark学习笔记学习笔记】javascript/js 学习笔记

    1.0, 概述.JavaScript是ECMAScript的实现之一 2.0,在HTML中使用JavaScript. 2.1 3.0,基本概念 3.1,ECMAScript中的一切(变量,函数名,操作 ...

  5. Linux 学习笔记之超详细基础linux命令 Part 13

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 12---------------- ...

  6. Linux 学习笔记之超详细基础linux命令 Part 8

    Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 7----------------- ...

  7. Deep learning with Python 学习笔记(5)

    本节讲深度学习用于文本和序列 用于处理序列的两种基本的深度学习算法分别是循环神经网络(recurrent neural network)和一维卷积神经网络(1D convnet) 与其他所有神经网络一 ...

  8. 【Redis】命令学习笔记——字符串(String)(23个超全字典版)

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合). 本篇基于redis 4.0.11版本,学习字符串( ...

  9. programming-languages学习笔记--第3部分

    programming-languages学习笔记–第3部分 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src ...

  10. 学习笔记 - 2sat

    学习笔记 - 2sat 决定重新启用Markdown--只是因为它支持MathJax数学公式 noip考完,既轻松又无奈,回来慢慢填坑 这篇博客也是拖了好久,通过kuangbin的博客才弄懂2-sat ...

随机推荐

  1. yb课堂之分布式应用下登陆校验解决方案 JWT讲解 json wen token 《八》

    什么是JWT? JWT是一个开放标准,它定义了一种用户简介,自包涵的用于通信双方之间以JSON对象的形式安全传递信息的方法.可以使用HMAC算法或者是RSA的公钥密钥进行签名 简单来说:就是通过一定规 ...

  2. go语言的基础语法

    字符串数组 package main import ( "fmt" ) func main() { var str string str = "hello world&q ...

  3. influxdb得导出与导入

    转载请注明出处: 1.备份元数据 基本语法: influxd backup <path-to-backup> 备份元数据,没有任何其他参数,备份将只转移当前状态的系统元数据到path-to ...

  4. 图扑低代码数字孪生 Web SCADA 智慧钢厂

    2024 年 4 月,中国钢铁工业协会发布了<钢铁行业数字化转型评估报告(2023年)>(以下简称<报告>).<报告>指出,绝大部分钢铁企业建立了数字化转型相关管理 ...

  5. [oeasy]python0033_任务管理_jobs_切换任务_进程树结构_fg

    ​ 查看进程 回忆上次内容 上次先进程查询 ps -elf 查看所有进程信息 ps -lf 查看本终端相关进程信息 杀死进程 kill -9 PID 给进程发送死亡信号 运行多个 python3 sh ...

  6. windows中新建文件菜单消失的解决办法

    具体解决办法: https://jingyan.baidu.com/article/cbcede07577f4702f40b4dfd.html 右键中新建文本文件 菜单消失: 注册表编辑器: 路径: ...

  7. MySQL原始密码登录出现错误

    1.首先查看自己的MySQL安装目录下有没有data文件夹,和bin目录是同级的.要是有就删除,然后执行下列操作.没有就直接执行操作: 2. 以管理员身份运行 cmd.遇到个同学,可能我强调的不够明显 ...

  8. php8.3开启jit技术

    查看是否开启:$jitEnabled = ini_get('jit.enabled'); echo "JIT Enabled: " . ($jitEnabled == '1' ? ...

  9. java spring boot 2 开发实战 mybtis 基础部份从搭建到第一个完整测试(从环境到测试用例二部份)

    本案例是java  sping boot  2.2.1 mybtis 基础部份 第一步搭建环境:安装依赖 由于我们公司项目是1.8 环境不能乱,我现在自己的电脑是1.8环境,所以本次整理的boot 代 ...

  10. 全网最适合入门的面向对象编程教程:29 类和对象的Python实现-断言与防御性编程和help函数的使用

    全网最适合入门的面向对象编程教程:29 类和对象的 Python 实现-断言与防御性编程和 help 函数的使用 摘要: 在 Python 中,断言是一种常用的调试工具,它允许程序员编写一条检查某个条 ...