#2-SAT算法
##2-SAT问题的定义
SAT是适定性(Satisfiability)问题的简称 。一般形式为k-适定性
问题,简称 k-SAT。 当k>2时,k-SAT是NP完全的。因此一般
讨论的是k=2的情况,即2-SAT问题。
适定性问题?What the Huak?
什么意思呢?
就2-SAT问题而言。给定N个元素,每个元素有两种取值,要么为真,要么为假。(注意,是两种情况必须选且只能选1个)并且存在若干约束条件,这些条件总是涉及至多两个元素,规定了它们的取值的关系。
下文中为了表述方便,令元素x取真时为x,取假时为x’,记元素x的取值为A[x]。
上述的限制条件形如
(令x取真时,A[x]=1,x取假时,A[x]=0)
A[x] == 1
A[x] == 0
A[x] & A[y] == 1
A[x] & A[y] == 0
A[x] & !A[y] == 1
A[x] | A[y] == 1
A[x] | A[y] == 0
A[x] | !A[y] == 1
A[x] ^ A[y] == 1
A[x] ^ A[y] == 0
A[x] ^ !A[y] == 1
比方说 A[x] & !A[y]==1,就是当A[x]和!A[y]必须相等,因此要么A[x]=1,A[y]=0,要么A[x]=0,A[y]=1。
满足以上的规则的问题就是2-SAT问题。
##2-SAT算法
对于N个元素中的每个元素i,我们把它分成i和i’两个点,分别代表i取真,i取假的情况。
接下来重申一个重要条件:i和i’这两者中必须且只能选一个。
用这2*N个点建一个有向图,其中边 <x,y>
代表选了x就必须选y。
同理<x',y'>
代表选了x‘就要选y’。<x,y'>
,<x',y>
类似。
我们随便找一个条件,如A[x] | A[y] == 1
的条件。
当A[x]取1,时,A[y]取1和0都可以。
当A[x]取0,时,A[y]必须取1。
当A[y]取1,时,A[x]取1和0都可以。
当A[y]取0,时,A[x]必须取1。
因此我们要连<x',y>
,<y',x>
。