我正在使用此solution来查找给定公式的可满足性。 (通过检查SCC)。如果公式是可满足的,是否有任何有效的方法(在我的情况下,有效的方法并不比多项式时间差)如何找到每个变量的值?
它不一定是C ++,我只是使用相同的算法。
答案 0 :(得分:2)
如链接的答案中所述,您可以将2-SAT问题转换为蕴涵图,因为(x | y)<=>(〜x => y)&(〜y => x)
要进行令人满意的分配,我们需要为每个变量 x 选择 x 或〜x ,以便:>
由于我们构造隐含图的方式,规则(2)已被规则(1)覆盖。如果图中有(a =>〜x),则图中也有(x =>〜a)。另外,如果(a => b)和(b =>〜x),那么我们就有(x =>〜b)和(〜b =>〜a)
因此,实际上只有规则(1)。这导致了类似于拓扑排序的线性时间算法。
如果我们要将图中的每个SCC折叠为单个顶点,则结果将是非循环的。图中必须至少有一个SCC,这没有外向的含义。
所以:
重复直到图形为空。该过程将始终终止,因为删除SCC不会引入周期。
步骤(2)确保在我们从图形中删除SCC之前,当前赋值确定所有与之有牵连的真假。
如果问题实例是可满足的,那么您将获得对问题中提到的每个变量的满意分配。