做完了POJ的6道2SAT,总结一下
2SAT算法流程
1.构图
2.求SCC
3.判断有无解
4.缩点反向建图
5.拓扑排序
6.染色并输出
构图模型:
模型一:两者(A,B)不能同时取
那么选择了A就只能选择B’,选择了B就只能选择A’
连边A→B’,B→A’
模型二:两者(A,B)不能同时不取
那么选择了A’就只能选择B,选择了B’就只能选择A
连边A’→B,B’→A
模型三:两者(A,B)要么都取,要么都不取
那么选择了A,就只能选择B,选择了B就只能选择A,选择了A’就只能选择B’ ,选择了B’就只能选择A’
连边A→B,B→A,A’→B’,B’→A’
模型四:两者(A,A’)必取A
连边A’→A
例子:poj2749:奶牛有矛盾,这个矛盾是对true 和 false都有影响,即(A,B)不能同时取,(A',B')不能同时取,两个模型一;喜欢即模型三;根据距离建边则是模型一
poj2723:钥匙不能同时取,模型一;打开门,模型二
poj3648:太鬼畜,下一个
poj3678: 经典;AND为1,必须取两个true,所以A->B ,B->A,A'->A,B->B'; AND为0,模型一; OR为1,模型二; OR为0,与AND1类似; XOR类似模型三