专栏文章

2-SAT

算法·理论参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipex8w8
此快照首次捕获于
2025/12/03 10:53
3 个月前
此快照最后确认于
2025/12/03 10:53
3 个月前
查看原文

2-SAT

定义

  • 搞出 NN个集合,每个集合2个元素
  • 若干个<a,b><a, b>表示a,ba, b矛盾(a,ba, b属于不同集合)
  • 然后从每个集合选择一个元素,一共选nn个两两不矛盾的元素
  • 有多钟方案

布尔可满足性

  • 给定一条真值表达式,包括逻辑变量,逻辑与,或,非
  • 是否存在一组对这些变量的赋值,使整条式子结果为 truetrue?
  • 如果可以,就是这条公式的布尔可满足性。

流程

  • 通过连边建图(理解上的难点)
  • 求图的极大强联通子图(tarjantarjan)
  • 把每个子图收缩成单个节点,根据原图关系构造一个有向无环图
  • 判断是否有解,无解就输出(二分)
  • 对新图拓补排序
  • 自低向上选择,删除
  • 输出

建图

  • 利用有向边<i,j><i, j> 表示选了ii,必须选jj
  • ii 表示某个点是truetrue,那么ii'表示某个点是falsefalse
  • 因为限制了关系,所以可以逻辑建边
    • 如果给出a,ba, b限制关系,a,ba, b必须一起选,(ab)(!a!b)==true(a \lor b) || (!a \lor !b) == true那么选a必选b,建边<i,j>,<j,i><i, j>, <j, i> 还有 <i,j>,<j,i><i', j'>, <j', i'>
    • 如果给出a,ba, b限制关系,a,ba, b不能一起选,那么(a!b)(!ab)==true(a \lor !b) || (!a \lor b) == true,建边<i,j>,<j,i><i, j'>, <j, i'>
    • 如果必须选a,那么a==truea == true,建边<i,i><i', i>
    • 如果a一定不选,那么 !a==true!a == true,建边<i,i><i, i'>
  • 这样,出现有向图
  • 如果能找到一个强联通分量,那么这个强联通分量中的点,若选取必须全部选取,不选取一定全不选取。
  • 只要满足这个有向图中联通的点不会导致i,ii, i'同时被选取,如果不存在矛盾,那么当前问题就是有解的。

评论

0 条评论,欢迎与作者交流。

正在加载评论...