①有向图哈密尔顿圈
≤
p
\leq_p
≤p无向图的哈密尔顿圈
目标:给定一个
n
n
n个节点的有向图
G
=
(
V
,
E
)
G = (V,E)
G=(V,E),我们可以构造一个含
3
n
3n
3n个顶点的无向图
G
′
G^{'}
G′。有向图
G
G
G拥有哈密尔顿圈当且仅当无向图
G
′
G^{'}
G′拥有哈密尔顿圈。
构图思路:把有向图
G
G
G中的一个顶点,拆分成三个顶点(蓝、黑、白)
证明:
⇒
\Rightarrow
⇒
假设
G
G
G存在一个有向的哈密尔顿圈
Γ
\Gamma
Γ,那么
G
′
G^{'}
G′也有一个跟上述顺序一致的无向哈密尔顿圈
Γ
′
\Gamma^{'}
Γ′。
⇐
\Leftarrow
⇐
假设
G
′
G^{'}
G′有一个无向哈密尔顿圈
Γ
′
\Gamma^{'}
Γ′。
Γ
′
\Gamma^{'}
Γ′访问
G
′
G^{'}
G′中的顶点必须选择一下两种顺序中的一个:
- 黑,白,蓝
- 黑,蓝,白
Γ ′ \Gamma^{'} Γ′中的黑色节点对应 Γ \Gamma Γ中的哈密尔顿圈或者逆序中的一个。
②
3
−
S
A
T
≤
p
3-SAT\leq_p
3−SAT≤p有向图哈密尔顿圈
目标:给定一个
3
−
S
A
T
3-SAT
3−SAT的实例,我们都能构造出一个图
G
G
G。
3
−
S
A
T
3-SAT
3−SAT实例有解当且仅当图
G
G
G含有一个哈密尔顿圈。
构图思路:
- 图 G G G中哈密尔顿圈的个数为 2 n 2^n 2n个,每个文字有真假2种可能,一共有 n n n个,从左到右赋值为真,从右到左赋值为假
- 对于每个从句,若存在
x
i
x_i
xi,则增加一个节点,并从左到右增加边;若存在
x
i
‾
\overline{x_i}
xi,则增加一个节点,并从右到左增加边
证明:
⇒
\Rightarrow
⇒
假设
3
−
S
A
T
3-SAT
3−SAT实例
ϕ
\phi
ϕ有满足的真值指派
x
∗
x^{*}
x∗,那么我们在
G
G
G中找到一个哈密尔顿圈
Γ
\Gamma
Γ如下:
- 如果 x i ∗ = t r u e x_i^{*} = true xi∗=true,我们从左到右穿过第 i i i行
- 如果 x i ∗ = f a l s e x_i^{*} = false xi∗=false,我们从右到左穿过第 i i i行
- 对于每个句子 C j C_j Cj,至少存在一行按照我们上述的方向,把句子节点铰接进圈内,我们只把句子节点铰接进圈有且仅有一次。
⇐
\Leftarrow
⇐
假设
G
G
G中有一个哈密尔顿圈
Γ
\Gamma
Γ
如果
Γ
\Gamma
Γ加入了句子节点
C
j
C_j
Cj,并假设与
C
j
C_j
Cj前后邻接的节点通过边
e
e
e相连。我们从圈中删除节点
C
j
C_j
Cj和其直连边,并用边
e
e
e代替,得到
G
−
C
j
G-{C_j}
G−Cj的哈密尔顿圈。
循环执行上述方法,我们得到在
G
−
{
C
1
,
C
2
,
…
,
C
k
}
G-\{C_1,C_2,\dots,C_k\}
G−{C1,C2,…,Ck}上的哈密尔顿圈
Γ
′
\Gamma^{'}
Γ′。
如果
Γ
′
\Gamma^{'}
Γ′在第
i
i
i行的遍历方向是从左到右的,那么置
x
i
∗
=
t
r
u
e
x_i^*=true
xi∗=true,否则置
x
i
∗
=
f
a
l
s
e
x_i^*=false
xi∗=false。
按照上述正确方向遍历进行真值指派,每个句子都会被满足,即原实例
ϕ
\phi
ϕ可满足。
③
3
−
S
A
T
≤
p
3-SAT\leq_p
3−SAT≤p有向图哈密尔顿路径
≤
p
\leq_p
≤p无向图哈密尔顿路径
≤
p
\leq_p
≤p最长路径问题
最长路径问题: 给定一个有向图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E),是否存在包含至少
k
k
k条边的简单路径
证明:
在有向图哈密尔顿圈的构图上,删除从
t
t
t到
s
s
s的边,便得到有向图哈密尔顿路径的实例。有向图哈密尔顿路径可以通过一个节点扩展成三个节点的方式,多项式规约到无向图哈密尔顿路径问题。无向图哈密尔顿路径问题,在原图基础上,令
k
=
∣
V
∣
−
1
k = |V|-1
k=∣V∣−1,就可以得到一个最长路径的实例。若包含一个至少为
k
=
∣
V
∣
−
1
k = |V|-1
k=∣V∣−1的简单路径,则存在一条哈密尔顿路径。
④哈密尔顿圈问题
≤
p
\leq_p
≤pTSP问题
TSP问题:给定
n
n
n个城市以及两两城市之间的距离
d
(
u
,
v
)
d(u,v)
d(u,v),问是否存在一个旅游访问
n
n
n个城市一次且长度
≤
D
\leq D
≤D。
哈密尔顿问题和TSP问题的区别
由于售货员可以从某个城市到其他任何一个城市,因此,该问题对应的是一个完全图(设为G′),而关于判断哈密尔顿回路的图(设为G)并不一定为完全图。
目标:给定一个哈密尔顿圈的实例
G
=
(
V
,
E
)
G=(V,E)
G=(V,E),创建一个TSP问题的完全图实例,
n
n
n个城市两两间的距离函数定义如下:
d
(
u
,
v
)
=
{
1
i
f
(
u
,
v
)
∈
E
2
i
f
(
u
,
v
)
∉
E
d(u,v)=\left\{ \begin{aligned} 1 && if(u,v)\in E\\ 2 && if(u,v)\notin E \end{aligned} \right.
d(u,v)={12if(u,v)∈Eif(u,v)∈/E
TSP问题有一个长度
≤
n
\leq n
≤n的旅游当且仅当
G
G
G中含有一个哈密尔顿圈
⑤
3
−
S
A
T
3-SAT
3−SAT问题
≤
p
\leq_p
≤p 3着色问题
3着色问题:给定一个无向图
G
G
G,问能否用三种颜色给顶点着色,使得邻接顶点间颜色不同。
3着色问题
≤
p
\leq_p
≤pK寄存器分配问题,对于
k
≥
3
k\geq3
k≥3
寄存器分配问题可以建模成
k
k
k着色问题,一个寄存器一个时间只能存一个数据,一个时间点可能涉及多个数据参与运算,此时需要多个寄存器。
目标:给定一个
3
−
S
A
T
3-SAT
3−SAT的实例
ϕ
\phi
ϕ,我们可以构建一个3着色的实例图
G
G
G。
ϕ
\phi
ϕ可满足当且仅当
G
G
G是可3着色的。
构图思路:
每个文字连接其对立面,所有文字连接到
B
B
B。对于每个从句,在包含的文字下方,增加6个顶点和13条边。
⇒
\Rightarrow
⇒
若
ϕ
\phi
ϕ可满足,即每个从句中至少有一个文字是真,赋值为绿色。我们可以在其余两个文字真假都可以的情况下,完成三着色,如下图所示:
⇐
\Leftarrow
⇐
若图
G
G
G可三着色,则
ϕ
\phi
ϕ是可满足的。
反证法:若
ϕ
\phi
ϕ是不可满足的,即
ϕ
\phi
ϕ中文字对应的顶点全部着红色,则推出图
G
G
G不可以三着色。
⑥一般图的三着色
≤
p
\leq_p
≤p平面图的三着色
注意:一般图的
k
k
k着色仍是
N
P
C
NPC
NPC问题,只不过
k
k
k越大,复杂度的指数底数越小而已,但仍不是多项式时间的。平面图的4着色是
P
P
P问题,最优可
O
(
n
2
)
O(n^2)
O(n2)解决。
目标:任意给出一个图
G
G
G,我们能构造出一个平面图
G
′
G^{'}
G′。原图
G
G
G可3着色当且仅当平面图
G
′
G^{'}
G′可三着色。
构图技巧:借助转换小工具,该小工具满足对角着色必须相同
⑦
3
−
S
A
T
≤
p
3-SAT\leq_p
3−SAT≤p子集和问题
子集和问题:给定
n
n
n个数
w
1
,
…
,
w
n
w_1,\dots,w_n
w1,…,wn和整数
W
W
W,是否存在一个子集,其中所有元素的和等于
W
W
W
目标:任给一个
3
−
S
A
T
3-SAT
3−SAT实例
ϕ
\phi
ϕ,我们都能构造出一个子集和问题的实例。实例
ϕ
\phi
ϕ可满足当且仅当子集和问题有解
构图思路:任给一个含
n
n
n个变量(每个句子只装3个变量)
k
k
k个句子的
3
−
S
A
T
3-SAT
3−SAT问题的实例
ϕ
\phi
ϕ,形成
(
2
n
+
2
k
)
×
(
n
+
k
)
(2n+2k)\times(n+k)
(2n+2k)×(n+k)的表格
构造解析
- x i x_i xi和 x i ‾ \overline{x_i} xi只能选一个,因此左边 n n n列各自和为1(即 W W W的前 n n n位为1)
- C i C_i Ci中至少有一个文字为真,因此句子本身列的和至少为 1 1 1。为凑够4,从下面 { 1 , 2 } \{1,2\} {1,2}选其中一个或者全选凑够4,选了相应的数,即选中了相应行对应的数。
证明:
⇒
\Rightarrow
⇒
假设实例
ϕ
\phi
ϕ有一个可满足的真值指派
x
∗
x^*
x∗
如果
x
i
∗
=
t
r
u
e
x_i^*=true
xi∗=true,选择
x
i
x_i
xi所在行对应的整数;否则选择
x
i
‾
\overline{x_i}
xi对应的整数
每个
x
i
x_i
xi对应的和为1,每个
C
j
C_j
Cj对应的和至少为1,加上虚拟的整数,使
C
j
C_j
Cj对应的列和为4
这样我们得到一个整数集合,并从整数中找到一个子集,其和为
W
W
W
⇐
\Leftarrow
⇐
假设存在一个子集
S
∗
S^*
S∗和为
W
W
W
由于要满足和为
W
W
W,因此子集
S
∗
S^*
S∗只能从
x
i
x_i
xi和
x
i
‾
\overline{x_i}
xi中选择一个,不能全选
如果选定
x
i
x_i
xi,则令
x
i
∗
=
t
r
u
e
x_i^* =true
xi∗=true,否则令
x
i
∗
=
f
a
l
s
e
x_i^* =false
xi∗=false
同样要满足和为
W
W
W,因此至少从
C
j
C_j
Cj中选择一个文字,不然和达不到4.
这样我们就找到了一个可满足的真值指派。
⑧子集和问题
≤
p
\leq_p
≤p背包问题
背包问题:给定一个物品集合
X
X
X,重量为
u
i
≥
0
u_i\geq0
ui≥0,价值
v
i
≥
0
v_i\geq0
vi≥0,背包能承受的总重量不超过
U
U
U,给定一个目标价值
V
V
V,是否存在一个子集
S
⊆
X
S\subseteq X
S⊆X:
∑
i
∈
S
u
i
≤
U
,
∑
i
∈
S
v
i
≥
V
\sum_{i\in S} u_i\leq U, \sum_{i\in S}v_i\geq V
i∈S∑ui≤U,i∈S∑vi≥V
规约思路:
对于任意一个子集和实例,我们按照如下构造一个背包实例:
{
u
i
=
v
i
=
w
i
U
=
V
=
W
\left\{ \begin{aligned} u_i = v_i = w_i\\ U = V = W\\ \end{aligned} \right.
{ui=vi=wiU=V=W
这样子集和有解当且仅当背包有解
⑨子集和问题
≤
p
\leq_p
≤p分割问题
分割问题:给定
m
m
m个数
v
1
,
v
2
,
…
,
v
m
v_1,v_2,\dots,v_m
v1,v2,…,vm,是否可以将这
m
m
m个数分割成两个子集,使每个子集各元素之和为
1
2
∑
i
v
i
\frac{1}{2}\sum_iv_i
21∑ivi。
构造思路:
给定子集和实例
W
,
w
1
,
w
2
,
…
,
w
n
W,w_1,w_2,\dots,w_n
W,w1,w2,…,wn,我们构造分割问题如下:
分割问题共有
m
=
n
+
2
m=n+2
m=n+2个元素,元素赋值规则如下:
v
1
=
w
1
,
v
2
=
w
2
,
…
,
v
n
=
w
n
,
v
n
+
1
=
2
∑
i
w
i
−
W
,
v
n
+
2
=
∑
i
w
i
+
W
v_1=w_1,v_2=w_2,\dots,v_n=w_n,v_{n+1} =2\sum_iw_i-W,v_{n+2} =\sum_iw_i+W
v1=w1,v2=w2,…,vn=wn,vn+1=2i∑wi−W,vn+2=i∑wi+W
由于分割问题总和为
4
∑
i
w
i
4\sum_iw_i
4∑iwi,所以
v
n
+
1
v_{n+1}
vn+1和
v
n
+
2
v_{n+2}
vn+2不能在同一子集,不然该子集和为
3
∑
i
w
i
3\sum_iw_i
3∑iwi,最终不能均分。要使每部分和为
2
∑
i
w
i
2\sum_iw_i
2∑iwi,只能是如下情况:
其中
W
W
W和
∑
i
w
i
−
W
\sum_iw_i-W
∑iwi−W两部分,说明能从
w
1
,
w
2
,
…
,
w
n
w_1,w_2,\dots,w_n
w1,w2,…,wn中找到一个子集,使其和为
W
W
W
⑩子集和问题
≤
p
\leq_p
≤p调度问题
调度问题:给定
n
n
n个任务,任务
j
j
j的处理时间为
t
j
t_j
tj,工作时间发布时间为
r
j
r_j
rj,截止时间为
d
j
d_j
dj,能否找到一个调度方案,使所有任务在一台机器上进行且在相应的时间段
[
r
j
,
d
j
]
[r_j,d_j]
[rj,dj]内完成。
构造方案如下:
构造
n
n
n个任务,任务
j
j
j的处理时间为
t
j
=
w
j
t_j = w_j
tj=wj,发布时间为
r
j
=
0
r_j = 0
rj=0,截止时间设为
d
j
=
1
+
∑
j
w
j
d_j = 1+\sum_jw_j
dj=1+∑jwj
再额外构造任务0,该任务处理时长为
t
0
=
1
t_0 = 1
t0=1,发布时间为
r
0
=
W
r_0 = W
r0=W,截止时间为
d
0
=
W
+
1
d_0 = W +1
d0=W+1
这样就迫使,子集和有解当且仅当调度问题有解