浅谈2-SAT
用处#
给 个 变量,其之间满足若关系,这些关系本质上可以化成:若 为 ,则 为 的若干命题,2-SAT 就是判断是否能够满足所有命题,并给出一组可行解( 可得字典序最小的特解)。
一般解法#
考虑建图,每个变量拆成真假两点,命题可以抽象出若干条如:若 则必须 形式的 的边。如果 与 的逆否命题 位于同一个强连通分量中,则无解,反之必定存在解,考虑怎么构造一组解。
强连通分量构成的图为一张 DAG,先给出结论:如果 所在强连通的拓扑序在 的之后,则选 。
感性理解:如果 的强连通拓扑序越后,则它能影响到的点更小,显然更优。
具体证明:反证法讨论每种情况,矛盾都很显然,注意抓住建出的图是具有对称性的一点思考。
一般实现为 tarjan 求强连通,注意 tarjan 是 dfs 顺序,相当于一个栈,出栈时顺序会倒一下,所以先到的强连通拓扑序越大。
一些常见建边#
别人有总结,我觉得还是根据选 必选 的建边原则思考普适性要大一些。
一些题#
题单,Part 1 不讲。
UVA1391 Astronauts#
看似每个人有三个选项,实际上还是两个,所以直接2-SAT, 关系不好就是 。
P3513 [POI2011]KON-Conspiracy#
发现是一个团(集合内全互相有边)和一个独立集(集合内任意都无边),考虑如果我们知道一组可行解,怎么变成其他解。不难发现,只能从团拿一个元素去独立集、独立集拿一个元素去团、团和独立集交换一对元素三者中选一个进行变换,模拟一下统计能有几种变换即可。
P3825 [NOI2017]游戏#
对于 都是只能选两个值,但是 能选三个,这就不满足2-SAT了,但是我们可以枚举 是 中哪个来转换成 2-SAT 问题,但是发现 包括选 , 包括选 ,已经可以表示出 的所有车辆选择了,所以只用 枚举 中哪个就好了。
建边:对于一组 如果 图和 车矛盾,则不建边。反之,如果 图与 矛盾,则不可选 ,所以 ,再反之, 且 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探