【算法与数据结构】——2-SAT问题

导引问题

A,B,C三人中有两个女生;
如果A是男生,那么B一定是女生;
A和C性别相同;
求A、B、C三人的性别。

2—SAT问题

SAT的全称:satisfiability(可满足性 )
有一个有N个布尔值组成的序列A,给出一些限制关系,比如A[x]ANDA[y]=0、A[x] OR A[y] OR A[z]=1等,要确定A[0···N-1]的值,适得其反满足所有限制关系,这就是SAT问题。

特别的,若每种限制关系中最多只对两个元素进行限制,则称为2—SAT问题。

2—SAT问题是有多项式解法的,而3—SAT就是npc问题。

2—SAT问题是要确定N个布尔变量的值,使得其满足所有限制关系。

判断是否有解

建立2N个点的有向图,不妨设:i点表示 x i x_i xi=False i 1 i^1 i1表示 x i x_i xi=True

一条u->v的有向边表示如果选择了u,那么一定要选择v。
2—SAT有解当且仅当对于任意一个i(1<=i<=N)不能出现如下情况:在这个有向图中从i点出发可以到达 i 1 i^1 i1点,且从 i 1 i^1 i1点出发可以到达i点。

由此只需要判断 i 和 i 1 i和i^1 ii1是否位于同一强连通分量即可!使用Kosaraju算法可以在线性时间内求出强连通分量。

输出可行方案

如果从i点出发可以到达 i 1 i^1 i1点,则选了i会导致选 i 1 i^1 i1,矛盾,因此只能选 i 1 i^1 i1

Kosaraju算法在求强连通分量的时候顺带求出了一个遍历顺序q[1],q[2],…,q[cnt];只需要比较i和 i 1 i^1 i1所属强连通分量在q中位置的前后关系即可构造出可行方案。

一元限制的构图方法

限制: x i x_i xi=True

连边i-> i 1 i^1 i1

表示如果i选了False那么i必须要是true

与i只能选一个True或者False矛盾,强迫i只能是True

二元限制的构图方法

一条边u->v的含义:若u则v。

命题"若u则v"的逆否命题为"若非v则非u"

命题与其逆否命题等价。

建图时需要将其逆否命题建图

即u->v同时 v 1 − > u 1 v^1->u^1 v1>u1

限制u or v=true
若u为假,则v为真:连边u-> v 1 v^1 v1
若v为假,则u为真:连边v-> u 1 u^1 u1

限制u or v=false
u为假:连边 u 1 − > u u^1->u u1>u
v为假,连边 v 1 − > v v^1->v v1>v

限制u and v=false
若u为真,则v为假:连边 u 1 u^1 u1->v。
若v为真,则u为假:连边 v 1 v^1 v1->u。

限制u and v=true
u为真,连边 u − > u 1 u->u^1 u>u1
v为真,连边 v − > v 1 v->v^1 v>v1

限制u != v
若u为真,则v为假:连边 u 1 u^1 u1->v。
若u为假,则v为真:连边 u − > v 1 u->v^1 u>v1
若v为真,则u为假:连边 v 1 v^1 v1->u。
若v为假,则u为真:连边 v − > u 1 v->u^1 v>u1

限制 u==v
若u为真,则v为真:连边 u 1 u^1 u1-> v 1 v^1 v1
若u为假,则v为假:连边 u − > v u->v u>v
若v为真,则u为真:连边 v 1 v^1 v1-> u 1 u^1 u1
若v为假,则u为假:连边 v − > u v->u v>u

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值