2-SAT问题

问题定义

SAT(satisfiability / 适定性问题):对于一个合取范式,求解使得该合取范式的值为1。

a and (b or c) and (d or e or f) and ... 2-SAT:该合取范式的每一个子式只包含两个变量。

(a or b) and (c or d) and (e or f) and ... 2-SAT算法

构造有向图G。构造方法:

合取范式中的每个变量衍生两个顶点:0和1(即:a=0, a = 1, b = 0, b = 1 ...)。 说明:为了方便起见,下文将a = 0的点简写为a0,a = 1的点简写为a1,以此类推。

合取范式中的每个子式衍生两条有向边:例如,由(a or b)得到a0 -> b1、b0 -> b1,意为若a为0则b必须为1,若b为0则a必须为1。 求解步骤1中得到的有向图的强连通分量。如果存在某变量x,由该变量衍生的两个顶点x0和x1位于同一强连通分量上,则问题无解;否则将位于同一强连通分量上的点缩为一个点,得到新的有向图G'。

将步骤2中得到的有向图的边反向,得到有向图G''。

将步骤3中得到的有向图的顶点G''置为“未着色”状态,按照拓扑顺序重复以下操作:

选择第一个未着色的顶点X,将X染成红色。

把所有与X矛盾的顶点Y及其子孙全部染成蓝色。(G''中某顶点X的矛盾点的定义:G中存在x0(或x1)属于X,x1(或x0)属于Y,则Y为X的矛盾点)

重复操作1和2,直到不存在未着色的点为止。

G''中被染成红色的点在图G中对应的顶点的集合,即为该2-SAT问题的一组解。

转载于:https://my.oschina.net/chunquedong/blog/1865187

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值