Loading

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\)的边。自己想一想为什么?(提示:逆否命题)

posted @ 2020-12-03 20:16  zhangwenxuan  阅读(66)  评论(0)    收藏  举报