隐藏页面特效

2-SAT超入门讲解

Preface

说实话2-SAT的题目我都没怎么做过,所以这里讲的都是些超入门什么的

还有一些板子题由于是暑假的时候学的所以有些我也记不清了

主要学习参考自:Manchery的课件&&dalao's blog&&Another dalao


What is 2_SAT?

SAT是适定性(Satisfiability)问题的简称 。一般形式为k-适定性问题,简称 k-SAT。

可以证明,当k>2时,k-SAT是NP完全的。因此一般讨论的是k=2的情况,即2-SAT问题。

我们通俗的说,就是给你n个变量ai,每个变量能且只能0/1的值。同时给出若干条件,形式诸如(not)aiopt(not) aj=0/1,其中opt表示and,or,xor中的一种

而求解2-SAT的解就是求出满足所有限制的一组a


Change 2-SAT into Graph Theory

首先我们考虑将2-SAT问题往图论的方向靠,我们发现每个点要么取0,要么取1。因此对于ai,我们建两个点2i12i分别表示ai01

然后我们考虑建边来表示这些关系,我们令一条有向边的意义:xy表示如果选择了x就必须选y

那么我们可以举一些简单的例子来总结下连边的规律(用i表示i的反面):

  • i,j不能同时选:选了i就要选j,选j就要选i。故ij,ji。一般操作即为aixoraj=1
  • i,j必须同时选:选了i就要选j,选j就要选i。故ij,ji。一般操作即为aixoraj=0
  • i,j任选(但至少选一个)选一个:选了i就要选j,选j就要选i,选i就要选j,选j就要选i。故ij,ji,ij,ji。一般操作即为aioraj=1
  • i必须选:直接ii,可以保证无论怎样都选i。一般操作为给出的ai=1aiandaj=1

建好图然后就是考虑怎么用图论的方式解决2-SAT了。


How to solve 2-SAT——DFS

  1. 对于每个当前不确定的变量ai,令ai=0然后沿着边DFS访问相连的点。
  2. 检查如果会导致任意一个jj都被选,那么撤销。否则令ai=0
  3. 否则令ai=1,重复2。如果还不行就无解。
  4. 继续考虑下一个不确定的变量

这样的话正确性显然,由于这里的DFS涉及到全局,因此复杂度是O(n(n+m))的。

一般情况下已经很优秀了,而且还可以改进:

只需要在DFS之前判断i能否走到i就可以省略撤销标记的过程,所以我们可以bitset优化传递闭包做到O(n3w)预处理,然后就可以O(n+m)的DFS了。

这种做法还可以保证解的字典序,有时不失为一种不错的方法。


How to solve 2-SAT——SCC

考虑我们上面的判断有无解的情况,我们想到完全可以借助SCC来判断两个点是否互相到达。

那么我们先缩点,如果ii在同一SCC里那么显然无解。

否则选择ii拓扑序较大的一个就可以得到一组可行解。

不是很常用(主要是一般题目的数据范围都不需要),用来判可行性比较好。


两道例题

HDU3062&&HDU1814 sol


Postscript

这真的是一篇超入门博客,没有涉及特别多的难点以及姿势。

数据结构优化建图我是肯定不会的啦,最后推荐一道比较有难度的2-SAT好题:Luogu P3825 [NOI2017]游戏&&Sol


__EOF__

本文作者hl666
本文链接https://www.cnblogs.com/cjjsb/p/9771868.html
关于博主:复活的ACM新生,目前爱好仅剩Gal/HBR/雀魂/单机/OSU
版权声明:转载请注明出处
声援博主:欢迎加QQ:2649020702来DD我
posted @   空気力学の詩  阅读(22868)  评论(12编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示