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=1⇔限制05
08: (NOT Ai)AND Aj=0⇔限制06
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=1⇔限制13
16: (NOT Ai)OR Aj=0⇔限制14
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)=1⇔Ai XOR Aj=0(限制−7)
22: Ai XOR(NOT Aj)=0⇔Ai XOR Aj=1(限制−6)
23: (NOT Ai)XOR Aj=1⇔限制21
24: (NOT Ai)XOR Aj=0⇔限制22
25: (NOT Ai)XOR(NOT Aj)=1⇔Ai XOR Aj=1(限制−6)
26: (NOT Ai)XOR(NOT Aj)=0⇔Ai 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
两条边 xi→yj,xj→yi
-4: Ai OR Aj=1
两条边 yi→xj,yj→xi
-5: Ai OR(NOT Aj)=1
两条边 xj→xi,yi→yj
-6: Ai XOR Aj=1
四条边 xi→yj,xj→yi,yi→xj,yj→xi
-7: Ai XOR Aj=0
四条边 xi→xj,xj→xi,yi→yj,yj→yi
-1: Ai=1
把 yi 删掉很暴力,所以一条边 yi→xi
-2: Ai=0
把 xi 删掉很暴力,所以一条边 xi→yi
(可以看到限制-6可以由限制-3与限制-4组成,限制-7可以由两个限制-5组成,故说真正有意义的为5个)
这样得到了第一个图。
算法一
为了满足所有的限制条件(给出的限制条件,以及对应的 xi yi 不能同时在集合中),可以对每一对未确定的 (xi,yi) ,先选其一,并选定对应必须要选的点,如果最后不矛盾,则成功,否则尝试选另一点,若不矛盾则成功,否则无解。
这样做正确性显然,但是时间复杂度 O(nm) ,较高。
算法二
思考,这是一个有向图,而且是“对称”的(也就是说按照上述方式对每一个限制条件建边,如果存在 xi→xj 必定存在 yj→yi ,如果存在 xi→yj ,必定存在 xj→yi ,如果存在 yi→xj ,必定存在 yj→xi 等等,这些边是“对称”的),如果图中出现一个环,那么这个环上所有点必须同时被选或被不选,而且这个环会有与之对称的一个环(此环上点对应的另一个点在另一个环上,边的连接也相同但是反向)。既然如此,不如强联通分量缩点,并且连边,如果两个点在不同强联通分量,则在这两个强联通分量之间连有向边,与原来的边方向相同,这样,图变成了一个拓扑图,这是第二个图。此时,如果存在一组 (xi,yi) 同时在一个强联通分量中,显然无解;如若不然,一定有解,证明略,按一定方法求解。
将强联通分量称作 Si ,与之对称的连通分量称作 S′i 。分析图的性质,对于任意的一对 (Si,S′i) , Si 的所有后代节点(此点通过有向边连通到的所有点)与 S′i 的前代节点(通过有向边连通到此点的所有点)是“对称”的。
若选则某个 Si 中的点,那么所有的 Si→Sj , Sj 都要被选择,而 S′i 必定不可选,所有 S′i 的前代节点都不可选。那么每次找到一个未确定是否选择的 Si ,选择其所有后代节点,并删除 S′i 及其所有前代节点,但每次盲目找一个未被确定的 Si 复杂度较高,可以以自底向上的顺序进行选择与删除,这样就免去了“选择 Si 的所有后代节点”(只用不断删除)。
那么算法流程图:
时间复杂度 O(m) ,具体实现看例题。
[COGS2443] [HZOI 2016]MC之旅:逃离基友
2-SAT问题及其算法
由对称性解2-SAT问题