1. 程式人生 > >2-SAT問題(白書)

2-SAT問題(白書)

1. 定義

給定一個布林方程,判斷是否存在一組布林變數的真值指派使整個方程為真的問題,被稱為布林方程的可滿足性問題(SAT)。SAT問題是NP完全的,但對於滿足一定限制條件的SAT問題,還是能夠有效求解的。

如果合取正規化的每一個子句中的文字個數不超過兩個,那麼對應的SAT問題可以稱為2-SAT問題。

(ab)¬a 令a為假而b為真,則可以滿足
(a¬b)(bc)(¬c¬a) 令a和b為真,而c為假,則可以滿足

利用強聯通分量分解,可以在布林公式子句數的線性時間內解決2-SAT問題

首先利用(蘊含)將每一個子句

(ab) 改寫成等價的(¬ab)(¬ba)
對於每個布林變數x,構造兩個頂點分別代表x和¬x,以關係為有向邊,建立有向圖。此時,如果a點能夠到達b點,就表示當a為真時b也為真。因此圖中的同一個強聯通分量中的所有布林值均相同。

如果存在某個布林變數x,x¬x均在同一個強聯通分量中,則顯然無法令整個布林公式的值為真。反之,如果不存在這樣的布林變數,那麼對於每個布林變數x,讓

x¬xx

就是使得該公式的值為真的一組適合的布林變數賦值。

2. 題目講解

(1)POJ 3683