\(2-SAT\)
- 定義:給出\(n\)個\(0/1\)選擇,其中部分\(0/1\)選擇會有沖突,求一組可行的選擇
- 為方便敘述,我們把第\(i\)個\(0/1\)選擇表示為\(a_{i,0},a_{i,1}\)
- 思路:
- 首先觀察性質,\(a_{x,t},a_{x',t'}\)沖突意味着兩者只能選其一。有了這個性質,我們進一步發現\(a_{i,0},a_{i,1}\)其實也是沖突的。也就是說我們可以把 \(0/1\)選擇 和 沖突 全看成 \(0/1\)選擇
- 然后我們來看 $0/1 $選擇 的性質
- 如果 每個限制 都是在兩者中選其一,不難想到我們可以建立兩個相互對立的點來表示限制。
- 如果我們將這些對立的點對應 用邊相連,我們不難發現這是一個二分圖,並且我們要找到一個點集\(S\),使得點集\(S\)中的點相互沒有連邊,且\(|S|\geq n\)
- 我們可以發現這是個裸的最大獨立集問題,利用\(dinic\),我們可以得到一個時間復雜度為\(O(m\sqrt{n})\)的算法,其中\(m\)為限制條數(二分圖中邊數)
- 但這個算法依然不是很優秀,我們繼續思考。
- 現在我們連的邊代表 限制,這樣的邊並不能滿足圖論中最基礎的性質:傳遞性。例如:對於\((a,b),(b,c)\)兩條邊,我們只能得知\(a,b\)不在一個集合,以及\(b,c\)不在一個集合,但我們不能得到\(a,c\)一定在同一個集合,因為\(c\)可能還有其他限制,導致\(c\) 不選 比 選 更優。
- 因此我們考慮重新連邊,我們把目光重新聚焦到 \(0/1\)選擇 上,我們不難發現如果我們確定了\(a_{i,0},a_{i,1}\)其中一個不選,那么另一個一定要選。那么我們就可以把先前的圖重構,即 對於\(\forall (a_{x,y},a_{z,w})\in E\)連接\((a_{x,y},a_{z,w'})\),若\(w=1\),則\(w’=0\);反之亦然
- 注意:同一個$0/1 \(選擇中的\)a_{x,0},a_{x,1}$之間不再需要連邊,因為這種邊在新圖中以自環的形式存在,因此不再在之后的操作中不再考慮。
- 這樣我們的邊\((u,v)\)的實際意義為選了\(u\),就必須選\(v\)。這樣便就滿足傳遞性了。那這樣有什么好處呢?
- 我們可以注意到,對於有向圖中的一個強連通分量(即對於強連通分量中的每個點都能將自己\(0/1\)選擇的狀態傳遞給強連通分量中的任意一個點),因此強連通分量中每個點的狀態都相同。
- 但是如果同一個\(0/1\)選擇\(a_{x,0},a_{x,1}\)都在同一個連通塊,即同時都要選 或 同時都不選,就會產生矛盾
- 這時已經沒有邊\((a_{x,0},a_{x,1})\),只有邊\((a_{x,0},a_{x,0}),(a_{x,1},a_{x,1})\)
- 那么對於全圖,我們可以用\(tarjan\)來將強連通分量縮點,在用\(topu\)排序,求出一組可行方案
