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

【学习笔记】2-SAT

时间:2023-04-23 21:37:28浏览次数:45  
标签:lor lnot 连边 命题 笔记 学习 枚举 成立 SAT

适应性问题

存在若干命题 \(p_i\),以及若干形如 \(x_{k_1}\lor x_{k_2}\lor\dots\lor x_{k_n}\) 的 \(s_k\),其中 \(x_i\) 为 \(p_i\) 或 \(\lnot p_i\) 其中一个。

要求是否存在一个命题的取值集合使得条件 \(s\) 均成立,其中每个条件最多包含 \(n\) 个命题,这样的问题称为 n-SAT 问题,\(n\ge 3\) 的情况已被证明为 NP-complete 问题。

图论建模

考虑单个条件 \(p_i\lor p_j\),这意味这 \(\lnot p_i\Rightarrow p_j,\lnot p_j\Rightarrow p_i\),即如果其中一个命题不成立,那么为保证条件成立,另一命题必须成立。

考虑按照这种“逻辑推理”的方式连有向边,那么如果存在路径使得 \(p_i\) 可达 \(\lnot p_i\),则 \(p_i\) 一定不成立,更进一步说,如果 \(p_i\) 和 \(\lnot p_i\) 在同一强连通分量中,则一定没有合法解。

这个过程用 Tarjan 来实现。

对于其他形式的条件,也可以建出模型,主要就是一个若 A 则 B 的连边过程。

而如果钦定 \(p_i\) 一定成立,实际就是 \(\lnot p_i\) 一定不成立,因此连边 \(\lnot p_i\to p_i\) 即可。

由于命题与其逆否命题的真假性相同,我们若 A 则 B 的连边同样一定可以连出若非 B 则非 A 的连边。

求一组合法解

在判断有解基础上,我们得到一个 DAG,而如果 \(p_i\) 成立,其必要条件是 \(p_i\) 不可达 \(\lnot p_i\),换言之如果 \(p_i\) 对应强连通分量的拓扑序在 \(\lnot p_i\) 之后,则 \(p_i\) 本身一定成立。

考虑证明这样单独考虑后全局也是合法的,设已知拓扑序有 \(t_{p_i}>t_{\lnot p_i},t_{p_j}>t_{\lnot p_j}\),假设 \(p_i\) 可达 \(\lnot p_j\),可知 \(t_{\lnot p_i}<t_{p_i}\le t_{\lnot p_i}\),由连边的对称性得 \(p_j\) 同样可达 \(\lnot p_j\),于是 \(t_{\lnot p_j}\le t_{p_j}<t_{\lnot p_i}\),二者矛盾。故全局合法。

实际上不需要拓扑排序,因为我们本质是要知道是否可达,而如果存在强连通分量外的边 \((u,v)\),而 \(v\) 先弹出,则 \(v\) 所在强连通分量的编号更小,相当于反向拓扑。所以只需要判断 \(p_i\) 强连通分量编号是否比 \(\lnot p_i\),如果是则取 \(p_i\),反之取 \(\lnot p_i\)。

例题

洛谷-P5782 [POI2001] 和平委员会

模板题,直接建模即可。

洛谷-P3825 [NOI2017] 游戏

如果不存在 \(x\) 类型,则可以每个命题只有真与假,正常建模可以求出答案。

如果枚举钦定 \(x\) 类型的选取方案,复杂度是 \(O(3^d(n+m))\),不能通过。

注意到枚举选取方案是小题大做的,因为我们的处理范围是剩下两个选择,因此可以改为枚举不选那个,这样枚举不选 A 或不选 B 两种,对于单个来说就覆盖了三种选择情况,即可以覆盖所有可能,复杂度是 \(O(2^d(n+m))\)。

参考资料

标签:lor,lnot,连边,命题,笔记,学习,枚举,成立,SAT
From: https://www.cnblogs.com/SoyTony/p/Learning_Notes_about_2-Satisfiblity.html

相关文章

  • 动手深度学习pytorch 5-7章
    深度学习计算1.块提供的基本功能:1.输入数据作为前向传播函数的参数2.通过前向传播函数生成输出3.计算其输出关于输入的梯度4.存储和访问前向传播计算所需的参数5.根据需要初始化模型参数2.Sequential类1.将块逐个追加到列表中的函数......
  • 深度学习--卷积神经网络基础
    深度学习--卷积神经网络基础1.卷积操作卷积操作简单来说就是矩阵对应位置相乘求和,这样不仅可以减少模型的参数数量,还可以关注到图像的局部相关特性。importtorchimporttorch.nnasnnimporttorch.nn.functionalasF#卷积操作(Input_channel:输入的通道数,kernel_channel......
  • Java学习笔记(四)
    1、break、continue、return的区别(1)break常在switchcase中使用,也可以在循环中使用。作用:当遇到break,则结束当前整个switchcase语句或者当前整个循环。执行外面语句。(2)continue:只能在循环中使用。作用是结束当前这一次循环,执行下一次循环。(3)return:在方法中使用,作用是结束当前......
  • JS课堂笔记(4.17-4.21)
    一、循环 1.在程序中,一组被重复执行的语句被称为循环体,能否继续重复执行,取决于循环的终止条件。由循环体及循环的终止条件组成的语句,被称为循环语句。2.循环执行的过程是①第一次循环:第一次赋值,然后条件判断,执行循环体,最后执行累计。②非第一次循环:条件判断,执行循环体,最后执行......
  • 《综述图论中连通性及相关问题的一些处理方法》笔记
    基本概念边/点割集:若边集\(E'\)使得割掉这些边之后\(u\tov\)不连通,则\(E'\)是\((u,v)\)的边割集。类似地定义点割集。边/点连通度:若任意\((u,v)\)的割集大小都至少是\(s\),则\(u,v\)是\(s-\)边连通的。类似地定义点连通度。Menger定理:\(u\tov\)的边连通......
  • C51笔记-郭天祥-第二章 从点灯大师开始
    第2章  Keil软件的使用及流水灯设计 Keil的用法:用Keil建立工程;            工程配置;            C51单片机程序软件仿真、单步、全速、断点设置和变量查看等; 用一个完整的C51程序操控LED亮灭;调用库函数实现流水灯;蜂鸣器与继电器的操作方法,集......
  • Halcon基础学习(一)
    Halcon基础学习(一)初见目标:提取出U4的位置坐标结果:编程逻辑读取图片按照RGB3通道处理图片使用中值滤波使用灰度滤波使用二值化滤波组件区域分割使用特征直方图设置上下限直到过滤到唯一一个以后,使用区域选择工具在新打开的图片上面绘制十字叉......
  • Django笔记二十九之中间件介绍
    本文首发于公众号:Hunter后端原文链接:Django笔记二十九之中间件介绍这一节介绍一下Django的中间件。关于中间件,官方文档的解释为:中间件是一个嵌入Django系统的request和response的钩子框架,是一个能够全局改变Django输入/输出的系统。我们可以这样理解,一个request......
  • XML学习
    XML学习什么是XML?XML指可扩展标记语言(ExtensibleMarkupLanguage)。XML是一种很像HTML的标记语言。XML的设计宗旨是传输数据,而不是显示数据。XML标签没有被预定义。您需要自行定义标签。XML被设计为具有自我描述性。XML是W3C的推荐标准。XML和HTML之间的差异XML不......
  • 个人对于二分图匹配的学习记录
    二分图匈牙利算法下面展示的是dfs实现的写法。//洛谷P3386二分图最大匹配匈牙利算法#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1505;constintM=50005;inthead[N],eid;structEdge{ intv,w,next;}e[M<<1];v......