若是你不知道什麼是sat問題,請看如下問答.html
Q:sat問題是什麼?
A:首先你有n個布爾變量,而後你有一個關於這n個布爾變量的布爾表達式,問你,若是讓你隨意給這n個布爾變量賦值,這個布爾表達式可否成立.
Q:k-sat是什麼意思?
A:把sat問題中的布爾表達式不斷進行轉化,直到變爲一個由與鏈接的若干個[由或鏈接的若干個(布爾變量或被非運算了的布爾變量)],那麼全部的[]中()的數量的最大值爲k.
Q:怎麼轉化布爾表達式?
A:按照 !(a||b) -> (!a)&&(!b) , !(a&&b) -> (!a)||(!b) , (a&&b)||c -> (c||a)&&(c||b) 的法則來轉化.
Q:爲何k>2的時候的k-sat問題是NPC問題?
A:我也不知道啊……編碼
如今,你已經知道了什麼是sat問題,那什麼是2-sat問題呢?
結合以上定義,樸素地說,就是,你有n個布爾變量,而且對於這n個布爾變量,你有若干個二元或者一元限制,問你可否給這n個布爾變量賦值,使得全部的限制知足.
對於2-sat問題,有時候咱們不單單要問可否成立,還要詢問方案,而如今解決2-sat相關問題的流行作法,就是建圖.
建圖的話,就是把每一個布爾變量拆成兩個點,一個表示true,一個表示false,而且按照要求的限制,在這些點中連有向邊,a->b表示若a則b.
當限制爲一元的時候,就是肯定了某個布爾變量的值,這個時候,對於這個布爾變量在圖上的兩個點,假設肯定的值對應的點爲a,另外一個點爲b,那咱們連b->a.
當限制爲二元的時候,就是兩個布爾變量之間的限制,因此這兩個布爾變量要相互連邊.
當建完圖以後,咱們能夠採起dfs或者Tarjan,來進行相關操做..net
具體建圖與操做還有不少……
有關sat問題的更多信息:
https://blog.csdn.net/seaskying/article/details/51726217
有關2-sat問題的相關操做的更多信息:
https://wenku.baidu.com/view/afd6c436a32d7375a41780f2.html
https://wenku.baidu.com/view/0f96c3daa58da0116c1749bc.html
https://www.cnblogs.com/-ZZB-/p/6635483.html
有關建圖的更多信息:
COGS 313. [POI2001] 和平委員會
bzoj 2199: [Usaco2011 Jan]奶牛議會
bzoj 1997: [Hnoi2010]Planar
UOJ #210.【UER #6】尋找罪犯
LOJ #6036.「雅禮集訓 2017 Day4」編碼3d