將每乙個點\(x_i\)拆成\(2i\)和\(2i+1\)(\(2i\)表示\(x_i\)的假狀態,\(2i+1\)表示\(x_i\)的真狀態),問題就化為了從2n個狀態中選出原來的每乙個\(x_i\)的乙個狀態。
這有什麼用呢?別急,先舉個栗子,「1 1 3 0」就可以用有向邊 2->6 7->3 來表示,什麼意思呢?2表示1為false,根據規則可得3一定為false(也就是6),7表示3為true,根據規則可得1一定為true。那麼就可以對這個有向圖的每個連通分量(不一定是強連通的)進行dfs處理,並加上剪枝、回溯就行了,細節見**。
// luogu-judger-enable-o2
#include#includeusing namespace std;
templateinline void read(t& t)
templateinline void read(t& t,args&... args)
const int maxn=1e6+7;
struct twosat
}return true;
}}ago;
int m,x,xval,y,yval;
int main()
if(!ago.solve()) printf("impossible\n");
else
return 0;
}
題解 P4782 模板 2 SAT 問題
將每乙個點 x i 拆成 2i 和 2i 1 2i 表示 x i 的假狀態,2i 1 表示 x i 的真狀態 問題就化為了從2n個狀態中選出原來的每乙個 x i 的乙個狀態。這有什麼用呢?別急,先舉個栗子,1 1 3 0 就可以用有向邊 2 6 7 3 來表示,什麼意思呢?2表示1為false,根據...
P4782 模板 2 SAT 問題
傳送門 2 sat的板子 把每乙個點拆成選0或選1 條件為 x i 為 a 或 x j 為 b 那麼如果 x i 不為 a 則 x j 必為 b 同理 x j 不為 b 則 x i 必為 a 那麼從 x i 不為 a 的點向 x j 為 b 的點連邊,從 x j 不為 b 的點向 x i 為 a 的...
《P4782 模板 2 SAT 問題》
2 sat問題 就是一些元素,他們的值只能為布林值0,1.給出一些限制關係,並且每對關係都是兩個數之間的。讓你找出一組構造,讓所有關係都滿足。解法 首先要建圖 我們規定,a為1的點為a n,a為0的點為a。那麼對於給定的一對關係a b。如果是a 1,b 1,那麼說明a b。利用可以轉化為 a b,b...