推薦部落格:【研究總結】2-sat問題
現在有n個集合,每個集合裡有一些元素。
現在要求從每個集合裡選出乙個元素,並且兩兩集合選出的元素有限制……
記乙個集合裡最多有k個元素,那麼這個問題稱作k-sat問題。
k=2即是2-sat問題,是有價值討論的問題。
當k>=3時,被證明是np完全問題,是無法在多項式複雜度內求解的。
poj上的一道裸題。
有n個未知數x,值只能是0或1。
現在給出若干限制如:
1.x[a] and x[b] = 0
2.x[a] and x[b] = 1
3.x[a] or x[b] = 0
4.x[a] or x[b] = 1
5.x[a] xor x[b] = 0
6.x[a] xor x[b] = 1
問是否有解?
按某大神所說,2-sat就是乙個在圖上暴力的玩意兒。
首先拆點,每個未知數拆成2個點,乙個代表0,乙個代表1。
很明顯滿足之前所說的,就是每組必須選乙個點。
定義一條有向邊a->b的意義為選了a就必須選b,逆命題是不選b就不選a。
設把x拆成了x0,x1,y拆成了y0,y1
x0,y0分別表示原來的x,y選0, x1,y1分別表示原來的x,y選1。
以x and y = 0為例.
則選了x1就必須選y0,選了y0就必須選x1.
所以按規則連邊.
如果x and y = 1
則一定不能選x0,y0
且選了x1,就必須選y1,選了y1,也必須選x1.
後者照樣連邊。
前者連x0->x1,y0->y1,至於這樣做為什麼是對的可以從後面的判斷方法和求解方法得到答案。
對於其它的位運算,可以得到類似的連法。
判斷方法:
1.如果圖中有x0和x1在乙個強聯通分量裡,顯然無解。因為x0,x1必須選乙個,而選了乙個就會選另外乙個。
2.如果對於任意的x0,x1都不在乙個強聯通分量裡,則至少有一組解。證明可以從後面的求解方法得到。
求解方法:
將每乙個強連通分量縮環,建個turpo序,然後倒著這樣做:
對於當前的點x,如果它沒有被標記為不可選,則把它標記為選了,注意x是縮環以後的點,把x環上面的點的相反點全部標記為不可選,一直這樣做就可以得到一組解了。
正確性?
假設有x0能走到x1,那麼我只能選擇x1,而不能選擇x0.
turpo倒序以後,我一定是到x1,並且x1一定不會被標記為不可選,然後x1標記為選了,再把x0標記為不能選。
這個**全是口胡,如果想知道具體的證明,還是看文章開頭推薦的那篇部落格吧。
這題好像是51nod 上2-sat專題裡的唯一的一道題,後一篇部落格會講。
2 SAT階段性學習小記
sat就是satisfiability,適定性,即是否有滿足所有條件的情況。一般來說2 sat問題就是 給定一堆集合,大小為2,每個集合必須且最多取乙個,不同集合間的不同元素有一些約束條件,通常表現為and or xor not等形式,通過進行構圖,跑2 sat演算法解決。從題目入手 題目大意 一國...
模板 2 SAT 問題 2 SAT
2 sat 問題 模板 有n個布林變數 x 1 x n 另有m個需要滿足的條件,每個條件的形式都是 x i 為true false或 x j 為true false 比如 x 1 為真或 x 3 為假 x 7 為假或 x 2 為假 2 sat 問題的目標是給每個變數賦值使得所有條件得到滿足。輸入格式...
2 SAT學習筆記
由對稱性解2 sat問題 2 sat解法 上面兩篇 很清楚的介紹了什麼是2 sat以及一些原理演算法 2 sat問題是圖論中乙個比較有意思的問題,重點是建圖,對於邊的意思,就是如果你選了i,就必須選j。2 sat問題有個很明顯的地方就是對於每個i,i包含兩個點,i表示選第乙個點,i 表示選第二個點,...