個人感受
學習2-SAT最好先掌握一些離散數學方面的知識。
概念
給定一個布爾方程,判斷是否存在一組布爾變量的真值指派使整個方程都爲真的問題稱爲布爾方程的可滿足性問題(SAT)。
SAT問題是NP完全的,但對於滿足一定限制條件的SAT問題,還是能夠有效求解的。
內容
我們看到一個合取範式(a∨b∨……)∧(c∨d∨……)∧……
如果每個子句中的文字都不超過兩個,那麼對應的SAT問題又稱爲2-SAT問題。
我們首先看到每個句子,格式都是(a∨b)
我們可以把它轉換爲等價形式 (¬a→b ∧ ¬b→a)
這裏箭頭爲離散數學中蘊含的意思
那麼整個主合取範式的形式就變爲 ( → )∧( → )∧( → )∧( → )∧……
那麼,箭頭我們看成圖論中的有向邊,箭頭兩端的符號看成圖論中的頂點。
每個變量有兩種形式,即 a 有 a 和 ¬a 兩種形式。
以上面的關係建立有向圖。
該圖中,同一個強連通分量的頂點取值都爲真,如果同一個強連通分量中即存在¬a又存在a,那麼這個必定不是答案,因爲它自相矛盾了。
因爲在同一個強連通分量裏面,意味着一個變量爲真即可推導出強連通分量中的其他變量,但 a 爲真不可能推導出強連通分量中的¬a,故若他們在同一個強連通分量就不可能成立。
我們在tarjan縮點操作中判斷是否有這種矛盾情況。
將縮點後的森林中每條邊反向,按照dfs序進行如下操作:
(初始時所有節點爲無色)
若當前節點未被染色,染成紅色,然後將所有互斥點所在有向子樹中的點全部染成黑色。
否則什麼都不做,繼續處理下一個節點。
(可以證明上述操作不會使同一個節點被染上兩種顏色)
最終所有紅色節點構成解集。
時間複雜度O(n+m)
參考來源
《挑戰程序設計競賽》P324
https://blog.csdn.net/weixin_40676873/article/details/80886145
https://www.cnblogs.com/cjjsb/p/9771868.html