簡介
什么是2-SAT呢?就是有一些集合,每個集合中有且僅有兩個元素,且不能同時選取兩個元素,集合間的元素存在一定的選擇關系,求解可行性及可行方案。
算法
1、連邊
2、跑tarjan
3、判可行性,即同一集合中的兩個點是否同屬一個強連通塊
4、縮點建新圖,連反邊
5、拓撲序,若當前點沒有被訪問過,則選擇該點,不選擇其另外的點
連邊
2-SAT算法本身並不難,關鍵是連邊,不過只需要充分理解好邊的概念:a->b即選a必選b。
a、b不能同時選:選了a就要選b',選了b就要選a'。
a、b必須同時選:選了a就要選b,選了b就要選a,選了a'就要選b',選了b'就要選a'。
a、b必須選一個:選了a就要選b',選了b就要選a',選了a'就要選b,選了b'就要選a。
※a必須選:a'->a。
一些題目
POJ 3683 輸出方案
POJ 3678 連邊練習
BZOJ 1823 判斷可行性
某不知名字的題目
題意:一開始有一些點與點的關系,問刪除一些點之后,方案是否可行。
分析:刪除點之后,原有的關系的連邊會有所改變,因此對於每刪除一些點,就要重新構圖,跑2-SAT
資料
以上只是為了個人總結所用,所以並不是很詳細。
需要的可前往:http://blog.csdn.net/jarjingx/article/details/8521690
