2-sat小记
记得好像写了,但找了一下发现没写,于是写一下
2-sat
用于求 p→q 的蕴含关系集合的一组解(或判断无解)
流程:先构造蕴含关系集合,谁成立/不成立时另一个必须怎么样
对每个命题p建p和非p(p'),每个蕴含关系p→q连边 (p,q), (q',p'),一定要有逆否的反向边
然后
① 跑tarjan缩点,若存在p和p'在同一强连通分量就无解
② 否则有解,对缩点后的图求拓扑序,在p和p'中选择拓扑序较大(较后)的
一个重要的认识是,2-sat可以解决任何蕴含关系集合,不只是and or xor之类的
常见建图(考虑用什么约束条件把想要的效果准确表示出来)
i必选:i'→i
i and j=0:i→j',j→i'
i or j=1:i'→j,j→i'
i xor j=0:i→j,i'→j',j→i,j'→i'
i xor j=1:i→j',i'→j,j→i',j'→i
i→j:i→j,j'→i'
(无论怎样建图,都要保证有反向边)