1. 定义

给定一个布尔方程,判断是否存在一组布尔变量的真值指派使整个方程为真的问题,被称为布尔方程的可满足性问题(SAT)。SAT问题是NP完全的,但对于满足一定限制条件的SAT问题,还是能够有效求解的。

如果合取范式的每一个子句中的文字个数不超过两个,那么对应的SAT问题可以称为2-SAT问题。

(a∨b)∧¬a" role="presentation" style="position: relative;">(a∨b)∧¬a(a∨b)∧¬a 令a为假而b为真,则可以满足

(a∨¬b)∧(b∨c)∧(¬c∨¬a)" role="presentation" style="position: relative;">(a∨¬b)∧(b∨c)∧(¬c∨¬a)(a∨¬b)∧(b∨c)∧(¬c∨¬a) 令a和b为真,而c为假,则可以满足

利用强联通分量分解,可以在布尔公式子句数的线性时间内解决2-SAT问题

首先利用⇒" role="presentation" style="position: relative;">⇒⇒(蕴含)将每一个子句(a∨b)" role="presentation" style="position: relative;">(a∨b)(a∨b) 改写成等价的(¬a⇒b)∧(¬b⇒a)" role="presentation" style="position: relative;">(¬a⇒b)∧(¬b⇒a)(¬a⇒b)∧(¬b⇒a)

对于每个布尔变量x,构造两个顶点分别代表x和¬x" role="presentation" style="position: relative;">¬x¬x,以⇒" role="presentation" style="position: relative;">⇒⇒关系为有向边,建立有向图。此时,如果a点能够到达b点,就表示当a为真时b也为真。因此图中的同一个强联通分量中的所有布尔值均相同。

如果存在某个布尔变量x,x和¬x" role="presentation" style="position: relative;">x和¬xx和¬x均在同一个强联通分量中,则显然无法令整个布尔公式的值为真。反之,如果不存在这样的布尔变量,那么对于每个布尔变量x,让

x所在的强联通分量的拓扑序在¬x所在的强联通分量之后⇔x为真" role="presentation" style="position: relative;">x所在的强联通分量的拓扑序在¬x所在的强联通分量之后⇔x为真x所在的强联通分量的拓扑序在¬x所在的强联通分量之后⇔x为真

就是使得该公式的值为真的一组适合的布尔变量赋值。

2. 题目讲解

(1)POJ 3683

2-SAT问题(白书)的更多相关文章

  1. 白书P61 - 点集配对问题

    白书P61 - 点集配对问题 状压DP #include <iostream> #include <cstdio> #include <cstring> using ...

  2. 白书P60 - 硬币问题

    白书P60 - 硬币问题 完全背包.DP #include <iostream> #include <cstdio> #include <cstring> usin ...

  3. poj2991 Crane(线段树+集合)白书例题

    题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...

  4. Uva10474-STL水题-白书

    白书的一道水题.话说好久没认真做难题了.今天出了排名,所有队伍里倒数第一啊! 代码没什么可说的了. #include <algorithm> #include <cstring> ...

  5. UVA大模拟代码(白书训练计划1)UVA 401,10010,10361,537,409,10878,10815,644,10115,424,10106,465,10494

    白书一:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=64609#overview 注意UVA没有PE之类的,如果PE了显示WA. UVA ...

  6. 《白书》上线段树RMQ的实现

    白书上的线段树RMQ实现,自己重写了一遍: #include <bits/stdc++.h> using namespace std; const int MAXN=1<<17 ...

  7. la3523 白书例题 圆桌骑士 双联通分量+二分图

    具体题解看大白书P316 #include <iostream> #include <algorithm> #include <vector> #include & ...

  8. [tem]线段树(白书版)

    个人感觉有点坑 add用的标记永久化 set用的标记下传 #include <iostream> #include <cstdio> #include <algorith ...

  9. 白书 4.1.2 模运算的世界 P291

    1.逆元 这里有个注意事项要说,就是当要求 (a-b)%m 的时候要注意不能直接 (a%m-b%m)%m 原因是得出的值有可能是负数,所以 (a%m-b%m+m)%m 才是正确的. //x,y是引用 ...

随机推荐

  1. 解决Coldfusion连接MySQL数据库的问题

    在连接MySQL时,出现了如下错误: Connections to MySQL Community Server are not supported. Please contact MySQL to ...

  2. Hashmap在JDK8中的提升

    HashMap使用key的hashCode()和equals()方法来将值划分到不同的桶里. 桶的数量通常要比map中的记录的数量要稍大.这样 每一个桶包含的值会比較少(最好是一个).当通过key进行 ...

  3. C#中泛型方法与泛型接口 C#泛型接口 List<IAll> arssr = new List<IAll>(); interface IPerson<T> c# List<接口>小技巧 泛型接口协变逆变的几个问题

    http://blog.csdn.net/aladdinty/article/details/3486532 using System; using System.Collections.Generi ...

  4. Android Client and PHP Server

    1 FEApplication https://github.com/eltld/FEApplication https://github.com/eltld/FE-web https://githu ...

  5. EA生成实体类代码

    引言 在做机房个人版重构的时候,就听说了EA是一个强大的软件.仅仅只是知道的时候,已经画完了图,没有怎么用EA其它的功能,所以一直没有见识过罢了.如今到了机房合作了,想到EA一定要好好用,这样能省不少 ...

  6. 提高比特率 有损 无损 Video-and-Audio-file-format-conversion 视频声音转码

    3 Ways to Change Bitrate on MP3 Files https://www.online-tech-tips.com/software-reviews/change-bitra ...

  7. MVC中从Controller像View层传值

    MVC中的Controller不能直接的訪问View层中的控件,那么是怎样的将Controller中值传到View中,经常使用的有4种 ViewData: 是获取或设置视图的字典对象,它里面存放的是键 ...

  8. method.invoke()使用

    public Object invoke(Object obj, Object... args) throws IllegalAccessException, IllegalArgumentExcep ...

  9. 函数 devm_kzalloc()【转】

    本文转载自:http://blog.csdn.net/jgw2008/article/details/52691568 函数 devm_kzalloc() 和kzalloc()一样都是内核内存分配函数 ...

  10. ZOJ3261 Connections in Galaxy War —— 反向并查集

    题目链接:https://vjudge.net/problem/ZOJ-3261 In order to strengthen the defense ability, many stars in g ...