2-sat 問題
定義¶
2-SAT,簡單的說就是給出 個集合,每個集合有兩個元素,已知若干個 ,表示 與 矛盾(其中 與 屬於不同的集合)。然後從每個集合選擇一個元素,判斷能否一共選 個兩兩不矛盾的元素。顯然可能有多種選擇方案,一般題中只需要求出一種即可。
來源 OI-wiki
簡而言之,解決的問題就是形如有一些 bool
型變量,和一些限制條件,限制條件形如 \(\text{if [condition-1] then [condition-2]}\)。此時由 \(\text{condition-1}\) 向 \(\text{condition-2}\) 連一條有向邊表示該限制條件,如果最後發現對於某個變量,由 \(\text{True}\) 可推向 \(\text{False}\),由 \(\text{False}\) 可以推向 \(\text{True}\),換句話說 \(\text{True}\) 和 \(\text{False}\) 強連通,則無解。可以用 Tarjan 算法解決該類問題。
輸出方案見 OI-wiki 並結合手模思考。
- “一些”
bool
型變量不一定是 \(O(n)\) 個,“一些”限制條件不一定是 \(O(m)\) 個,可以設計合理狀態表示以解決問題。例如 CF1697F. Too Many Constraints。 - 限制條件不一定是裸的 \(\text{if a = True then b = False}\),可以自己想辦法轉化成左邊這種條件。常見的如 \(\text{a = True}\) 轉成 \(\text{if a = False then a = True}\)。例如洛谷 P4782 【模板】2-SAT 問題。
- 主要思想就是把複雜問題轉成若干個
bool
型變量及一些限制條件。例如上面兩個例如。
別的
- 取值型問題一般狀態設計是變量 \(x\ge k\)。形如 \(x=k\) 的狀態設計不好做,因爲默認了 \(x\) 的若干個狀態中必須有一個爲 \(\text{True}\),然而實際建圖中無法建出這樣的限制條件,也可能是我太菜了所以建不出。
完結。