2-SAT浅谈
2-SAT浅谈
一、2-SAT问题
首先,什么是$2-SAT$问题。现在给出这样一类问题:给出$n$个点和关于这$n$个点的$m$条限制条件,并且这$n$个点中,每一个点只有两种状态。对于上述问题,我们称之为$2-SAT$问题。如果这些点中有一个点的状态总数大于$2$,这个问题就不能称之为$2-SAT$问题。
二、解法
对于这样的问题,我们运用对称的思想进行建图。我们一下面给出的问题为例:现在给出$n$个物品和$m$个限制条件,每一个物品有两种状态:购买或不购买;每一个限制条件可以用四元组表示:$(x,a,y,b)$,其中$a,b\in \{0,1\}$,$0$表示不选,反之$1$表示选。这个四元组,表示我们在$x$物品为$a$状态和$y$物品为$b$状态这两个事件中至少要选取一个,是之成立。
对于上述问题,我们就可以向每一个节点分配两个节点,即对于第$i$个物品分配编号为$(i<<1)$和$(i<<1|1)$两个节点,分别表示选择这个物品或者不选择这个物品。如果要满足上述的四元组,我们知道一个性质:如果不选$x$为$a$状态这个事件,则我们一定选择$y$为$b$状态这个事件;如果不选$y$为$b$状态这个事件,则我们一定选择$x$为$a$状态这个事件。根据这个性质我们可以进行连边,我们从$(x<<1|(a==1))$连接一条有向边至$(y<<1|(b==1))\oplus1$,从$(y<<1|(b==1))$连接一条有向边至$(x<<1|(a==1))\oplus1$,这两条有向边的含义就是上述性质。对于一条有向边$a\rightarrow b$的含义:如果要选择$a$这个状态,则必须选择$b$这个状态。
$O(n^2)$做法:根据上述含义,我们知道如果要选择$a$状态,则在我们所建出的图中能从$a$到达的状态点我们都必须要选择,对于这个性质,我们可以对于每一个状态点我们都遍历整张图,这样只需要判断我们判断这个点能到达的点中是否有与其向排斥的点,即是否存在一个点的编号异或$1$之后的值与其相同$(点的编号\oplus 1== 出发点编号)$,若有则有点和他相违背,这样我们这个点所表达的状态就不能成立,若同一个物品的两个状态都不能成立,则这组限制条件没有办法成立。
$O(n)$做法:我们发现一个四元组:$(x,a,y,b)$所形成的边一定实对称的,即若有一条有向边$x\rightarrow y$,则一定有一条有向边$y\oplus1\rightarrow x\oplus1$。我们根据这个性质知道,若一个物品的两个状态都不可能成立,则这两个点一定相连,且在一个环上。简单的小证明:如果$x$不成立,则$x$一定能通过边到达$x\oplus1$,因为上述性质,所以$x\oplus1$也能通过边到达$x$,又因为这是一个有向图,所以他们一定在一个环上。运用这个性质,我们可以运用$tarjan$,进行缩点,若有一对点$x、x\oplus1$,在缩点之后属于一个强连通分量中,则这组限制条件不成立。对于方案,我们也能在线性时间复杂度内求出一组方案。我们先对我们建出的图进行缩点操作,在缩点之后我们将剩下的所有边反向重连,对于这个图跑拓扑序。当然这个只是按照拓扑序的思路,对于当前强连通分量,若我们选择他,则他中所有的点的对应点所在强连通分量都不能选,依照这个我们进行拓扑排序和选择答案。
2-SAT浅谈的更多相关文章
- 【WebApi系列】浅谈HTTP
[01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi如何传递参数 [04]详解WebApi测试和PostMan [05]浅谈WebApi Core ...
- 【WebApi系列】浅谈HTTP在WebApi开发中的运用
WebApi系列文章 [01]浅谈HTTP在WebApi开发中的运用 [02]聊聊WebApi体系结构 [03]详解WebApi参数的传递 [04]详解WebApi测试和PostMan [05]浅谈W ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
随机推荐
- .gitignore 中文文件夹无效
有个文件夹名如:测试 在.gitignore中添加 /测试/ 但运行命令git status后发现还是被追踪到了 一番搜索后终于发现.gitignore文件编码是GBK的,重新将文件保存成utf ...
- 自动化测试学习之路--HTML常见元素、属性的简单学习
如何创建html文件: 使用工具:VSCode 1.双击文件名显示区,可快速新建文件. 2.保存文件,文件名.html 3.输入!(必须是英文的!),按 Tab键,可自动生成html格式的文件,如下: ...
- python3编写脚本之--------购物车
我这里的购物车的大概内容是: 1.首先要知道商品的有什么东西可卖,需要多少钱. 2.买家准备花多少钱去购物商品,购买的商品先放在购物车里. 3.最后买家还可以是否确定购买购物车的东西,还剩多 ...
- 解决Navicat for MySQL 连接 Mysql 8.0.11 出现1251- Client does not support authentication protocol 错误
安装MySQL8.0之后,使用Navicat连接数据库,报1251错误. 上网搜索解决方案,网上说出现这种情况的原因是:mysql8 之前的版本中加密规则是mysql_native_password, ...
- Vue_初识
前端三大框架: vue:开发效率相当高了. angalar:适合做后台管理系统,入手容易,但是越往后会越难受. react:虚拟dom(渲染内存中存储的dom,经过操作后,才会去渲染浏览器的真实dom ...
- css 外边距,内边距的使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python字符串相关
#字符串的相关操作 #基本操作 #+ 字符串连接操作 str1 = '来是come走是go' str2 = '点头yes摇头no' result = str1 + str2 print(result) ...
- NOI退役啦
没进前一百 签的上交一本 高三加油喽
- 03 Java 修饰符
Java 修饰符主要分为两类: 访问修饰符 非访问修饰符 访问修饰符 public,对所有类可见 protected,对同一包内的类和子类可见 default,同一个包内的类可见 private,对当 ...
- urllib2.URLError: <ulropn error [Errno 10060] >
在抓网页的时候,如果抓取频率很高,很容易出现这个错误: 意思是服务器拒绝响应.解决的方法为,隔段时间再试,不过这个方法不靠谱.靠谱的方法是增加一个延迟函数 import time time.sleep ...