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

    是什么?

    (n) 个变量,每个变量取 0 (or) 1 表示取或不取,满足一些约束

    • (a xor b = 1)(a)(b) 有一个选,一个不选
    • (a xor b = 0)(a)(b) 要么都选,要么都不选
    • (a or b = 1)(a)(b) 至少选一个
    • (a or b = 0)(a)(b) 都不能选
    • (a and b = 1)(a)(b) 必须都选
    • (a and b = 0)(a)(b) 可以选一个或者不选

    怎么做?

    我们把一个点拆成两个,(x, eg x)
    考虑上面的关系,如果选 (a) 必须选 (b) 的话就从 (a)(b) 连一条边
    比如 (a xor b = 1),选 (a) 就必须选 ( eg b),选 (b) 就必须选 ( eg a) 所以连边 ((a, eg b), ( eg a, b), (b, eg a), ( eg b, a))

    其他关系同理,这里列出

    • (a xor b = 1)((a, eg b), ( eg a, b), (b, eg a), ( eg b, a))
    • (a xor b = 0)((a, b), ( eg a, eg b))
    • (a or b = 1)(( eg a, b), ( eg b, a))
    • (a or b = 0)((a, eg a), (b, eg b))
    • (a and b = 1)(( eg a, a), ( eg b, b))
    • (a and b = 0)((a, eg b), (b, eg a))

    连完边后,(tarjan) 求强联通分量,如果 (x)( eg x) 在同一个强联通分量里,则无解,否则必有至少一组解

    对于 (x) 必选连边 (( eg x, x))(x) 必不选连边 ((x, eg x)) 你可能有些疑惑,接下来看了如何求解就没了

    首先缩点,在同一个强连通分量里的点要选必须一起选,然后对缩完点后的 (DAG) 求一个拓扑序

    考虑 (a o b) 表示 (a) 能到达 (b),也就是选 (a) 必须选 (b)
    如果 (a)( eg a) 不联通,那它们随便取
    如果 (a o eg a)( eg a) 不冲突
    如果 ( eg a o a)(a) 不冲突

    求出拓扑序后,如果 ( eg a)(a) 前面则选 (a) 否则选 ( eg a),这样为什么是对的呢 ?
    观察上面的边,发现他们是对偶的,如果 (a)(b) 在同一个强联通分量中,那么 ( eg a)( eg b) 一定在一起

    • 例题 POI 2011 Consprirary

    没了

  • 相关阅读:
    mysql版本问题
    敏感词过滤
    身份证校验-----15位,18位后端
    身份证号校验---------前端
    layui时间显示
    第一次入坑docker
    mysql索引解析
    mysql数据库索引调优
    设计模式-代理模式
    c#中abstract与virtua、overridel的用法
  • 原文地址:https://www.cnblogs.com/XiaoVsun/p/13054029.html
Copyright © 2011-2022 走看看