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特殊符号又可 ...
随机推荐
- 《Cracking the Coding Interview》——第17章:普通题——题目1
2014-04-28 21:45 题目:就地交换两个数,不使用额外的变量. 解法:没说是整数,我姑且先当整数处理吧.就地交换可以用加法.乘法.异或完成,其中乘法和加法都存在溢出问题.三种方法都不能处理 ...
- ssl证书原理
SSL证书(HTTPS)背后的加密算法 SSL证书(HTTPS)背后的加密算法 之前我们介绍SSL工作原理了解到当你在浏览器的地址栏上输入https开头的网址后,浏览器和服务器之间会在接下来的几百毫秒 ...
- Eclipse下使用SVN插件从服务器获取工程
1.打开Eclipse 4.4,在Eclipse里打开SVN资源库窗口:点击菜单window-->show view-->other:然后再弹出窗口展开SVN节点,选择SVN资源库 2 ...
- C# 访问修饰符internal的访问范围误区释疑
一.前言 MSDN关于访问修饰符的访问级别解释: 访问修饰符是一些关键字,用于指定声明的成员或类型的可访 ...
- mininet、floodlight在第一次SDN上机作业中出现的一些问题
mininet.floodlight在第一次SND上机作业中出现的一些问题 首先给出链接 VMware安装 mininet安装 floodlight安装及问题,各个版本Ubuntu SDN第一次上机作 ...
- update-database -script
update-database -script 更新脚本生成失败? 项目选择的不对 update后面-database空格-script
- 像Excel的表格table
推荐:Spread.js 地址:点击打开链接 Demo:点击打开链接
- 使用awk根据多维度统计系统tps
业务简单日志格式: [2017-08-28 01:00:00.523]transfer_search,7001045,1708271100083774377,20170827,,,,,,,,,,001 ...
- Codeforces Round #352 (Div. 2) B
B. Different is Good time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- RDM原始设备映射
在一个存储区域网络(SAN)上,有两种方法为虚拟机配置存储.一种方法是使用VMFS,这是VMware Infrastructure(VI)提供的专有高性能集群文件系统.对大多数企业应用来说,在VMFS ...