• 2-sat问题学习记录


    如果你不知道什么是sat问题,请看以下问答.

    Q:sat问题是什麽?
    A:首先你有n个布尔变量,然后你有一个关于这n个布尔变量的布尔表达式,问你,如果让你随意给这n个布尔变量赋值,这个布尔表达式能否成立.
    Q:k-sat是什麽意思?
    A:把sat问题中的布尔表达式不断进行转化,直到变为一个由与连接的若干个[由或连接的若干个(布尔变量或被非运算了的布尔变量)],那么所有的[]中()的数量的最大值为k.
    Q:怎么转化布尔表达式?
    A:按照 !(a||b) -> (!a)&&(!b) , !(a&&b) -> (!a)||(!b) , (a&&b)||c -> (c||a)&&(c||b) 的法则来转化.
    Q:为什么k>2的时候的k-sat问题是NPC问题?
    A:我也不知道啊……

    现在,你已经知道了什么是sat问题,那什么是2-sat问题呢?
    结合以上定义,朴素地说,就是,你有n个布尔变量,并且对于这n个布尔变量,你有若干个二元或者一元限制,问你能否给这n个布尔变量赋值,使得所有的限制满足.
    对于2-sat问题,有时候我们不仅仅要问能否成立,还要询问方案,而现在解决2-sat相关问题的流行做法,就是建图.
    建图的话,就是把每个布尔变量拆成两个点,一个表示true,一个表示false,并且按照要求的限制,在这些点中连有向边,a->b表示若a则b.
    当限制为一元的时候,就是确定了某个布尔变量的值,这个时候,对于这个布尔变量在图上的两个点,假设确定的值对应的点为a,另一个点为b,那我们连b->a.
    当限制为二元的时候,就是两个布尔变量之间的限制,所以这两个布尔变量要相互连边.
    当建完图之后,我们可以采取dfs或者Tarjan,来进行相关操作.

    具体建图与操作还有很多……
    有关sat问题的更多信息:
    https://blog.csdn.net/seaskying/article/details/51726217
    有关2-sat问题的相关操作的更多信息:
    https://wenku.baidu.com/view/afd6c436a32d7375a41780f2.html
    https://wenku.baidu.com/view/0f96c3daa58da0116c1749bc.html
    https://www.cnblogs.com/-ZZB-/p/6635483.html
    有关建图的更多信息:
    COGS 313. [POI2001] 和平委员会
    bzoj 2199: [Usaco2011 Jan]奶牛议会
    bzoj 1997: [Hnoi2010]Planar
    UOJ #210.【UER #6】寻找罪犯
    LOJ #6036.「雅礼集训 2017 Day4」编码

  • 相关阅读:
    (22)进程和线程区别
    (21)回调函数
    (20)gevent协程
    (18)ProcessPoolExecutor进程池
    (19)ThreadPoolExecutor线程池
    (17)线程队列---queue LifoQueue PriorityQueue
    (16)线程---定时器Timer
    (15)线程---Condition条件
    (14)线程- Event事件和守护线程Daemon
    IDEA快速搭建WEB项目【记录篇】
  • 原文地址:https://www.cnblogs.com/TSHugh/p/8626169.html
Copyright © 2020-2023  润新知