zoukankan      html  css  js  c++  java
  • 2-SAT

    部分转自https://blog.csdn.net/jarjingx/article/details/8521690

    博主讲的真的太棒了

    2-sat
    定义:
        有一些集合,每个集合里面有且仅有两个元素,且不能同时选取两个元素,集合间的元素存在一定的选择关系,求解可行解以及可行方案
    //    如果元素最多的集合里面有k个元素,则称其为k-sat问题,可以证明是NP完全问题(出门右转百度百科)

    方法:
        1.连边
        2.tarjan缩点,连反边
        3.判断可行性,即同一集合中的两点是否属于一个强联通分量
        4.拓扑排序,若当前节点没有被访问过,则选择该点,不选择其他的点
        5.构造方案

    连边
    算法本身并不难,关键在于连边,充分理解好边的概念:a->b表示选a必选b
        a,b不能同时取        :a->b',b->a'
        a,b不能同时不取        :a'->b,b'->a
        a,b要么都取要么都不取    :a->b,b->a,a'->b',b'->a'
        a,b必须同时取        :同上
        a必须取            :a->a'

    缩点
        tarjan缩点,将所有边反过来

    #以下将强联通分量简称为分量

    判断可行性
        枚举每个集合,判断其两个元素是否在同一个分量内,若在同一个内则不可行

    拓扑排序
        将缩点后的分量进行排序

    构造方案
        按照拓扑后的顺序依次访问所有分量,若某个分量没有被访问则将其标记为"选择",不传递"选择"标记,将被选分量的对立分量标记为"不选择",将其"不选择"的标记沿着传递(注意边已经反过来了)

  • 相关阅读:
    python2中的SSL:CERTIFICATE_VERIFY_FAILED错误的解决办法
    head first 设计模式第一章笔记
    pycharm设置python脚本模板
    zip的压缩和解压命令
    js数组和集合互转
    查看Oracle的连接数
    转 小辉_Ray DOM性能小记
    学习总结之javaScript document对象详解
    MySQL 表的一些操作
    MySQL 的一些操作
  • 原文地址:https://www.cnblogs.com/kuaileyongheng/p/8681246.html
Copyright © 2011-2022 走看看