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. executing in nfs will not generate core dump file

    最近遇到了一个奇怪的问题. linux系统的pc搭建nfs server,开发板作为nfs client,开发板中全程root权限操作,执行的程序放到 nfs server 中 exports 出的目 ...

  2. OpenGL and Vulkan resources

    OpenGL https://www.zhihu.com/question/22005157https://open.gl/https://github.com/cybercser/OpenGL_3_ ...

  3. array_contains 分析函数使用演示

    Hive中的array_contains函数与SQL中的 in关键字 操作类似,用于判定 包含(array_contains)或不包含(!array_contains)关系.与 in不同的是array ...

  4. CRM rbac 组件的应用

    1 拷贝 rbac 组件到项目中,注册这个app 2 数据库迁移 1 删除rbac下migrations里除了init外的文件 2 修改用户表 class User(models.Model): &q ...

  5. 前端框架VUE----指令

    一.什么是VUE? 它是构建用户界面的JavaScript框架(让它自动生成js,css,html等) 二.怎么使用VUE? 1.引入vue.js 2.展示HTML <div id=" ...

  6. Eclipse Luna在线安装Maven时报错:Java heap space

    问题描述: 在线安装Maven插件时发生了:Java heap space 问题截图:

  7. Python笔记 #19# 实现bpnn

    代码编辑&解释工具:Jupyter Notebook 快速入门 形象说明BP神经网络的用法(图片来自推特): Bpnn类最主要的三个方法: initialize方法,用于设定神经网络的层数.各 ...

  8. nginx+php+memcache实现hash一致性memcache 集群

    我们工作中可能会遇到key-value数据库,如果我们面对的不止一台memcache服务器,而是很多台.那么现在就回出现一个问题: 当我们访问nginx服务器的时候,我们会判断memcache中是否有 ...

  9. sublime text3 批量查找替换文件夹或项目中的字符

    1.点击左上角的“菜单”,在弹出的菜单中选择“打开文件夹”. 2.在文件夹上右击,选择“在文件夹中查找”选项 3.之后会软件底部会弹出对话框,分别输入要查找的内容和替换的内容,最后点击替换按钮 4.再 ...

  10. Pycharm创建Django项目并访问Django

    Pycharm创建Django项目并访问Django 一.Django插件 如果没有Django插件,需要先安装Django插件. 1,首先点击Default Settings,打开设置页面: 2,打 ...