2-SAT问题相关算法与题目讲解(O(n*m)与O(m))

2-SAT问题 信息学竞赛 OI ACM O(m) O(nm)


2-SAT问题


张天翔

blog.csdn.net/hzoi_ztx
[email protected]


前置技能

  • 拓扑排序
  • 基本逻辑运算
  • 强联通分量

问题模型

给出n个布尔值组成的序列 {Ai} ,给出一些限制,每个限制最多针对两个元素(故称为“2-SAT”),先要求确定 A 序列的值以满足所有限制关系。


问题分析

首先列出7种有意义的限制(其实真正有意义的为5个),如下:

-1: Ai=1
-2: Ai=0
-3: Ai AND Aj=0
-4: Ai OR Aj=1
-5: Ai OR(NOT Aj)=1
-6: Ai XOR Aj=1
-7: Ai XOR Aj=0

所有可能的限制条件如下

01: Ai=1 有意义
02: Ai=0 有意义

03: Ai AND Aj=1(Ai=1)AND(Aj=1)(1)
04: Ai AND Aj=0 有意义
05: Ai AND(NOT Aj)=1(Ai=1)AND(Aj=0)(1,2)
06: Ai AND(NOT Aj)=0(Ai=0)OR(Aj=1)(NOT Ai)OR Aj=1(5)
07: (NOT Ai)AND Aj=105
08: (NOT Ai)AND Aj=006
09: (NOT Ai)AND(NOT Aj)=1(Ai=0)AND(Aj=0)(2)
10: (NOT Ai)AND(NOT Aj)=0(Ai=1)OR(Aj=1)Ai OR Aj=1(4)

11: Ai OR Aj=1 有意义
12: Ai OR Aj=0(Ai=0)AND(Aj=0)(2)
13: Ai OR(NOT Aj)=1 有意义
14: Ai OR(NOT Aj)=0(Ai=0)AND(Aj=1)(1,2)
15: (NOT Ai)OR Aj=113
16: (NOT Ai)OR Aj=014
17: (NOT Ai)OR(NOT Aj)=1(Ai=0)OR(Aj=0)Ai AND Aj=0(3)
18: (NOT Ai)OR(NOT Aj)=0(Ai=1)AND(Aj=1)(1)

19: Ai XOR Aj=1 有意义
20: Ai XOR Aj=0 有意义
21: Ai XOR(NOT Aj)=1Ai XOR Aj=0(7)
22: Ai XOR(NOT Aj)=0Ai XOR Aj=1(6)
23: (NOT Ai)XOR Aj=121
24: (NOT Ai)XOR Aj=022
25: (NOT Ai)XOR(NOT Aj)=1Ai XOR Aj=1(6)
26: (NOT Ai)XOR(NOT Aj)=0Ai XOR Aj=0(7)

实际问题中通常将 {Ai} 序列代表n个物体的选与不选,选则对应布尔值为1。


解决方法

拆点,每个布尔值 Ai 拆成两个点, xi yi ,然后选出一个大小为 n 的点集,使得其满足所有的限制条件(给出的限制条件,以及对应的 xi yi 不能同时在集合中),选择 xi 点代表 Ai=1 (选择此物品),选择 yi 点代表 Ai=0 (不选择此物品)。

若要选择出来一个点集,需要用模型表示限制关系。

建图,图中的一条边 <u,v> 表示选择了 u 点以后必须要选择 v 点。
那么对有意义的七种关系进行建图如下。

-3: Ai AND Aj=0

两条边 xiyj,xjyi

-4: Ai OR Aj=1

两条边 yixj,yjxi

-5: Ai OR(NOT Aj)=1

两条边 xjxi,yiyj

-6: Ai XOR Aj=1

四条边 xiyj,xjyi,yixj,yjxi

-7: Ai XOR Aj=0

四条边 xixj,xjxi,yiyj,yjyi

-1: Ai=1

yi 删掉很暴力,所以一条边 yixi

-2: Ai=0

xi 删掉很暴力,所以一条边 xiyi

(可以看到限制-6可以由限制-3与限制-4组成,限制-7可以由两个限制-5组成,故说真正有意义的为5个)

这样得到了第一个图

算法一

为了满足所有的限制条件(给出的限制条件,以及对应的 xi yi 不能同时在集合中),可以对每一对未确定的 (xi,yi) ,先选其一,并选定对应必须要选的点,如果最后不矛盾,则成功,否则尝试选另一点,若不矛盾则成功,否则无解。

这样做正确性显然,但是时间复杂度 O(nm) ,较高。

算法二

思考,这是一个有向图,而且是“对称”的(也就是说按照上述方式对每一个限制条件建边,如果存在 xixj 必定存在 yjyi ,如果存在 xiyj ,必定存在 xjyi ,如果存在 yixj ,必定存在 yjxi 等等,这些边是“对称”的),如果图中出现一个环,那么这个环上所有点必须同时被选或被不选,而且这个环会有与之对称的一个环(此环上点对应的另一个点在另一个环上,边的连接也相同但是反向)。既然如此,不如强联通分量缩点,并且连边,如果两个点在不同强联通分量,则在这两个强联通分量之间连有向边,与原来的边方向相同,这样,图变成了一个拓扑图,这是第二个图。此时,如果存在一组 (xi,yi) 同时在一个强联通分量中,显然无解;如若不然,一定有解,证明略,按一定方法求解。

将强联通分量称作 Si ,与之对称的连通分量称作 Si 。分析图的性质,对于任意的一对 (Si,Si) Si 的所有后代节点(此点通过有向边连通到的所有点)与 Si 的前代节点(通过有向边连通到此点的所有点)是“对称”的。

若选则某个 Si 中的点,那么所有的 SiSj Sj 都要被选择,而 Si 必定不可选,所有 Si 的前代节点都不可选。那么每次找到一个未确定是否选择的 Si ,选择其所有后代节点,并删除 Si 及其所有前代节点,但每次盲目找一个未被确定的 Si 复杂度较高,可以以自底向上的顺序进行选择与删除,这样就免去了“选择 Si 的所有后代节点”(只用不断删除)。

那么算法流程图:

Created with Raphaël 2.1.0 Start 输入 构建第一个图 缩点形成有向无环图(第二个图) 是否有解? 拓扑排序 自底向上选择、删除 输出 End yes no

时间复杂度 O(m) ,具体实现看例题。


例题


一般2-SAT问题【O(n)】


求字典序最小的方案【O(nm)】

[COGS2443] [HZOI 2016]MC之旅:逃离基友


参考资料

2-SAT问题及其算法

由对称性解2-SAT问题

你可能感兴趣的:(学习-总结,图论-2-SAT)