• 2-SAT


    2-SAT
    给定一个布尔方程,判断是否存在一组布尔变量的真值指派使得整个方程为真的问题,称为布尔方程的可满足性问题(SAT)
    合取范式:((aigvee bigvee cdots)igwedge (cigvee digvee cdots)igwedge cdots)
    其中(a,b)称为文字,是一个布尔变量或其否定。符号(igvee)连接的部分称为子句。如果合取范式每个子句中的文字个数都不超过两个,则对应的SAT问题称为2-SAT问题
    虽然SAT问题是NP完全的,但是2-SAT问题可以通过强连通分量,在布尔公式子句数的线性时间内解决。
    求解方法
    首先,通过逻辑表达式蕴含((Rightarrow))将每个子句((aigvee b))转换成等价形式((lnot aRightarrow b igwedge lnot b Rightarrow a)),这样原来的布尔表达式就变成了将(aRightarrow b)形式使用(igwedge)连接起来的形式
    对于每个布尔变量,设置两个顶点(a)(lnot a),以(Rightarrow)为边建立有向图。如果从图上的(a)点能够到达(b)点,表示(a)为真时(b)也一定为真,如果同时满足从(b)点能够到达(a)点,表示(b)为真时(a)也一定为真,所以一个强连通分量内的点布尔值相同
    所以如果对于任意一个布尔变量,(x)(lnot x)在同一个强连通分量中,则无法使得整个布尔公式为真。否则,对于每个布尔变量(X),如果(x)所在的强连通分量的拓扑序在(lnot x)所在的强连通分量的拓扑序之后,则令(x)为真,否则令(x)为假,这样就可以找到一组布尔变量的值使得整个布尔表达式为真

    逻辑表达式蕴含((Rightarrow)),表示若(A)(B),也就是(A)成立时(B)必须成立,(A)不成立时(B)可以成立也可以不成立

    (A) (B) (ARightarrow B)
    true true true
    true false false
    false true true
    false false true

    选择布尔变量(x)的布尔值时,由于整个表达式为真,(x)(lnot x)的布尔值相反,从表格中得到只有(A)为假(B)为真时满足条件。所以如果(x)所在强连通分量的拓扑序在(lnot x)所在的强连通分量的拓扑序之后((lnot xRightarrow x)),则令(x)为真,否则((xRightarrow lnot x))令(x)为假,可以使得整个布尔表达式为真

    德摩根律:(lnot{(Aigwedge B)}=lnot A igvee lnot B)
    题目中通常给出的是一些矛盾的、不能同时满足的条件,不能直观表现出仅有(igvee)的形式,但是可以先写出(igwedge)的形式,再通过德摩根律转化成仅有(igvee)的形式

    模板题:hdu3062 Party

  • 相关阅读:
    Linux PXE无人值守网络装机
    Linux 自动化部署DNS服务器
    Linux DNS服务配置
    Mysql数据库基础学习笔记
    Linux AIDE(文件完整性检测)
    mysql:[Err] 1068
    sql的date、时间函数、时间戳
    hive之建立分区表和分区
    excel转sql代码
    spark-submit之使用pyspark
  • 原文地址:https://www.cnblogs.com/fxq1304/p/13414757.html
Copyright © 2020-2023  润新知