2-SAT学习笔记

《由对称性解2-SAT问题》

《2-SAT解法浅析》

上面两篇论文很清楚的介绍了什么是2-SAT以及一些原理算法

2-SAT问题是图论中一个比较有意思的问题,重点是建图,对于边<i,j>的意思,就是如果你选了i,就必须选j。

2-SAT问题有个很明显的地方就是对于每个i,i包含两个点,i表示选第一个点,i'表示选第二个点,然后你在每对中必须选一个,比如你参加举办一个婚礼,要么在ai时间要么在bi时间,则把ai看成i,bi看成i'。

如何理解这个边呢,比如你现在有一个不相容关系i和j,表示i和j不能同时存在, 如果你选了i,就必须不能选j,但是你又必须在每对中选一个,所以你必须选j',所以有边<i,j'>,同理如果你选了j,则必须选i',所以还有边<j,i'>,所以对于每个不相容关系,你需要建立2条边(甚至有的问题是4条边,依据情况建图)

如何有效地处理这样的问题呢,论文里把方法介绍的很清楚,因为i和i'不能同时出现,满足2-SAT的图具有对称性,如果你i-j有边,那么j'-i'就有边,如果一些点在一个环里面,就说明取了这个,就必须把整个环都取了,所以如果在一个环里,存在i和i',那么这个2-SAT就是无解的,反之必定有解。

这个有解应该想上去也挺明显的了,论文里也有详细证明,如果只是判定是否有解,那么非常简单,一个tarjan强联通缩点就搞定了

如果要求输出任意一个可行解,就需要构造解,如果直接搜索+回溯的话,那么复杂度是O(nm)的,所以需要更快的复杂度。

论文里介绍了一种很不错的方法,就是建立反图,然后拓扑排序,由底向上的给图染色,如果一个点i染成了红色,那么和他不相容的点i'就必须染成蓝色,如何由底向上呢,这就是反图的作用了,因为如果取了i就必须取j,那么如果j'染成了红色,j就必然是蓝色,i如果是红色的话,那么j必然是红色,矛盾,所以i必然是蓝色,原来的边是<i,j>,现在要由j推出i,所以需要建立反图。

感觉这会自己总结下了,对2-SAT问题又有了新的理解。原来的理解有点朦胧。

可行解的步骤:tarjan缩点+建立反图+拓扑排序+染色+输出解(任选一种颜色)

贴个模板:http://paste.ubuntu.net/15929856/ 

还有个问题就是输出字典序最小的解,那么就需要O(nm)的爆搜了,我暂时还没有做到,需要强行刷一波专题了


http://poj.org/problem?id=3207 (2-SAT判可行性)

基础题,假设i是这对点在内部连边,i'是在外部连边

没啥好说的,建图的时候,如果这i关系和j关系会相交,那么表示他们俩如果都在内部会相交,就是<i,j'> <j,i'> ,如果都在外部也会相交,所以<i',j> <j',i>,这样的限制关系必须都考虑到,就是取某个的时候必须取另外个,这样的关系必须建边,这题如果只建前两条边,就会GG,tarjan模版一套

AC代码:http://paste.ubuntu.net/15929727/


http://poj.org/problem?id=3683 (2-SAT判断可行并且输出可行解)

这题就是上面说的输出可行解的基本步骤,建图也不难,就是如果不在同一对里面的两个时间i,j,冲突了,就建边<i,j'> <j,i'> ,很明显。

然后模板很长,一两百行,敲死人了,细节贼多唉。

AC代码:http://paste.ubuntu.net/15929815/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值