2-sat概括性总结

关于2-SAT网上有很多解析,在这里仅概括性的介绍一下。
给定N个点,每个点都有两种状态,要或者不要。这样就有2*N个状态。然后再给出一些条件,例如要a点不要b点,不要a点的话b点也不要之类的信息。最后问在这些给定的条件下,存不存在可行解,即选取一种方案,哪些点要哪些点不要,能满足全部的条件。

2-sat:
    一个点a选和不选分别用a和a'表示。若选了a就不能选b,就称这种情况为a与b矛盾,若不选a的情况下也不能选b,那么就称a'和b'矛盾,以此类推。先画图:

2-sat概括性总结_第1张图片
假如a和b矛盾,那么就连a -> b' 和 b -> a'这两条线,表示选了a就一定得选b'(实际意义上来说是不选b),选了b就一定得选a'(同样的,实际意义上来说是不选a)。构造成有向图是因为,有时候选了a就一定得选b,但是有时候选了b就不一定非得选a。
a和b矛盾与b和a矛盾所构造出的有向图是一样的。
这是a' b'矛盾,a b'矛盾的有向图,画对了就表示构图方面已经没问题了:

2-sat概括性总结_第2张图片
对于构图已经没什么问题了,可以试着来判断有无可行解。
如果有这样的连线:a -> b且b -> a,说明a和b都要取。如果整个有向图中有某个子图,其中任意两点都能到达(就是一个强连通图),那么这个子图中的所有点都要取。如下图:

2-sat概括性总结_第3张图片
若取1,那么2也得取,4'也得取,3随意取不取。
所以对于是否存在可行解,需要找出所有的强连通图,然后判断a和a'是否同时出现在同一个强连通图中,若是则无解,若无则至少存在一组可行解。
对于有一类题目,题目要求恰到好处,要么a和b矛盾,a'和b'矛盾,这样构造出来的图就跟无向图一样,所以不需要找强连通图,只需要用并查集即可,每条边的两点加入同一集合中,最后判断a和a'时候出现在同一集合即可。如poj3207,用标准的2-sat或者纯并查集都能搞定。

你可能感兴趣的:(算法浅析)