《由對稱性解2-sat問題》
《2-sat解法**》
上面兩篇**很清楚的介紹了什麼是2-sat以及一些原理演算法
2-sat問題是圖論中乙個比較有意思的問題,重點是建圖,對於邊的意思,就是如果你選了i,就必須選j。
2-sat問題有個很明顯的地方就是對於每個i,i包含兩個點,i表示選第乙個點,i'表示選第二個點,然後你在每對中必須選乙個,比如你參加舉辦乙個婚禮,要麼在ai時間要麼在bi時間,則把ai看成i,bi看成i'。
如何理解這個邊呢,比如你現在有乙個不相容關係i和j,表示i和j不能同時存在, 如果你選了i,就必須不能選j,但是你又必須在每對中選乙個,所以你必須選j',所以有邊,同理如果你選了j,則必須選i',所以還有邊,所以對於每個不相容關係,你需要建立2條邊(甚至有的問題是4條邊,依據情況建圖)
如何有效地處理這樣的問題呢,**裡把方法介紹的很清楚,因為i和i'不能同時出現,滿足2-sat的圖具有對稱性,如果你i-j有邊,那麼j'-i'就有邊,如果一些點在乙個環裡面,就說明取了這個,就必須把整個環都取了,所以如果在乙個環裡,存在i和i',那麼這個2-sat就是無解的,反之必定有解。
這個有解應該想上去也挺明顯的了,**裡也有詳細證明,如果只是判定是否有解,那麼非常簡單,乙個tarjan強聯通縮點就搞定了
如果要求輸出任意乙個可行解,就需要構造解,如果直接搜尋+回溯的話,那麼複雜度是o(nm)的,所以需要更快的複雜度。
**裡介紹了一種很不錯的方法,就是建立反圖,然後拓撲排序,由底向上的給圖染色,如果乙個點i染成了紅色,那麼和他不相容的點i'就必須染成藍色,如何由底向上呢,這就是反圖的作用了,因為如果取了i就必須取j,那麼如果j'染成了紅色,j就必然是藍色,i如果是紅色的話,那麼j必然是紅色,矛盾,所以i必然是藍色,原來的邊是,現在要由j推出i,所以需要建立反圖。
感覺這會自己總結下了,對2-sat問題又有了新的理解。原來的理解有點朦朧。
可行解的步驟:tarjan縮點+建立反圖+拓撲排序+染色+輸出解(任選一種顏色)
貼個模板:
還有個問題就是輸出字典序最小的解,那麼就需要o(nm)的爆搜了,我暫時還沒有做到,需要強行刷一波專題了
(2-sat判可行性)
基礎題,假設i是這對點在內部連邊,i'是在外部連邊
沒啥好說的,建圖的時候,如果這i關係和j關係會相交,那麼表示他們倆如果都在內部會相交,就是,如果都在外部也會相交,所以,這樣的限制關係必須都考慮到,就是取某個的時候必須取另外個,這樣的關係必須建邊,這題如果只建前兩條邊,就會gg,tarjan模版一套
ac**:
(2-sat判斷可行並且輸出可行解)
這題就是上面說的輸出可行解的基本步驟,建圖也不難,就是如果不在同一對裡面的兩個時間i,j,衝突了,就建邊,很明顯。
然後模板很長,一兩百行,敲死人了,細節賊多唉。
ac**:
2 SAT學習筆記
2 sat問題指的是,給你若干個0 1變數。並給你一些限制,讓你求滿足這些限制的可行解 字典序最小的解 限制的種類包括以下幾種 1 a一定是1 2 a一定不是1 3 a,b至少有1個是1 4 a,b最多有乙個是1 5 a,b一定相同 6 a,b一定不同 一般思路是對於乙個變數,建立兩個變數 正,反 ...
2 sat學習筆記
例 struct twosat x xval or y yval void add clause int x,int xv,int y,int yv void init int n bool solve return1 為什麼不需要回溯呢?因為以前定下的變數如果在一輪dfs完之後沒有判為無解,那麼以...
學習筆記 2 SAT
拆點 將每個 bool 變數拆成 0,1 兩個點.連邊 將限制條件轉化為連邊.圖是 dag 時,對於每個 bool 變數,合法點的拓撲序大於非法點.證明 若某個 bool 變數拆分成的兩個點為 u,v 若 u 為非法點,則存在一條從 u 到 v 的路徑,所以 v 的拓撲序一定大於 u 的拓撲序.當圖...