2-SAT

2-SAT
给定一个布尔方程,判断是否存在一组布尔变量的真值指派使得整个方程为真的问题,称为布尔方程的可满足性问题(SAT)
合取范式:\((a\bigvee b\bigvee \cdots)\bigwedge (c\bigvee d\bigvee \cdots)\bigwedge \cdots\)
其中\(a,b\)称为文字,是一个布尔变量或其否定。符号\(\bigvee\)连接的部分称为子句。如果合取范式每个子句中的文字个数都不超过两个,则对应的SAT问题称为2-SAT问题
虽然SAT问题是NP完全的,但是2-SAT问题可以通过强连通分量,在布尔公式子句数的线性时间内解决。
求解方法
首先,通过逻辑表达式蕴含(\(\Rightarrow\))将每个子句\((a\bigvee b)\)转换成等价形式\((\lnot a\Rightarrow b \bigwedge \lnot b \Rightarrow a)\),这样原来的布尔表达式就变成了将\(a\Rightarrow b\)形式使用\(\bigwedge\)连接起来的形式
对于每个布尔变量,设置两个顶点\(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\) \(A\Rightarrow B\)
true true true
true false false
false true true
false false true
选择布尔变量\(x\)的布尔值时,由于整个表达式为真,\(x\)\(\lnot x\)的布尔值相反,从表格中得到只有\(A\)为假\(B\)为真时满足条件。所以如果\(x\)所在强连通分量的拓扑序在\(\lnot x\)所在的强连通分量的拓扑序之后(\(\lnot x\Rightarrow x\)),则令\(x\)为真,否则(\(x\Rightarrow \lnot x\))令\(x\)为假,可以使得整个布尔表达式为真

德摩根律:\(\lnot{(A\bigwedge B)}=\lnot A \bigvee \lnot B\)
题目中通常给出的是一些矛盾的、不能同时满足的条件,不能直观表现出仅有\(\bigvee\)的形式,但是可以先写出\(\bigwedge\)的形式,再通过德摩根律转化成仅有\(\bigvee\)的形式

模板题:hdu3062 Party

posted @ 2020-08-01 15:15  fxq1304  阅读(86)  评论(0编辑  收藏  举报