引入

有 \(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. python 自动化神器 多平台纯代码RPA办公自动化python框架

    ​ Pyaibote是一款专注于纯代码RPA(机器人流程自动化)的强大工具,支持Android.Browser和Windows三大主流平台.无论您需要自动化安卓应用.浏览器操作还是Windows应用程 ...

  2. C# 判断字符串是否为整数

    /// <summary> /// 判断一个字符串是否是正整数 /// </summary> /// <param name="s"></ ...

  3. 产品探秘:智影AI——你的创意视频制作神器!

    只需3步,把小说变成视频.免费试用,首次注册赠送600积分. https://icomicai.com/ 在这个快节奏的时代,创意与效率并重成为了我们追求的新风尚.今天,就让我带你一起揭秘一款颠覆传统 ...

  4. 使用 useNuxtData 进行高效的数据获取与管理

    title: 使用 useNuxtData 进行高效的数据获取与管理 date: 2024/7/22 updated: 2024/7/22 author: cmdragon excerpt: 深入讲解 ...

  5. 图灵课堂netty 仿微信开发

    通信的图文示例 以下是需要实现的前端界面, 准备工作:开始实现前需要技术关健字解释 第一步,这儿直接建一个maven 项目 就好,只要是可能用maven 管理包的环境就行,课程使用的版本是 java ...

  6. browsermob-proxy-2.1.4启动失败,报错ProxyServerError: The Browsermob-Proxy server process failed to start

    报错信息:ProxyServerError: The Browsermob-Proxy server process failed to start. Check <_io.TextIOWrap ...

  7. java实现二维码登录功能

    本文采用Springboot工程进行开发,使用Google的zxing生成二维码,直接放代码: <?xml version="1.0" encoding="UTF- ...

  8. ansible 部署hadoop

    规划 ansible 节点 ansible controller 镜像rhel 8.2 镜像ansible hadoop 集群 master slave1 slave2 镜像centos 1810 0 ...

  9. 【CI/CD】Jenkins 部署前后端项目Demo

    前置环境准备: 参考尚硅谷最新发布的Jenkins教程 同样准备了三台服务器: 192.168.124.34 Centos7 8G内存 用于安装GitLab 192.168.124.35 Centos ...

  10. 【Dubbo】构建SpringBoot整合Dubbo的Demo

    参考乐字节的Dubbo教程 https://www.bilibili.com/video/BV19L4y1n7YE Zookeeper单机部署 (Windows) 因为项目需要,这里我自己学习就采用Z ...