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

我们首先选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的时候就是按拓扑序来的,所以根本不用再在写拓扑了(写也没关系啦),嘻嘻。

2-sat相关复习的更多相关文章

  1. 【Java】多线程相关复习—— 线程的创建、名字、运行情况以及顺序控制(join方法) 【一】

    一.创建线程的三种方式 · 继承Thread类 · 实现Runnable接口 · 实现Callable接口 二. 线程状态 · 线程名字 getName() · 线程活动情况 isAlive() · ...

  2. JAVA一些常用的时间操作

    项目中经常有对时间进行处理的需求,下面是一些常用的操作整理,方便以后再次使用以及做相关复习. 1.字符串转换为日期 /** * 字符串转换为日期 * @param dateStr 需要转换的日期 * ...

  3. Java面试集合(一)

    前言 大家好,给大家带来Java面试集合(一)的概述,希望你们喜欢 一 1.Java按应用范围可划分几个版本? 答:Java按应用范围有三个版本,分别是JavaSE,JavaEE,JavaME. 2. ...

  4. 嵌入式单片机STM32应用技术(课本)

    目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...

  5. JAVA基础部分复习(一、8中基础类型,以及String相关内容)

    以下是关于java中8种基本类型的介绍说明: package cn.review.day01; /** * java基础复习,8种数据类型 * (byte,short,long,int,double, ...

  6. 浅谈C#中的 async await 以及对线程相关知识的复习

    C#5.0以后新增了一个语法糖,那就是异步方法async await,之前对线程,进程方面的知识有过较为深入的学习,大概知道这个概念,我的项目中实际用到C#异步编程的场景比较少,就算要用到一般也感觉T ...

  7. 1 复习ha相关 + weekend110的hive的元数据库mysql方式安装配置(完全正确配法)(CentOS版本)(包含卸载系统自带的MySQL)

    本博文的主要内容是: .复习HA相关 .MySQL数据库 .先在MySQL数据库中建立hive数据库 .hive的配置 以下是Apache Hadoop HA的总结.分为hdfs HA和yarn HA ...

  8. 提问式复习:图文回顾 redo log 相关知识

    原文链接:提问式复习:图文回顾 redo log 相关知识 1.如何提升 redo日志 的写性能? 为了保证 redo日志 不丢失,会在磁盘中开辟一块空间将日志保存起来.但是这样会有一个问题,磁盘的读 ...

  9. mysql复习相关

    Mysql相关 mysql增删改查 我们需要修改数据表名或者修改数据表字段时,就需要使用到Mysql Alter命令 删除,添加或修改表字段 alter table student drop regi ...

随机推荐

  1. linux中安装oracle数据库

    1. 执行 ./runInstaller 提示 /tmp 的空间过小执行 mount -o remount,size=1G,noatime /tmp重新设置 /tmp 的大小 2. 安装完成数据库之后 ...

  2. Python基础知识摘要

    python字典 增,删,改,查 1.增:XXX[新的key] = value 2.删:DEL XXX[key] 3.改:XXX[已经存在的key] = NewValue 4.查:aList.exte ...

  3. SVN && BeyondCompare

    [1]设置内容 (1)三个步骤对应设置内容 1.1 "D:\Beyond Compare 4\BCompare.exe" %base %mine /title1=%bname /t ...

  4. QtCreator 调试源码

    [1]安装源码 声明:要想调试进入Qt源码,必须首先保证我们安装了Qt源码.下面说明安装Qt源码注意事项. 一般安装过程(默认不安装源码): 安装源码过程(需要自己设置,点击“全选”): 综上所述:Q ...

  5. Axis2之wsdl2java工具

    本章主要介绍axis2的wsdl2java工具的使用. Axis2提供了一个wsdl2java命令可以根据WSDL文件自动产生调用WebService的代码.wsdl2java命令可以在<Axi ...

  6. 国外互联网大企业(flag)的涨薪方式

    国外互联网大企业(flag)指的是:Facebook,Google,Amazon,LinkedIn 至于 A 代表哪家公司存在争议:有人说是Amazon,也有说是Apple,现在更有人说应该是AirB ...

  7. linux 安装python3 date更新

    http://linux.51yip.com/ ntpdate -u ntp.aliyun.com   更新时间 centos 默认是有 python的,是2.7.5的 重启网络的命令  -- sys ...

  8. build docker deivcemapper

    1.创建一个虚拟快设备 dd if=/dev/zero of=4G.img bs=1M count=4096 2.创建loop device 可以先用losetup -f 查看空闲的loop设备 lo ...

  9. codevs——1003——电话连线

    题目描述 Description 一个国家有n个城市.若干个城市之间有电话线连接,现在要增加m条电话线(电话线当然是双向的了),使得任意两个城市之间都直接或间接经过其他城市有电话线连接,你的程序应该能 ...

  10. Android Camera2 Opengles2.0 实时滤镜(冷暖色/放大镜/模糊/美颜)

    https://blog.csdn.net/keen_zuxwang/article/details/78363464 demo: http://download.csdn.net/download/ ...