2-sat问题学习记录
如果你不知道什么是sat问题,请看以下问答.
Q:sat问题是什麽?
A:首先你有n个布尔变量,然后你有一个关于这n个布尔变量的布尔表达式,问你,如果让你随意给这n个布尔变量赋值,这个布尔表达式能否成立.
Q:k-sat是什麽意思?
A:把sat问题中的布尔表达式不断进行转化,直到变为一个由与连接的若干个[由或连接的若干个(布尔变量或被非运算了的布尔变量)],那么所有的[]中()的数量的最大值为k.
Q:怎么转化布尔表达式?
A:按照 !(a||b) -> (!a)&&(!b) , !(a&&b) -> (!a)||(!b) , (a&&b)||c -> (c||a)&&(c||b) 的法则来转化.
Q:为什么k>2的时候的k-sat问题是NPC问题?
A:我也不知道啊……
现在,你已经知道了什么是sat问题,那什么是2-sat问题呢?
结合以上定义,朴素地说,就是,你有n个布尔变量,并且对于这n个布尔变量,你有若干个二元或者一元限制,问你能否给这n个布尔变量赋值,使得所有的限制满足.
对于2-sat问题,有时候我们不仅仅要问能否成立,还要询问方案,而现在解决2-sat相关问题的流行做法,就是建图.
建图的话,就是把每个布尔变量拆成两个点,一个表示true,一个表示false,并且按照要求的限制,在这些点中连有向边,a->b表示若a则b.
当限制为一元的时候,就是确定了某个布尔变量的值,这个时候,对于这个布尔变量在图上的两个点,假设确定的值对应的点为a,另一个点为b,那我们连b->a.
当限制为二元的时候,就是两个布尔变量之间的限制,所以这两个布尔变量要相互连边.
当建完图之后,我们可以采取dfs或者Tarjan,来进行相关操作.
具体建图与操作还有很多……
有关sat问题的更多信息:
https://blog.csdn.net/seaskying/article/details/51726217
有关2-sat问题的相关操作的更多信息:
https://wenku.baidu.com/view/afd6c436a32d7375a41780f2.html
https://wenku.baidu.com/view/0f96c3daa58da0116c1749bc.html
https://www.cnblogs.com/-ZZB-/p/6635483.html
有关建图的更多信息:
COGS 313. [POI2001] 和平委员会
bzoj 2199: [Usaco2011 Jan]奶牛议会
bzoj 1997: [Hnoi2010]Planar
UOJ #210.【UER #6】寻找罪犯
LOJ #6036.「雅礼集训 2017 Day4」编码