2-SAT问题的方案输出

2-sat 推荐学习资料:

伍昱的2003年IOI国家集训队论文《由对称性解2-sat问题》

论文链接:https://wenku.baidu.com/view/31fd7200bed5b9f3f90f1ce2.html

注:

本博文只分析如何输出一组可行解,请读者确保已学习了判断是否有解

本人水平不高,若有分析不得当之处,欢迎指出

法一、tarjan+构建反图+拓扑排序

在原图tarjan缩点后得到的有向无环图的反图上拓扑排序

边拓扑边干两件事儿:

1、选择当前栈顶所代表的问题

2、删除与栈顶问题相对立的问题,删除它在反图上的后继问题

个人理解:

1、一般情况下,2-SAT的构图是对称的,(原因去看论文)

设i与i'为一对相互对立的问题

若在原图中存在下面的左边的连通子图则必存在右边的连通子图

2-SAT问题的方案输出

非一般情况比如NOI2017 Day2 T1 游戏,

输入数据会使存在边i-->i',但不一定存在边i'-->i

即给出的约束条件使原本就设定的对立问题 再连边

2、在原图中一条边u-->v代表着如果选择问题u则必须选择问题v

而选择了问题v不一定要选择问题u

在实现的时候,如果在反图上进行拓扑排序,

反图中入度为0的点,对应着原图中出度为0的点,它在原图中没有后继问题

相当于省去了在原图中拓扑排序的还要选择它所有的后继问题

3、在原图中一条边u-->v代表着 如果不选v,则一定不选u

栈顶问题的对立问题一定不能选,所以原图中还要删除对立问题的所有前驱问题

对应到反图中就是后继问题

在具体实现的时候,我们可以使这些栈顶对立问题的后继问题永远不能入栈

不删除栈顶对立问题的出边即可

法二:tarjan

tarjan缩点时会给点重新编号

对于一对相互对立的问题,谁的新编号小就选谁

此方法对于非对称图也适用

反图上在拓扑排序中选择,等价于

原图(缩点后的树)上 从叶子节点开始,自底部向上选择的过程

而tarjan缩点重标号也是从叶子节点往上

上一篇:PHP利器-WAMPServer


下一篇:Eclipse 中如何使用 Courier New 字体(转载)