2-SAT - 2-SAT问题
问题
有个成员的集合,其中每个成员的值为或。任意两个成员之间有以下几种约束关系:
表示中至少有一个为(或关系,有1则1);
表示中至少有一个为(与关系,有0则0);
表示中一个为,另一个为(异或关系,相同为0,相异为1);
给定包含个成员的集合以及一组约束关系,求一个满足集合的中所有成员的都满足该约束关系。该类问题称为2-SAT问题。
解法
将2-SAT问题转化为有向图的强连通分支问题。
首先构造拥有个顶点的有向图,每对顶点对应集合中的成员的值和。
对于约束,构建边,表示:若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有)。
对于约束,构建边,表示:若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有)。
对于约束,构建边,表示:若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有),若选择顶点则必选择顶点(成员则必然有)。
显然特定的约束条件可以构造出特定的有向图,图中让选取某个顶点时,为了满足约束条件必然要选择其他对应的顶点。2-SAT构造的有向图中的所有强连通分支即为2-SAT问题的所有解,该问题转化为有向图的强连通分支求解,应用Kosaraju算法或Tarjan算法即可。
解决2-SAT问题的时间复杂度与所使用强连通分支算法的时间复杂度相同。