[学习笔记] 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 ...
随机推荐
- c 语言学习第三天
字符和字符串 字符 当我们定义了一个字符变量 c 为a时,打印的时候让它使整数形式显示.会出现怎么一个情况? #include<stdio.h> int main(){ char c = ...
- 有数大数据基础平台之智能运维平台EasyEagle介绍:集群队列篇
他来啦,他来啦!大数据基础平台发布会中提到的智能运维平台,他来啦! 作为数据平台的用户们,下述问题一直困扰着我们: 集群资源水位如何,利用率如何,是否需要扩容? 队列为什么最近大量任务出现pendin ...
- Linux 提权-NFS 共享
本文通过 Google 翻译 NFS Share no_root_squash – Linux Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校 ...
- 深入理解 Vue 3 组件通信
在 Vue 3 中,组件通信是一个关键的概念,它允许我们在组件之间传递数据和事件.本文将介绍几种常见的 Vue 3 组件通信方法,包括 props.emits.provide 和 inject.事件总 ...
- 学习 React 需要具备的 JavaScript 知识
学习 React 需要具备的 JavaScript 知识 为什么要学习 React? React 可以与任何其他库或框架无缝集成,因为 React 是一个仅视图库(它是 Model View C on ...
- Jmeter参数化3-正则表达式提取
如果你想要将jmeter上个接口返回的参数值传到下个接口请求参去,可用正则表达式来提取传递 1.首先得到jmeter接口的json返回结果 2.组件路径:线程组->右键添加->后置处理器- ...
- 【RabbitMQ】09 深入部分P2 消费限流 & TTL
1.消费限流设置 就是设置项的2个调整,当然还有前面的手动确认的监听改动处理 https://www.bilibili.com/video/BV15k4y1k7Ep?p=26 2.消息过时设置 TTL ...
- 【H5】15 表单 其四 数据发送
一旦在客户端上验证了表单数据,就可以提交表单了. 并且,由于我们在上一篇文章中介绍了验证,因此我们准备提交! 本文着眼于用户提交表单时会发生什么-数据将流向何处,以及到达表单后如何处理? 我们还将研究 ...
- 从.net开发做到云原生运维(一)——从.net framework过渡到.net core
1. 前言 序篇讲了自己的一些感悟和经历,从这章开始就开始讲一些.net技术栈的东西了. 2. .net framework和.net core对比 .NET Framework 概述 .NET Fr ...
- 决定了,今日起开始准备弃用京东JD
估计京东是为了节约开支,然后开始大比例的把快递物流业务进行外包了,这直接导致服务质量的直线下滑,10多年前我选择弃用当当网而选择京东JD就是因为当时当地的当当网快递是用沈阳晚报的快递上门的,快递员连P ...