2-sat 講解


poj 3207 http://blog.sina.com.cn/s/blog_64675f540100k13v.html

poj 3678 http://blog.sina.com.cn/s/blog_64675f540100k15b.html

poj 3683 http://blog.sina.com.cn/s/blog_64675f540100k1cd.html

poj 3648 http://blog.sina.com.cn/s/blog_64675f540100k1g9.html

poj 2723 http://blog.sina.com.cn/s/blog_64675f540100k2rh.html

poj 2749 http://blog.sina.com.cn/s/blog_64675f540100k2xf.html

最近花了幾天的時間做掉了PKU上的六道2-sat的題目,有幾題比較簡單,構圖完成套模板就是了,有兩題需要二分答案,有寫題目構圖容易出錯,總之收獲良多。

不懂2-sat的朋友推薦在Google上搜索“2-sat”,應該能找到《由對稱性解2-SAT問 題》(伍昱的WC論文)、《2-SAT解法淺析》(趙爽)這兩篇很好的論文,最好把它們讀一讀,起碼可以對2-SAT模型有個初步了解和認識。關於這個模 型的概念和意義我就不詳細解說了,還是和上一遍后綴數組的學習心得一樣,我這里只是把我的一些心得體會寫出來和大家分享,如果有錯大家可以指出。

一、關於模型:

一個2-SAT模型應該是一個滿足以下的條件的滿足性問題:

1、該模型中存在2n個可以分成n組的元素,每組兩個元素。

2、每組元素中,選擇了其中一個元素,另外一個元素就不能被選擇。這兩個元素記為a和!a。

3、該模型中的元素之間存在一些關系,且這些關系是對稱的。(除非是同一組元素中的關系,這些關系限定了“必須選擇”該組中的某一個元素,可能單獨出現)

滿足上述條件,要求在滿足給定關系的情況下在每組元素中選出一個元素的問題稱為2-SAT問題。問是否存在即2-SAT判定問題,當然也可以求出一組可行解。

(上面的關於2-SAT的定義是非常不嚴謹不專業的,僅為幫助大家理解..可能有錯,望大家指出..)

當你看見一道題目,一些事物只有唯一且互斥的兩種選擇(比如兩種取值,兩種連接方式等等),那么可以分析下題目給出的條件是否滿足對稱性,若滿足則可通過構圖將題目轉化成2-SAT問題了。

二、關於構圖

要解2-SAT問題或者完成判定問題,首要的任務是構圖。從《由對稱性解2-SAT問題》這篇論文里,我們可以知道,構圖的關鍵是找到沖突(如 第二道題)

若a和b沖突,即選a時不能選b,那么選a時必須選!b(因為不選b就必須選!b,這是一個2-SAT問題必須滿足的條件),那么我們就連邊<a,!b>。同樣的道理,如果選了b,那么就不能選a,必須選!a,所以連邊<b,!a>。這樣的連邊,顯然是對稱的。具體的例子可以看上面的論文。

總之,弄清楚一點:如果存在邊<a,b>,那么表示選擇a時必須選擇b。只要將所有這種“必須”關系都變成邊,然后再判定2-sat或者求解2-sat,就能解決2-SAT問題了。

三、關於解2-SAT

方法是,對原圖求一次強連通分量,然后看每組中的兩個點是否屬於同一個強連通分量,如果存在這種情況,那么無解

然后對於縮點后的圖G',我們將G'中所有邊轉置。進行拓撲排序。
   對於縮點后的所有點,我們先預處理求出所有沖突頂點。例如縮點后Ai所在強連通分支的ID
   為id[ Ai] ,同理~Ai在 id[ ~Ai ],所以沖突頂點
    conflict[ id[Ai] ]=conflict[ id[~Ai] ];
同理conflict[ id[~Ai] ]=conflict[ id[Ai] ];

    設縮點后有Nscc個點。
    然后對拓撲序進行染色,初始化所有點color均為未着色
    順序遍歷得到的拓撲序列,對於未着色的點x,將x染成紅色,同時將所有與x矛盾的點conflic[x]染成
藍色。

2-sat的一組解就等價於所有縮點后點顏色為紅色的點,也就是color[ id[i] ]=RED的所有點


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM