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

本文探讨了如何通过2-SAT问题的方法解决关于A、B、C三人性别推理的问题,利用布尔变量和逻辑规则构建有向图,解释了一元和二元限制的构图方法,并介绍了如何利用Kosaraju算法判断解的存在性和构造可行方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

导引问题

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点表示xix_ixi=False i1i^1i1表示xix_ixi=True

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

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

输出可行方案

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

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

一元限制的构图方法

限制:xix_ixi=True

连边i->i1i^1i1

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

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

二元限制的构图方法

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

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

命题与其逆否命题等价。

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

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

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

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

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值