2SAT的一点理解

首先大概说一下2sat的步骤

1.用tarjan求出强联通分量,这一步是因为如:1-->2 ,  2-->3, 3-->1这么三组关系,(i-->j代表的意思是选择了i,则必须也要选择j),这样三组关系就是强联通分量,也意味着选择了其中一个数字,其他的数字也将必须被选择。

2.判断一个强连通分量中有没有两个选项都有,比如1和1'都出现在一个全连通分量中,那肯定无解,因为1和1'必须只能选一个,而他们在一个强联通分量中的后果是要么都选,要么都不选。如果没有这种情况出现,那么必定有解。

3.进行解的求取。对前面的强连通分量重新构逆图,然后进行拓扑排序,两个分量中,现在拓扑排序中输出的那个就应该选入解。为什么呢?因为i-->j代表的意思是选择了i,则必须也要选择j,如果不把边取反,变成i<--j才会出问题。因为j是可以随意取的,他的自由度高于i.随意要先从自由度高的开始进行选择。选择了j,那么i就肯定可以选了,所以deg[i]--,直到i所需要满足的条件点全部凑齐后,i才可以入栈,即选择。如果先出现一个点选了,而他的相反点还没有被选过。那不管了,反正选这个点肯定是解的。

猜你喜欢

转载自blog.csdn.net/qq_39861441/article/details/87897692