2-sat 推薦學習資料:
伍昱的2003年IOI國家集訓隊論文《由對稱性解2-sat問題》
論文鏈接:https://wenku.baidu.com/view/31fd7200bed5b9f3f90f1ce2.html
注:
本博文只分析如何輸出一組可行解,請讀者確保已學習了判斷是否有解
本人水平不高,若有分析不得當之處,歡迎指出
法一、tarjan+構建反圖+拓撲排序
在原圖tarjan縮點后得到的有向無環圖的反圖上拓撲排序
邊拓撲邊干兩件事兒:
1、選擇當前棧頂所代表的問題
2、刪除與棧頂問題相對立的問題,刪除它在反圖上的后繼問題
個人理解:
1、一般情況下,2-SAT的構圖是對稱的,(原因去看論文)
設i與i'為一對相互對立的問題
若在原圖中存在下面的左邊的連通子圖則必存在右邊的連通子圖

非一般情況比如NOI2017 Day2 T1 游戲,
輸入數據會使存在邊i-->i',但不一定存在邊i'-->i
即給出的約束條件使原本就設定的對立問題 再連邊
2、在原圖中一條邊u-->v代表着如果選擇問題u則必須選擇問題v
而選擇了問題v不一定要選擇問題u
在實現的時候,如果在反圖上進行拓撲排序,
反圖中入度為0的點,對應着原圖中出度為0的點,它在原圖中沒有后繼問題
相當於省去了在原圖中拓撲排序的還要選擇它所有的后繼問題
3、在原圖中一條邊u-->v代表着 如果不選v,則一定不選u
棧頂問題的對立問題一定不能選,所以原圖中還要刪除對立問題的所有前驅問題
對應到反圖中就是后繼問題
在具體實現的時候,我們可以使這些棧頂對立問題的后繼問題永遠不能入棧
不刪除棧頂對立問題的出邊即可
法二:tarjan
tarjan縮點時會給點重新編號
對於一對相互對立的問題,誰的新編號小就選誰
此方法對於非對稱圖也適用
反圖上在拓撲排序中選擇,等價於
原圖(縮點后的樹)上 從葉子節點開始,自底部向上選擇的過程
而tarjan縮點重標號也是從葉子節點往上
