2-SAT - 2-SAT问题


问题

个成员的集合,其中每个成员的值为。任意两个成员之间有以下几种约束关系:

表示中至少有一个为(或关系,有1则1);

表示中至少有一个为(与关系,有0则0);

表示中一个为,另一个为(异或关系,相同为0,相异为1);

给定包含个成员的集合以及一组约束关系,求一个满足集合的中所有成员的都满足该约束关系。该类问题称为2-SAT问题。

解法

将2-SAT问题转化为有向图的强连通分支问题。

首先构造拥有个顶点的有向图,每对顶点对应集合中的成员的值

对于约束,构建边,表示:若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有)。

对于约束,构建边,表示:若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有)。

对于约束,构建边,表示:若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有)。

显然特定的约束条件可以构造出特定的有向图,图中让选取某个顶点时,为了满足约束条件必然要选择其他对应的顶点。2-SAT构造的有向图中的所有强连通分支即为2-SAT问题的所有解,该问题转化为有向图的强连通分支求解,应用Kosaraju算法或Tarjan算法即可。

解决2-SAT问题的时间复杂度与所使用强连通分支算法的时间复杂度相同。


源码

TwoSatisfiability.h

TwoSatisfiability.cpp

测试

TwoSatisfiabilityTest.cpp