本文主要是介绍2SAT问题解题报告,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
2SAT是P问题,能在多项式时间内解决。这里对方法之一进行总结。
测试数据格式如下:
1000000
-383037 -585864
575603 -494722
-628477 805085
-502855 685868
923336 -606921
-653863 424389
333542 -656925
-809061 874253
即范围为1~1000000,“-”号表示取逆。比如-383037 -585864表示~383037U~585864,575603 -494722表示575603U~494722
判断是否存在一种取法,能够满足上述所有的clause。
解法是用图论中的强连通子图。具体来说,首先构造一个有向图。每个数字和它的逆都是一个单独的节点。对于每个条目,如AUB,则在图中加入两条边:~A->B和~B->A。即A如果为负,则B为正;反之,如果B为负,则A为正。这两条边和AUB是等效的,都制约了A和B的取值。构造好有向图后就构建强连通子图。一个强连通子图中的变量相互制约,必须同时成立。
所以,如果有一对变量A和~A在同一个强连通子图中,则该2SAT无法满足。因为变量A和~A是无法同时成立的。
public class TwoSAT {public static void main(String[] args){In in = new In(args[0]);int N = in.readInt();int V = 2 * N;Digraph digraph = new Digraph(V);whil
这篇关于2SAT问题解题报告的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!