2-sat 問題

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 並結合手模思考。

  1. “一些” bool 型變量不一定是 \(O(n)\) 個,“一些”限制條件不一定是 \(O(m)\) 個,可以設計合理狀態表示以解決問題。例如 CF1697F. Too Many Constraints
  2. 限制條件不一定是裸的 \(\text{if a = True then b = False}\),可以自己想辦法轉化成左邊這種條件。常見的如 \(\text{a = True}\) 轉成 \(\text{if a = False then a = True}\)。例如洛谷 P4782 【模板】2-SAT 問題
  3. 主要思想就是把複雜問題轉成若干個 bool 型變量及一些限制條件。例如上面兩個例如。

別的

  1. 取值型問題一般狀態設計是變量 \(x\ge k\)。形如 \(x=k\) 的狀態設計不好做,因爲默認了 \(x\) 的若干個狀態中必須有一個爲 \(\text{True}\),然而實際建圖中無法建出這樣的限制條件,也可能是我太菜了所以建不出。

完結。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章