一些NPC问题的证明

《算法设计与分析》期末复习

团集

把 SAT 在多项式时间内归约到团集

对于一个可满足性实例 f=C1C2...Cm

建立一张图 G(V,E)

E={(xi,xj)|xi,xj属于不同子句且xi!=xj}

现在证明可满足性实例 f 是可满足的当且仅当 G(V,E) 有一个大小为 m 的团集

"=>":可满足性实例 f 是可满足的,说明每个子句中最少都有一个文字为 1,认为文字为 1 在这张新建立的图中是被选中的,根据图的定义就得到了一个大小为 m 的团集

"<=":图中有一个大小为 m 的团集,假设有一个字句不为 1,那么至少有一个子句中有两个对应的文字被选中,根据定义这两个点没有边相连,所以假设错误

顶点覆盖

把 SAT 在多项式时间内归约到顶点覆盖

对于一个有 n 个文字 x1,x2,...,xn 的含有 m 个子句的可满足性实例 f=C1C2...Cm

建立一张图 G(V,E)

  1. 对于任意 xi,把(xi,xi) 加入 E

  2. 对于一个子句 Ci,对于任意 xi,xj,均把它们相连加入 E 中,也就是构建一个大小为 |Ci| 的完全子图(上面说的团)

  3. 对于一个子句 Ci,把 Ci 内的任意文字 xi 与 1. 中对应的点相连

  4. k=n+Σ(|Ci|1)

下面证明可满足性实例 f 是可满足的当且仅当 G(V,E) 有一个大小为 k 的顶点覆盖

"=>":对于一个文字 xi,如果其被指派为 1,那么在 G 中选择 xi,否则选择 xi;因为每个子句中至少有一个文字为 1,对于每个子句组成的团,存在至少一个顶点 xi,与之对应的文字被选中,那么 (xi,xi) 这条边已经被覆盖了,再选择团(一个完全子图)内其他的所有点,一共 |Ci|1 个,所以我们找到了一个大小为 k 的顶点覆盖

"<=":G 有一个大小为 k 的顶点覆盖,首先考虑 1. 中构建的边必然要被覆盖,所以 xi,xi 至少有一个被选中;又因为我们对每个子句构造了一个完全子图,它的顶点覆盖至少要 |Ci|1 个点被选中;这样我们就保证的每个子句的结果必然为 1

独立集

考虑到顶点覆盖和独立集是完全相反的,完全可以把顶点覆盖在多项式时间内归约到独立集

G(V,E) 有顶点覆盖 S 当且仅当有独立集 VS

"=>":图 G(V,E) 有一个顶点覆盖 S,对于图内的任意一条边 (xi,xj)xi,xj 至少有一个在 S 内,那么在 VS 中,就不存在 (xi,xj) 这条边

"<=":反之,对于图内任何一条边 (xi,xj)xi,xj 不可能同时出现在 VS 中,那么至少有一个出现在 S

实际上,独立集也可以在多项式时间内归约到团集(图 G 的一个独立集是图 G 的一个团集),又因为归约本身的传递性,顶点覆盖也可以归约到团集

3-SAT问题

显然是要把 SAT 在多项式时间内归约到 3-SAT

最麻烦的地方在于,SAT 中的某个子句可能含有任意字,且彼此之间是析取;我们要怎么转化成析取-(3项)合取形式的式子

对于一个子句 Ci,有 Ci=x1x2...xk

k=3,这是我们所希望的,不用做任何操作

k=1,我们考虑加入两个额外变量,构造新的子句 Ci=(x1y1y2)(x1y1y2)(x1y1y2)(x1y1y2)

x1=0,令 y1=y2=0;当 x1=1,令 y1=y2=1

k=2,考虑加入一个额外变量,新的子句 Ci=(x1x2y1)(x1x2y1)

k>=4,加入 k+1 个额外变量,新的子句

Ci=(y1x1y2)(y2x2y3)...(ykxkyk+1)

这个我还看到了很多构造方案,我觉得本质都差不多

既然在可满足性问题的一组解下,这个子句必然为 1,对于句内任何一个 xi=1,都可以很轻易构造出 y1,...,yk+1 的一组解使得整个句子值为 1

所以完成了 SAT 到 3-SAT 的归约

3-Colorability 3着色问题

考虑将 3-SAT 归约到 3-Colorability

这个构造有点复杂 😦 但是很有意思 😃

指路

很容易把 3-Colorability 归约到 k-Colorability

3 Dimensional Match 三维匹配问题

可以考虑把 3-Colorability 在多项式时间内归约到三维匹配问题

Hamilton Cycle / Path 哈密顿回路 / 路径问题

这群学数学的脑子怎么长的?

指路

我倾向于构造的这张图对于 SAT / 3-SAT 归约到哈密顿回路都适用

哈密顿回路通过添加边权可以归约到旅行商问题

那么对于哈密顿路径,我们考虑将哈密顿回路在多项式时间内归约到哈密顿路径

上面的pdf已经给出了方案,将哈密顿路径中的某个点 vi 拆成两个点 vi1vi2vi1只分配入度信息,vi2 只分配出度信息,两点之间不相连,这样就把一个路径断开了

Google 确实比 Bing 好用

Subset Sum 子集和问题

这个问题可以归约到 Set-Partition 划分问题和背包问题,所以提前列出来

不是哥们你考这个?

posted @   sysss  阅读(399)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示