首页 > 其他分享 >2-SAT 学习笔记

2-SAT 学习笔记

时间:2024-04-06 23:22:58浏览次数:16  
标签:序小 连边 拓扑 笔记 学习 如果 取值 SAT

2-SAT 学习笔记

P4782 【模板】2-SAT

2-SAT 问题模型:构造 bool 变量 \(x_1,x_2...x_n\),使得满足一些限制一对 \(x_1\) 和 \(x_2\) 取值的条件合法。

很显然根据 Floyd 传递闭包可以做到 \(O(n^3+m)\),但不太行。

有 \(O(n+m)\) 的做法,发现对于每个条件是要我们选择一种取值(选择就很缥缈),我们考虑转换为一些定性的限制条件(更为直接一些)。

因为每个点只有两种取值,所以对每个限制考虑分类讨论,拿 \(x_7\) 为假或 \(x_2\) 为假举例。

如果 \(x_7\) 取假,那么对 \(x_2\) 没有限制。如果 \(x_7\) 取真,那么 \(x_2\) 就必须取假。所以把他转换到图论模型,对 \(x_2\) 和 \(¬x_7\) 连边。同理,对 \(x_7\) 和 \(¬x_2\) 连边,边的含义就是如果取了 \(u\),那就必须取 \(v\)。

考虑无解的情况,很显然,如果一个 \(x_i\) 我们钦定它是 \(1\),但是发现推了一圈回来以后发现是 \(0\),那就产生了矛盾,那说明 \(x_i=1\) 是不可取的。

回到我们建出来的图上,实际就是如果 \(x_i\) 可以走到 \(¬x_i\) 且 \(¬x_i\) 能走到 \(x_i\) 那就是无解。

容易发现,他们是在一个强连通分量里面的,因为他们可以互相抵达。

所以我们只用对建出来的图跑一个缩点即可,如果 \(x_i\) 和 \(¬x_i\) 在一个强连通分量里面,那必然无解。

那考虑有解的情况的构造。

缩完了点以后,我们发现,拓扑序小的点一定是可以一层一层往里面推出来拓扑序大的点的答案,反之不行。

原因是如果你选择了拓扑序大的话,拓扑序小的点所在的那个环,其实就不能被更新到了。

但是 Tarjan 搞出来的拓扑序恰好的倒序的,因为他是个 dfs,是自下而上的找到 SCC,所以标号大的才是拓扑序小的点。

具体实现是要开 \(2n\) 个点来表示 \(0/1\) 的取值。

如果是 \(a \oplus b\),那显然是如果 \(a\) 取了 \(1\),\(b\) 只能取 \(0\),显然 \(a\) 和 \(¬b\) 连边, \(b\) 和 \(¬a\) 连边。

如果是 $a \land b $,如果 \(a\) 取了 \(0\),必然矛盾,所以 \(¬a\) 和 \(a\) 连边直接让他矛盾掉。

在实际问题里面,可以转换成一个点的选/不选成为 \(0/1\) 的变量,单独对每个点和每个限制考虑,这是两种不一样的思路。

标签:序小,连边,拓扑,笔记,学习,如果,取值,SAT
From: https://www.cnblogs.com/JuneFailue/p/18118170

相关文章

  • [笔记]数位dp例题及详解(更新中)
    数位dp的定义引自洛谷日报#84:求出在给定区间\([L,R]\)内,符合条件\(f(i)\)的数\(i\)的个数。条件\(f(i)\)一般与数的大小无关,而与数的组成有关。由于是按位dp,数的大小对复杂度的影响很小。由于数位dp状态的上下文信息比较多,所以一般用记忆化搜索实现,而非递推。P4999烦人的数......
  • 第七周后端学习报告
    CJT的学习报告 本周学习及进展 AOPLogback自定义注解 具体进展使用这三个技术栈实现了日志框架日志框架github地址:cjt666-hhh/sosdDemo(github.com)首先使用AOP技术进行解耦,使得日志框架能够灵活配置到多个方法以及接口,后续对于对于日志框架维护成本降低,仅需修......
  • 吴恩达机器学习-第一周
    吴恩达机器学习-第一周学习视频参考b站:吴恩达机器学习本文是参照视频学习的随手笔记,便于后续回顾。机器学习定义Fieldofstudythatgivescomputerstheabilitytolearnwithoutbeingexplicitlyprogrammed.--ArthurSamuel(1959)编译了跳棋程序,程序自己下棋迭代。Que......
  • SpringBoot学习笔记
    SpringBoot一、SpringBoot3介绍1.1SpringBoot3简介课程使用SpringBoot版本:3.0.5https://docs.spring.io/spring-boot/docs/current/reference/html/getting-started.html#getting-started.introducing-spring-boot到目前为止,你已经学习了多种配置Spring程序的方式。......
  • CSS学习归纳3
        在上一节CSS学习归纳2中我们讨论了选择器的使用、块级行级元素的转化使用以及背景的设置。本节将在上述学习的基础上对CSS的特性、盒子的边框,内外边距等性质加以归纳。并且最后会做一个综合的案例,并附上代码。一、CSS的三大特性1.1CSS的三大特性---层叠性  ......
  • 矩阵乘法学习笔记
    可以用来加速dp,解决值域大的问题。$\text{Examples:}$P1962斐波那契数列和某个入门题很像,但值域扩大到了$[1,2^{63})$,当然不能暴力求解,考虑把$f_{n}$和$f_{n-1}$当成向量写在一起:\(\begin{bmatrix}f_{n}\\f_{n-1}\end{bmatrix}\),然后找出使下列等式......
  • c++算法学习笔记 (20) 哈希表
    1.模拟散列表//拉链法#include<bits/stdc++.h>usingnamespacestd;constintN=100003;inth[N];inte[N],ne[N],idx;//存链voidinsert(intx){intk=(x%N+N)%N;//让负数的余数变成正数(若直接加N,则可能溢出)e[idx]=x;ne[idx]......
  • c++算法学习笔记 (21) STL
    1.vector:        变长数组,倍增的思想        size()返回元素个数        empty()返回是否为空        clear()清空        front()/back()元素        push_back()/pop_back()        begin()/end()迭代器 ......
  • c++算法学习笔记 (19) 堆
    1.堆排序:(1)插入一个数:heap[++size]=x;up(size);//在最后插入,再往上移(2)求集合中最小值:heap[1](3)删除最小值:swap(heap[1],heap[size]);size--;down(1);//将最小值移到最后直接删除,再将heap[1]下移到合适位置(4)删除任意一个元素:swap(heap[k],heap[size]);size--;down(1)orup(1);/......
  • 毅四捕Go设计模式笔记——桥接模式
    桥接模式(BridgePattern)桥接模式是一种结构型设计模式,它的主要目的是将抽象部分与它的实现部分解耦,使它们都可以独立的变化。通过使用组合而非继承的方式,桥接模式结合了两个独立的维度,让它们可以独立扩展而不是在两者之间建立静态的继承关系。为了解决什么问题?桥接模式解......