2-SAT超入门讲解
Preface
说实话2-SAT的题目我都没怎么做过,所以这里讲的都是些超入门什么的
还有一些板子题,由于是暑假的时候学的所以有些我也记不清了
主要学习参考自:Manchery的课件&&dalao's blog&&Another dalao
What is 2_SAT?
SAT是适定性(Satisfiability)问题的简称 。一般形式为k-适定性问题,简称 k-SAT。
可以证明,当时,k-SAT是NP完全的。因此一般讨论的是的情况,即2-SAT问题。
我们通俗的说,就是给你个变量,每个变量能且只能取的值。同时给出若干条件,形式诸如,其中表示中的一种
而求解2-SAT的解就是求出满足所有限制的一组
Change 2-SAT into Graph Theory
首先我们考虑将2-SAT问题往图论的方向靠,我们发现每个点要么取,要么取。因此对于,我们建两个点与分别表示取和
然后我们考虑建边来表示这些关系,我们令一条有向边的意义:表示如果选择了就必须选
那么我们可以举一些简单的例子来总结下连边的规律(用表示的反面):
- 不能同时选:选了就要选,选就要选。故。一般操作即为
- 必须同时选:选了就要选,选就要选。故。一般操作即为
- 任选(但至少选一个)选一个:选了就要选,选就要选,选就要选,选就要选。故。一般操作即为
- 必须选:直接,可以保证无论怎样都选。一般操作为给出的或
建好图然后就是考虑怎么用图论的方式解决2-SAT了。
How to solve 2-SAT——DFS
- 对于每个当前不确定的变量,令然后沿着边DFS访问相连的点。
- 检查如果会导致任意一个与都被选,那么撤销。否则令
- 否则令,重复2。如果还不行就无解。
- 继续考虑下一个不确定的变量
这样的话正确性显然,由于这里的DFS涉及到全局,因此复杂度是的。
一般情况下已经很优秀了,而且还可以改进:
只需要在DFS之前判断能否走到就可以省略撤销标记的过程,所以我们可以bitset优化传递闭包做到预处理,然后就可以的DFS了。
这种做法还可以保证解的字典序,有时不失为一种不错的方法。
How to solve 2-SAT——SCC
考虑我们上面的判断有无解的情况,我们想到完全可以借助SCC来判断两个点是否互相到达。
那么我们先缩点,如果与在同一SCC里那么显然无解。
否则选择与中拓扑序较大的一个就可以得到一组可行解。
不是很常用(主要是一般题目的数据范围都不需要),用来判可行性比较好。
两道例题
- HDU 3062Party 2-SAT建图后判断可行性即可。
- HDU 1814Peaceful Commission 2-SAT建图后求字典序最小解,就用DFS的方法不预处理也可以过。
Postscript
这真的是一篇超入门博客,没有涉及特别多的难点以及姿势。
像数据结构优化建图我是肯定不会的啦,最后推荐一道比较有难度的2-SAT好题:Luogu P3825 [NOI2017]游戏&&Sol
__EOF__

本文链接:https://www.cnblogs.com/cjjsb/p/9771868.html
关于博主:复活的ACM新生,目前爱好仅剩Gal/HBR/雀魂/单机/OSU
版权声明:转载请注明出处
声援博主:欢迎加QQ:2649020702来DD我
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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】