博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2-SAT 及 一点习题
阅读量:6028 次
发布时间:2019-06-20

本文共 1660 字,大约阅读时间需要 5 分钟。

今天简单学习了一下2-SAT。现在简单地总结一下。至于定义之类的就不写了,这里就写写做法,以防以后忘记。

构图

每个值a,拆为两个点,一个表示a,一个表示^a(非a)。每个点我们可以看成是一个命题(这是我的理解)。

图中如果有一条边有X连向Y,表示如果X为真,那么可以推出Y为真。

注意,这里的图是有对称性的,这样下面的算法正确性才成立。举个例子,如果a连向b,那么必然有^b连向^a;如果^a连向b,那么必然有^b连向a。

算法

构好图后我们对其使用强连通分量算法。接着我们就可以得到一个有向无环图了,注意,这里的有向无环图依然满足对称性,这个证明比较简单。

然后我们还需要一个拓扑序,这个是强连通分量是自带的一个结果(根据染色的次序就可以判断)。

那么对于每个布尔变量x,让:

x所在的强连通分量的拓扑序在^x所在的强连通分量的拓扑序之后\(\Leftrightarrow\)x为真。

当然,如果存在x和^x在一个强连通分量里面,说明无解。否则按照上面的构造是可以得到一组解的。

正确性

一开始看到这样做,我是持有怀疑态度的,主要是下面两个情况,我想,把这些分析清楚之后,正确性就显而易见了。


情况一:x为真,y为假,但x和y是在同一个强连通分量p里面。

那么^x和^y也在同一个强连通分量q里面。

x为真,p的拓扑序在q的后面。

y为假,p的拓扑序在q的前面。

矛盾。


情况二:x为真,^x为假,y为假,^y为真,存在一条边由x连向y。

根据上面的情况一,这里我们可以把x看作x所在的强连通分量。

x为真,^x为假,x在^x的后面。

存在一条边由x连向y,y在x的后面。

y为假,^y为真,^y在y的后面。

这样我们得到了它们的拓扑序^x,x,y,^y。但是,

存在一条边由^y连向^x,^x在^y的后面。

矛盾。

字典序

利用贪心的思想,每次从最高位开始确定。

如果我们要使x为真,那么就是加一条由^x向x的边,如果行不通,就会使得x和^x在同一个强连通分量里面。所以,我们只需判断加了这条边后有没有一条从x到^x的路径,如果有就不可以让x为真。

所以我们要在一开始时处理出每两两点之间的连通性(\(O(nm)\)),逐一判断真假。使x为真,就加一条由^x向x的边,同理,使x为假就由x连向^x,然后继续维护连通性(\(O(n^2)\))。

事实上,我们并不需要继续维护图的连通性,也就是不加上那些边,不妨把这些边称为没用上的边。试想,如果在后面,需判断没有一条从x到^x的路径,如果需经过一些没用上的边,不妨设其中一条是由u连向v(这里注意u,v一对点),根据对称性可以知道有这样一条回路:x,u,v,^x。所以只需逐一能不能用上这些没用上的边\(O(n)\))。

这样我们总的复杂度就是\(O(nm+n^2)\)

这里可能会有些题目使用上述方法过不了,我们可以沿着上面的思路,写一个暴力,虽然最坏情况下依然是\(O(nm)\),但一些简单的剪枝可以使实际运行快得飞起来。

习题

这里有个神奇的解法,如果我们要满足一些数量关系,比如说是限制x的大小的,可以采用这样一个技巧。我们新建一些点,点i表示\(x \leq i\),那么点i的反面就是\(x > i\)

如果x的大小范围比较大,那么就运用离散化的类似思想,这题的话,我们要选出最终答案可能取的所有值就可以了。

吐槽:我发现我越来越水了,debug了两天。。。。还有,为什么我tarjan的手写栈会慢这么多????!!

话说这题的challenge不会做,他还限制了老师的数量。

这题需要满足的一个东西是,若干的变量里,只能有一个为真或者没有真。假设在x1,x2,...,xn之间只有一个为真。我们可以这样构图:新建点y1,y2,...,yn,加这样一些边xi->yi+1,yi->^xi,当然,还有对应的反边^yi+1->^xi,xi->^yi。

转载于:https://www.cnblogs.com/wangck/p/4857775.html

你可能感兴趣的文章
Symantec(VeriSign)SSL证书
查看>>
Yum编译安装Error Downloading Packages报错
查看>>
Windows Server 2016-Netdom Join加域并指定OU (一)
查看>>
MDT 2013 从入门到精通之SQL Computer Unattended Files
查看>>
JAVA入门3-1
查看>>
自学Java-运算符
查看>>
Silve37.Silverlight和ASP.NET相互传参的两种常用方式(QueryString,Cookie)
查看>>
Python的安装、pycharm的安装及设置
查看>>
DataGrip 连接 Hive
查看>>
分栏报表-物品清单报表实现
查看>>
Center OS 5.5 下安装 和 配置 Tomcat 7
查看>>
java debug体系为什么不能debug到jdk里所有的代码
查看>>
Spring思维导图,让Spring不再难懂(aop篇)
查看>>
jwt思维导图,让jwt不再难懂
查看>>
5分钟入门数据分析
查看>>
python如何安装库命令
查看>>
Linux环境下进入MySQL环境报权限问题:Access denied for user 'root@localhost' (using password:YSE)...
查看>>
linux常用命令
查看>>
/etc/rsyncd.conf
查看>>
CoordinatorLayout 使用及源码解析
查看>>