浅谈2-SAT

用处#

n0/1 变量,其之间满足若关系,这些关系本质上可以化成:若 ai0/1,则 aj0/1 的若干命题,2-SAT 就是判断是否能够满足所有命题,并给出一组可行解(n2 可得字典序最小的特解)。

一般解法#

考虑建图,每个变量拆成真假两点,命题可以抽象出若干条如:若 i 则必须 j 形式的 ij 的边。如果 ii 的逆否命题 ¬i 位于同一个强连通分量中,则无解,反之必定存在解,考虑怎么构造一组解。

强连通分量构成的图为一张 DAG,先给出结论:如果 i 所在强连通的拓扑序在 ¬i 的之后,则选 i

感性理解:如果 i 的强连通拓扑序越后,则它能影响到的点更小,显然更优。

具体证明:反证法讨论每种情况,矛盾都很显然,注意抓住建出的图是具有对称性的一点思考。

一般实现为 tarjan 求强连通,注意 tarjan 是 dfs 顺序,相当于一个栈,出栈时顺序会倒一下,所以先到的强连通拓扑序越大。

一些常见建边#

别人有总结,我觉得还是根据选 i 必选 j 的建边原则思考普适性要大一些。

一些题#

题单,Part 1 不讲。

UVA1391 Astronauts#

看似每个人有三个选项,实际上还是两个,所以直接2-SAT,(i,j) 关系不好就是 i¬j,j¬i

P3513 [POI2011]KON-Conspiracy#

发现是一个团(集合内全互相有边)和一个独立集(集合内任意都无边),考虑如果我们知道一组可行解,怎么变成其他解。不难发现,只能从团拿一个元素去独立集、独立集拿一个元素去团、团和独立集交换一对元素三者中选一个进行变换,模拟一下统计能有几种变换即可。

P3825 [NOI2017]游戏#

对于 a,b,c 都是只能选两个值,但是 x 能选三个,这就不满足2-SAT了,但是我们可以枚举 xa,b,c 中哪个来转换成 2-SAT 问题,但是发现 a 包括选 B,Cb 包括选 A,C,已经可以表示出 x 的所有车辆选择了,所以只用 2d 枚举 a,b 中哪个就好了。

建边:对于一组 (i,hi,j,hj) 如果 i 图和 hi 车矛盾,则不建边。反之,如果 j 图与 hj 矛盾,则不可选 hi,所以 i¬i,再反之,ij¬j¬i

posted @   Quick_Kk  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示
主题色彩