2-SAT学习小记

来源:互联网 发布:alien skin bokeh mac 编辑:程序博客网 时间:2024/05/16 11:40

推荐博客:【研究总结】2-sat问题

问题描述:

现在有n个集合,每个集合里有一些元素。
现在要求从每个集合里选出一个元素,并且两两集合选出的元素有限制……
记一个集合里最多有k个元素,那么这个问题称作k-sat问题。
k=2即是2-sat问题,是有价值讨论的问题。
当k>=3时,被证明是NP完全问题,是无法在多项式复杂度内求解的。

例题引入:

poj上的一道裸题。
有n个未知数x,值只能是0或1。
现在给出若干限制如:
1.x[a] and x[b] = 0
2.x[a] and x[b] = 1
3.x[a] or x[b] = 0
4.x[a] or x[b] = 1
5.x[a] xor x[b] = 0
6.x[a] xor x[b] = 1

问是否有解?

解法:

按某大神所说,2-sat就是一个在图上暴力的玩意儿。

首先拆点,每个未知数拆成2个点,一个代表0,一个代表1。

很明显满足之前所说的,就是每组必须选一个点。

定义一条有向边a->b的意义为选了a就必须选b,逆命题是不选b就不选a。

设把x拆成了x0,x1,y拆成了y0,y1
x0,y0分别表示原来的x,y选0, x1,y1分别表示原来的x,y选1。

以x and y = 0为例.
则选了x1就必须选y0,选了y0就必须选x1.
所以按规则连边.

如果x and y = 1
则一定不能选x0,y0
且选了x1,就必须选y1,选了y1,也必须选x1.
后者照样连边。
前者连x0->x1,y0->y1,至于这样做为什么是对的可以从后面的判断方法和求解方法得到答案。

对于其它的位运算,可以得到类似的连法。

判断方法:

1.如果图中有x0和x1在一个强联通分量里,显然无解。因为x0,x1必须选一个,而选了一个就会选另外一个。
2.如果对于任意的x0,x1都不在一个强联通分量里,则至少有一组解。证明可以从后面的求解方法得到。

求解方法:

将每一个强连通分量缩环,建个Turpo序,然后倒着这样做:
对于当前的点x,如果它没有被标记为不可选,则把它标记为选了,注意x是缩环以后的点,把x环上面的点的相反点全部标记为不可选,一直这样做就可以得到一组解了。

正确性?

假设有x0能走到x1,那么我只能选择x1,而不能选择x0.
Turpo倒序以后,我一定是到x1,并且x1一定不会被标记为不可选,然后x1标记为选了,再把x0标记为不能选。
这个讲法全是口胡,如果想知道具体的证明,还是看文章开头推荐的那篇博客吧。

推荐例题:51nod 1318 最大公约数与最小公倍数方程组

这题好像是51nod 上2-sat专题里的唯一的一道题,后一篇博客会讲。

原创粉丝点击