2-SAT问题
2-SAT问题
一.是什么
给定\(n\)的\(bool\)变量,\(m\)个约束条件,每组约束条件为"\(x_i\)为真或者为假"。
请找出\(n\)个\(bool\)变量,作为原来的一组解。
二.怎么做
本质上可以将\(n\)个\(bool\)变量看作\(n\)个集合,每个集合中只有真和假两种元素,请在每个集合中选择一个元素,使得所有的条件成立。
做法我们可以将这些约束条件转换为图上的便。
例如: 张三 去 或者 李四 不去
那么我们就有两条边:张三不去---->李四去 和 李四不去------>张三去。
见图时通常令张三为\(i\),张三去时节点编号为\(2\times i + 1\),张三不去时节点编号为\(2\times i\),这个思想类似于拆点。
然后我们进行这个有向图的遍历,如果我们从\(2\times i+1\)跑到了\(2\times i\)就说明\(i\)不能为\(1\)。
例题
HDU3062
这道题我们要见图我们很容易,就是吧每一对夫妻看作一个\(bool\)变量,0代表妻子,1代表丈夫,建图就有手就行了。
但是我们在进行dfs找环的时候,我们不要进行回溯,因为回溯的本质是要找一条路走通,但是我们这里要保证所有的路都走通。
之后就轻轻松松了。
luogu P4782
和上一道题差不多。。。。。
一些细节
如果我们要求\(a,b\)都要为真的话,我们该怎样连边呢
我们可以把\(!a\)联向\(a\),如果我们走到了\(!a\),那么我们就走入了死胡同,就跑不通了。
如果我们要求\(a\)为真是\(b\)必为假,那么我们很容易想到将\(a\)连向\(!b\)
其实这样连边是不可以的,我们还要连\(b\)到\(!a\)的边。自己想一想为什么?(提示:逆否命题)
制作不易,点个赞在走吧(QAQ)