其实2sat问题比较简单(至少我目前还没做过很难的2sat),
而且也是很好写的一个算法,我估计即使没学过的选手(dalao)考场上遇到了自己手推都能推出来…
问题描述
2sat问题是一种逻辑判定问题
给出一个形如
(a0∨b0)∧(a1xorb1)∧(a2∧bn)...
的逻辑表达式,它的特点是,由与符号连接每个部分,每个部分内部的符号随意,但只能有两个变量
问能否求出
a0−an,b0−bn
的一种取值方案,使得最后的结果为1
问题解法
我看的是这个ppt
伍昱 由对称性解2sat问题
这位大佬写得比较通俗易懂(毕竟我这种蒟蒻都能看明白)
看完之后,你可以做一下和平委员会+2-sat6题(现在有传言说是7道)
做完之后估计就能够掌握这种算法了。
以下是我肝题时的一些总结(没做完2-sat6题的慎入,剧透警告)
个人总结
首先,关于如何建图,表示二元组中的与,或,异或关系(当然还有其他建图方式)
设ai表示i的值为1,bi表示i的值为0
对于一个i与j的关系,x为要求的值and:
x=1:ai→aj,aj→ai,bi→ai,bj→aj
x=0:ai→bj,aj→bi
or:
x=1:bi→aj,bj→ai
x=0:bi→bj,bj→bi,ai→bi,aj→bj
xor
x=1:ai→aj,aj→ai,bi→bj,bj→bi
x=0:ai→bj,aj→bi,bi→aj,bj→ai
可以发现,xor连接的是无向边因为2sat问题是判断是否可行的算法,因此有时候会与二分共同使用
- 同一道题如果对于选取方案的定义不同,方法也不同,所以说,如果你的方法和别人的不一样,你并不一定是错的
- 不要盲目照抄模板,根据图的特有性质,可以对算法适当改写。例如HNOI2010平面图判定这道题中所有逻辑关系均为xor,这样的话就相当于整个图中只有无向边,而且还不需要给出解,那么我们可以发现,这个图中的强连通分量=连通块,所以我们可以用并查集来完成这道题。代码复杂度降低了很多。