模型
有 N N N 个变量 , , , 每个变量只有两种可能的取值 . . . 在给定 M M M 个条件 , , , 每个条件都是对两个变量的取值限制 . . . 求解 : : : 是否存在对 N N N 个变量的合法赋值 , , , 使 M M M 个条件均得到满足 . . .
设一个变量 A i ( 1 ≤ i ≤ N ) A_i(1\le i\le N) Ai(1≤i≤N) 的两种取值分别是 A i , 0 A_{i,0} Ai,0 和 A i , 1 . A_{i,1}. Ai,1. 在 2 − S a t 2-Sat 2−Sat 问题中 , , , M M M 个条件都可以转化成统一的形式 − − - - −− 若变量 A i A_i Ai 赋值为 A i , p , A_{i,p}, Ai,p, 则变量 A j A_j Aj 必须赋值为 A j , q , A_{j,q}, Aj,q, 其中 p , q ∈ { 1 , 0 } . p,q\in\{1,0\}. p,q∈{1,0}.
判定
- 建立 2 N 2N 2N 个节点的有向图 , , , 每个变量 A i A_i Ai 对应两个节点 , , , 记为 i , i + N . i,i+N. i,i+N.
- 考虑每一个条件
,
,
, 形如
"
"
" 若变量
A
i
A_i
Ai 赋值为
A
i
,
p
,
A_{i,p},
Ai,p, 则变量
A
j
A_j
Aj 必须赋值为
A
j
,
q
,
A_{j,q},
Aj,q, 其中
p
,
q
∈
{
1
,
0
}
.
p,q\in\{1,0\}.
p,q∈{1,0}.
"
"
" 从
i
+
p
∗
N
i+p*N
i+p∗N 到
j
+
q
∗
N
j+q*N
j+q∗N 连一条有向边
.
.
.
注意 : : : 上述条件蕴含了它的逆反命题 , , , 即 " " " 若变量 A j A_j Aj 赋值为 A j , 1 − q , A_{j,1-q}, Aj,1−q, 则变量 A i A_i Ai 必须赋值为 A i , 1 − p , A_{i,1-p}, Ai,1−p, 其中 p , q ∈ { 1 , 0 } . p,q\in\{1,0\}. p,q∈{1,0}. " " " 若给出的条件不包含它的逆反命题 , , , 应该从 j + ( 1 − q ) ∗ N j+(1-q)*N j+(1−q)∗N 到 i + ( 1 − p ) ∗ N i+(1-p)*N i+(1−p)∗N 连一条有向边 . . . - 用 T a r j a n Tarjan Tarjan 算法求出当前的有向图的所有强连通分量 . . .
- 若存在 i ∈ [ 1 , N ] , i\in [1,N], i∈[1,N], 满足 i i i 和 i + N i+N i+N 属于同一个强连通分量 , , , 这说明若变量 A i A_i Ai 赋值为 A i , p , A_{i,p}, Ai,p, 则变量 A i A_i Ai 必须赋值为 A i , 1 − p , A_{i,1-p}, Ai,1−p, 显然不可能 . . .
- 根据
T
a
r
j
a
n
Tarjan
Tarjan 算法的特性
,
,
, 编号更小的
S
c
c
Scc
Scc 显然处于缩点后拓扑序的末尾
,
,
, 同时
,
,
, 在一个
S
c
c
Scc
Scc 中
,
,
, 只要确定了一个变量的取值
,
,
, 其他
S
c
c
Scc
Scc 的取值也确定了
,
,
, 其次
,
,
, 在缩点后的
D
a
g
Dag
Dag 中
,
,
, 如果一个点有出度
,
,
, 会使出边的点被强制更新
,
,
, 所以我们应该选择出度为零的点
.
.
.
综上两 , , , 如果 B e l o n g i > B e l o n g i + N ( i ∈ [ 1 , N ] ) Belong_i>Belong_{i+N}(i\in[1,N]) Belongi>Belongi+N(i∈[1,N]) , , , 我们令变量 A i A_i Ai 赋值成 A i + N . A_{i+N}. Ai+N.
构图方法
1.如果有一个变量的取值直接导致无解
,
,
, 则把这个取值和另一个取值连有向边
,
,
, 这样如果被迫选择了这个变量
,
,
, 直接无解
.
.
.
2.如果某个变量必须取某个取值
,
,
, 那么把另一个取值直接和这个取值连有向边
.
.
.
519



被折叠的 条评论
为什么被折叠?



