zoukankan      html  css  js  c++  java
  • 2-sat相关复习

    2-sat相关复习

    noi曾经考过,谁能说得准呢

    sat问题

    通俗的sat问题表述一般是这样的:有很多个集合,每个集合里面有若干元素,现给出一些取元素的规则,要你判断是否可行,可行则给出一个可行方案。如果所有集合中,元素个数最多的集合有k个,那么我们就说这是一个k-sat问题。
    k-sat是NP问题,当k>2时,所以在OI里,我们只讨论2-sat问题的解决。

    能干啥

    一般形式(模板):n个点,每个点有个01变量,给出m个限制,让你找出符合限制的一组合法解
    限制条件一般为(x_{0} oplus {y_{0}}=0,x_1&y_0=1)之类的.

    如何做

    我们利用限制条件来构出图来
    一个限制条件如果是 (a)则必须选(b)
    那么,
    (a -> b)(显性条件)
    (b' -> a')(隐性条件)
    就是说第一条边就是限制条件所说。
    第二条边就是说选了(b'),则再选择了(a)会与条件矛盾,所以只能选择(a')
    这样我们构出的图就有对称性了
    2-sat的构图总是有对称性的

    判定&&求解

    举例子
    选1不选4,选2不选3,选7不选3
    dsr
    我们首先选1,则3,8是必须选的(4,7必须不选),5,6随便选一个
    矛盾的情况就是一个组都选了(上下两个点)
    然后枚举一组没有确定过的点,进行判定,如果矛盾,则选另一个a',不矛盾就选择a。
    得不到答案无解,得到就是一组解
    为何上面没被确定的点就可以继续判定,
    也就是说这组点没有被之前的点所连,他们与之前的组是没有关系的(边即关系)
    这也是得到一组字典序最小解的方法(应该是求字典序最小的唯一方法)
    复杂度(O(n*m))

    优化求解(利用对称性)

    我们发现,一个环内,要不都不要,要不都要,就是说这些点都可以用一个点表示
    喂喂喂,你别忘了这是2-sat问题诶,你一个点要有两个属性诶,缩点了如何保证啊。
    emm,不用管。
    我们之前建边的对称有啥用呢?
    如果一个环是a->b->c->d->e->a
    那么根据前面建边的对称,一定有a'<-b'<-c'<-d'<-e'<-a'
    那么我们就说这两个环对称
    那么我们建立的新图自然就是对称的,也就保证了2-sat的两个属性。

    环内如果一组都在里面,则无解(因为两个点必须有一个选和一个不选)。
    那么我们先tarjan缩下点,判一下无解

    我们选择了一个点,则它的所有连接着的点都要被选(还有连接着的连接着的点……),很麻烦
    那我们先找入读为0的点,这么就没影响了。
    就是拓扑排序,不过拓扑的是反图(边都反过来)。
    不过tarjan的时候就是按拓扑序来的,所以根本不用再在写拓扑了(写也没关系啦),嘻嘻。

  • 相关阅读:
    C51学习笔记
    Keil C51与Keil ARM共存
    keil c51笔记
    css实现三角形
    微信小程序倒计时实现
    微信小程序公共组件的引用与控制
    mac上查找nginx安装位置
    charles抓取移动端app数据
    封装react组件——三级联动
    前端基础(http协议相关篇)
  • 原文地址:https://www.cnblogs.com/dsrdsr/p/10467001.html
Copyright © 2011-2022 走看看