2-SAT
给定一个布尔方程,判断是否存在一组布尔变量的真值指派使得整个方程为真的问题,称为布尔方程的可满足性问题(SAT)
合取范式:((aigvee bigvee cdots)igwedge (cigvee digvee cdots)igwedge cdots)
其中(a,b)称为文字,是一个布尔变量或其否定。符号(igvee)连接的部分称为子句。如果合取范式每个子句中的文字个数都不超过两个,则对应的SAT问题称为2-SAT问题
虽然SAT问题是NP完全的,但是2-SAT问题可以通过强连通分量,在布尔公式子句数的线性时间内解决。
求解方法
首先,通过逻辑表达式蕴含((Rightarrow))将每个子句((aigvee b))转换成等价形式((lnot aRightarrow b igwedge lnot b Rightarrow a)),这样原来的布尔表达式就变成了将(aRightarrow b)形式使用(igwedge)连接起来的形式
对于每个布尔变量,设置两个顶点(a)和(lnot a),以(Rightarrow)为边建立有向图。如果从图上的(a)点能够到达(b)点,表示(a)为真时(b)也一定为真,如果同时满足从(b)点能够到达(a)点,表示(b)为真时(a)也一定为真,所以一个强连通分量内的点布尔值相同
所以如果对于任意一个布尔变量,(x)和(lnot x)在同一个强连通分量中,则无法使得整个布尔公式为真。否则,对于每个布尔变量(X),如果(x)所在的强连通分量的拓扑序在(lnot x)所在的强连通分量的拓扑序之后,则令(x)为真,否则令(x)为假,这样就可以找到一组布尔变量的值使得整个布尔表达式为真
逻辑表达式蕴含((Rightarrow)),表示若(A)则(B),也就是(A)成立时(B)必须成立,(A)不成立时(B)可以成立也可以不成立
(A) | (B) | (ARightarrow B) |
---|---|---|
true | true | true |
true | false | false |
false | true | true |
false | false | true |
选择布尔变量(x)的布尔值时,由于整个表达式为真,(x)和(lnot x)的布尔值相反,从表格中得到只有(A)为假(B)为真时满足条件。所以如果(x)所在强连通分量的拓扑序在(lnot x)所在的强连通分量的拓扑序之后((lnot xRightarrow x)),则令(x)为真,否则((xRightarrow lnot x))令(x)为假,可以使得整个布尔表达式为真
德摩根律:(lnot{(Aigwedge B)}=lnot A igvee lnot B)
题目中通常给出的是一些矛盾的、不能同时满足的条件,不能直观表现出仅有(igvee)的形式,但是可以先写出(igwedge)的形式,再通过德摩根律转化成仅有(igvee)的形式
模板题:hdu3062 Party