算法概论 | NP完全问题

8.3

Problem
STINGY SAT:给定一组子句和整数k,求最多有k个变量为true的满足赋值(如果存在)。
Solution
首先,给定一个解S,可以直接带入STINGY SAT检验其是否满足,复杂度为多项式时间,所以是NP的。
然后,STINGY SAT问题与SAT相比,增加了约束最多k个变量为true,所以可以将SAT归约到STINGY SAT。假设SAT有n个变量,即令k=n,这一过程是多项式(常数)时间的,而且很容易可以看出当STINGY SAT可满足时SAT也有可满足的解,反之亦然。

8.10

Problem a
子图同构:给定两个无向图G和H,判断G是否为H的一个子图,如果是则返回V(G)到V(H)的相关映射。
Solution
给定一组映射,我们可以判断出G是否是H的一个子图,所以问题是NP的。
判断是否为子图主要看点和边,所以可以将Rudrata回路归约到子图同构来证明它是NPC。设有图H和环G,H和G顶点数相等,该问题到子图同构只需要多项式的时间完成。如果G是H的子图,那么H一定存在Rudrata回路,并按照以某个起点开始的映射返回即可。如果G不是H的子图,则H一定不存在Rudrata回路,假设其存在,则可以推出G是H的子图,得到矛盾。

Problem b
最长路径:给定图G和整数g,求G中一条长为g的简单路径。
Solution
设图中顶点数为V,令g = |V| - 1,转化为Rudrata回路问题,所以最长路径是Rudrata回路的推广,也是NPC。

Problem c
最大SAT:给定一个CNF公式和整数g,求满足其中至少g个子句的真赋值。
Solution
设CNF中共有n个子句,添加约束g = n,就转化为SAT问题,所以最大SAT是SAT的推广,也是NPC。

Problem d
稠密子图:给定一个图和两个整数a和b,求G中的a个顶点,使得它们之间最少有b条边。
Solution
SAT问题边和点的数目没有明显约束,所以考虑最大团问题。令b=(a-1)a/2,即每两个点之间都有一条边,就转化为了求最大团问题,所以稠密子图是NPC。

Problem e
稀疏子图: 给定一个图和两个整数a和b,求G中的a个顶点,使得它们之间最多有b条边。
Solution
与d不同的是,我们要找到一个边数有上界的NPC问题,并且是稀疏子图的特例。令b=0,则转换为求图G的独立集,所以也是NPC的。

Problem f
集合覆盖:经典SCP描述包含一个集合U以及U内元素构成的若干各小类集合S,目标是找到S 的一个子集,该子集满足所含元素包含了所有的元素且使小类集合个数最少。
Solution
从定义上来看,集合覆盖和最小顶点覆盖十分相似。设有一个图G,其边数和集合U中的元素数目相等,令小类集合Si的元素为顶点i相邻的边,S集合为图G中的边集,则集合覆盖就转化为了最小顶点覆盖,所以是NPC问题。

Problem g
可靠网络:给定两个n*n矩阵,一个距离矩阵dij,一个连接需求矩阵rij以及预算b.要求一个图G=({1,2,…,n},E)使得:(1) 其中所有边的总代价不超过b;(2) 在任意两个不同顶点i和j之间,存在rij条顶点互不相交的路径。
Solution
根据提示可以想到8.3节中的TSP问题,α取值为1。dij为1时代表两个城市之间有边,为2时没有边。预算b即为城市的数目,而第二个条件说明任意两点都在一个圈上,这样就转化为了求解TSP问题,作为其推广,可靠网络也是NPC问题。

你可能感兴趣的:(LeetCode)