什么是2-sat
要知道2-sat是什么,我们先要知道什么是适定性(Satisfiability)问题,适,就是合适,定,就是确定,适定性问题通俗的说就是确定是否可以满足所有的条件?或者说就是确定一个满足所有条件的方案。取英文的前三个字母,简称sat问题。
通俗的sat问题表述一般是这样的:
有很多个集合,每个集合里面有若干元素,现给出一些取元素的规则,要你判断是否可行,可行则给出一个可行方案。如果所有集合中,元素个数最多的集合有k个,那么我们就说这是一个k-sat问题,同理,2-sat问题就是k=2时的情况。(摘自jarjingx的博客)
总结一下,2-sat差不多就是有若干个元素,每个元素有两个可选的权值,但只能选一个。不同元素间还有对应关系,即若一个元素选择一个权值,那么另一个元素也必须选择其中的一个权值,或者另一个元素选其中的一个权值。如果还是看不懂,那么通过一个例题就会懂了。
例题
洛谷P4782 【模板】2-SAT 问题
有 n n n个布尔变量 x 1 x n x1~xn x1 xn,另有 m m m个需要满足的条件,每个条件的形式都是“ x i xi xi为 t r u e / f a l s e true/false true/false或 x j xj xj为 t r u e / f a l s e true/false true/false”。比如“ x 1 x1 x1为真或 x 3 x3 x3为假”、“ x 7 x7 x7为假或 x 2 x2 x2为假”。2-SAT 问题的目标是给每个变量赋值使得所有条件得到满足。
输入格式:
第一行两个整数 n n n和 m m m,意义如体面所述。
接下来 m m m行每行4个整数 i , a , j , b i ,a, j, b i,a,j,b,表示“ x i xi xi为 a a a或 x j xj xj为 b b b” ( a , b ∈ 0 , 1 ) (a,b∈{0,1}) (a,b∈