2-sat 讲解

poj 3207 http://blog.sina.com.cn/s/blog_64675f540100k13v.html

poj 3678 http://blog.sina.com.cn/s/blog_64675f540100k15b.html

poj 3683 http://blog.sina.com.cn/s/blog_64675f540100k1cd.html

poj 3648 http://blog.sina.com.cn/s/blog_64675f540100k1g9.html

poj 2723 http://blog.sina.com.cn/s/blog_64675f540100k2rh.html

poj 2749 http://blog.sina.com.cn/s/blog_64675f540100k2xf.html

最近花了几天的时间做掉了PKU上的六道2-sat的题目,有几题比较简单,构图完成套模板就是了,有两题需要二分答案,有写题目构图容易出错,总之收获良多。

不懂2-sat的朋友推荐在Google上搜索“2-sat”,应该能找到《由对称性解2-SAT问 题》(伍昱的WC论文)、《2-SAT解法浅析》(赵爽)这两篇很好的论文,最好把它们读一读,起码可以对2-SAT模型有个初步了解和认识。关于这个模 型的概念和意义我就不详细解说了,还是和上一遍后缀数组的学习心得一样,我这里只是把我的一些心得体会写出来和大家分享,如果有错大家可以指出。

一、关于模型:

一个2-SAT模型应该是一个满足以下的条件的满足性问题:

1、该模型中存在2n个可以分成n组的元素,每组两个元素。

2、每组元素中,选择了其中一个元素,另外一个元素就不能被选择。这两个元素记为a和!a。

3、该模型中的元素之间存在一些关系,且这些关系是对称的。(除非是同一组元素中的关系,这些关系限定了“必须选择”该组中的某一个元素,可能单独出现)

满足上述条件,要求在满足给定关系的情况下在每组元素中选出一个元素的问题称为2-SAT问题。问是否存在即2-SAT判定问题,当然也可以求出一组可行解。

(上面的关于2-SAT的定义是非常不严谨不专业的,仅为帮助大家理解..可能有错,望大家指出..)

当你看见一道题目,一些事物只有唯一且互斥的两种选择(比如两种取值,两种连接方式等等),那么可以分析下题目给出的条件是否满足对称性,若满足则可通过构图将题目转化成2-SAT问题了。

二、关于构图

要解2-SAT问题或者完成判定问题,首要的任务是构图。从《由对称性解2-SAT问题》这篇论文里,我们可以知道,构图的关键是找到冲突(如 第二道题)

若a和b冲突,即选a时不能选b,那么选a时必须选!b(因为不选b就必须选!b,这是一个2-SAT问题必须满足的条件),那么我们就连边<a,!b>。同样的道理,如果选了b,那么就不能选a,必须选!a,所以连边<b,!a>。这样的连边,显然是对称的。具体的例子可以看上面的论文。

总之,弄清楚一点:如果存在边<a,b>,那么表示选择a时必须选择b。只要将所有这种“必须”关系都变成边,然后再判定2-sat或者求解2-sat,就能解决2-SAT问题了。

三、关于解2-SAT

方法是,对原图求一次强连通分量,然后看每组中的两个点是否属于同一个强连通分量,如果存在这种情况,那么无解

然后对于缩点后的图G',我们将G'中所有边转置。进行拓扑排序。
   对于缩点后的所有点,我们先预处理求出所有冲突顶点。例如缩点后Ai所在强连通分支的ID
   为id[ Ai] ,同理~Ai在 id[ ~Ai ],所以冲突顶点
    conflict[ id[Ai] ]=conflict[ id[~Ai] ];
同理conflict[ id[~Ai] ]=conflict[ id[Ai] ];

    设缩点后有Nscc个点。
    然后对拓扑序进行染色,初始化所有点color均为未着色
    顺序遍历得到的拓扑序列,对于未着色的点x,将x染成红色,同时将所有与x矛盾的点conflic[x]染成
蓝色。

2-sat的一组解就等价于所有缩点后点颜色为红色的点,也就是color[ id[i] ]=RED的所有点

posted @ 2012-09-05 20:41  Szz  阅读(3983)  评论(1编辑  收藏  举报