📜  证明图的主要集合是NP完全的(1)

📅  最后修改于: 2023-12-03 15:12:09.062000             🧑  作者: Mango

证明图的主要集合是NP完全的

什么是图的主要集合?

图的主要集合(sometimes called the dominating set)是指在无向图中选出最小的节点集合,使得这个节点集合中的节点在无向图中能够覆盖所有的节点。也就是说,对于一个无向图 G = (V, E),一个节点集合 D 是图 G 的主要集合,当且仅当 D 满足:

  • D 中所有的节点互相连接
  • 对于每个 V - D 集合中的节点 v,存在一个 D 中的节点 u,使得 (u, v) ∈ E

翻译一下:就是选一个最小的点集,使它们能够将原图所有的点都覆盖到。

证明图的主要集合是NP完全的

要证明图的主要集合是 NP 完全的,需要证明两个部分:首先证明主要集合属于 NP,其次证明它属于 NP 完全。

主要集合属于 NP

主要集合问题的一种简单启发式算法是贪心法。从一个任意的节点开始,将它加入主要集合,并把邻域中所有的节点都从原图中删除。然后从剩余节点中选择一个邻域中含有剩余节点最多的节点,重复上述步骤,直到所有的节点都被覆盖。这个贪心法的时间复杂度是 O(n^2),n 是节点数。

要验证主要集合问题是否 NP,需要给出一个验证器,它可以在多项式时间内验证给定的解是否正确。

主要集合问题的 NP 验证器可以这样实现:

  • 遍历主要集合 D 中的每一个节点,检查其所有的邻居是否都在 D 中。如果有一个邻居不在 D 中,则返回 False。
  • 遍历 V - D 中的每一个节点,检查其是否有一个邻居在 D 中。换句话说,遍历所有不在主要集合中的节点,如果所有相邻的点都是 D 中的,返回 True。

这个验证器的时间复杂度是 O(m + n),其中 n 是节点总数,m 是边的总数。

综上可知,主要集合问题是 NP 的。

主要集合属于 NP 完全

为了证明主要集合问题是 NP 完全的,需要构造另一个已知的 NP 完全问题,通过对它们之间的约减(reduction)来证明。这里选取一个已知的 NP 完全问题——独立集问题(independent set problem)。

独立集问题是指在无向图中寻找一个节点集合,使得这个节点集合中所有的节点相互之间没有相邻的边。也就是说,对于一个无向图 G = (V, E),一个节点集合 I 是图 G 的独立集当且仅当 I 满足:

  • I 中的节点两两不相邻
  • 对于每个 I 中的节点 v,v 的所有邻居都不在 I 中

翻译一下:就是选出一个节点集合,让它们之间不会相邻。

现在要构造一个独立集问题实例到主要集合问题实例的约减,这个约减需要保证两个问题有相同的解,即如果有解,就对应一起有解。(这时要注意,如果要完成约减需要某些条件,比如说被约减问题的解一定要是约减后问题的解之一,这个就是需要满足并加以证明的)

设 G = (V, E) 是独立集问题实例图,则为了构造主要集合问题实例图,需要添加一些节点和边,并把独立集问题实例图中原本的节点权值(如有的话)转化为边权值。(这种约减方式叫“参数化多项式约减”,简写为 fpt-reduction)

具体来说,对于 G 中的每个节点 v,新建两个节点 u1 和 u2,分别代表 “包含” v 和 “不包含” v。如果 v 还带有权值 w,就在 u1 和 u2 之间连一条权值为 w 的边。

对于原有的边 e = (u, v),在新图中额外添加以下边:

  • (u1, v2)
  • (u2, v1)

最后得到的新图为 G' = (V', E'),其中 V' 包含了原有节点 v 的代理,以及对于每个节点 v 的两个节点 u1 和 u2,E' 包含了原有的边以及新加的边。

这个约减一定能在多项式时间内完成,因为新图 G' 的大小是原图 G 的多项式函数。同时,这个约减可以保证 G 的独立集 I 和 G' 的主要集合 D 有相同的解:对于 G 上的一个独立集 I,把 I 中的所有节点对应到 G' 上的节点,得到节点集合 D,并证明 D 是 G' 的主要集合;对于 G' 上的一个主要集合 D,把 D 中所有代表节点为 “包含” 的节点所对应的原节点加入到集合 I 中,则 I 是 G 的一个独立集。证明的详情此处省略。

综上可知,主要集合问题是 NP 完全的。

结论

在算法中,NP 是指非确定多项式时间(Nondeterministic Polynomial time),NP 完全是指一个问题如果是 NP 完全问题,同时还属于 NP 类问题的一部分。如果一个 NP 完全问题可以在多项式时间内被解决,那么它的所有问题都可以在多项式时间内被解决。

证明主要集合属于 NP 的一个核心问题是设计一个多项式时间的验证器验给定的解是否正确。

证明主要集合属于 NP 完全的一种常见方法是通过构造一个 Karp 约减来证明,即把一个已知的 NP 完全问题实例映射成一个新的问题实例,以证明这个新问题实例也是 NP 完全的。

# 证明图的主要集合是NP完全的

## 什么是图的主要集合?

图的主要集合(sometimes called the dominating set)是指在无向图中选出最小的节点集合,使得这个节点集合中的节点在无向图中能够覆盖所有的节点。也就是说,对于一个无向图 G = (V, E),一个节点集合 D 是图 G 的主要集合,当且仅当 D 满足:

- D 中所有的节点互相连接
- 对于每个 V - D 集合中的节点 v,存在一个 D 中的节点 u,使得 (u, v) ∈ E
  
## 证明图的主要集合是NP完全的

要证明图的主要集合是 NP 完全的,需要证明两个部分:首先证明主要集合属于 NP,其次证明它属于 NP 完全。

### 主要集合属于 NP

主要集合问题的一种简单启发式算法是贪心法。从一个任意的节点开始,将它加入主要集合,并把邻域中所有的节点都从原图中删除。然后从剩余节点中选择一个邻域中含有剩余节点最多的节点,重复上述步骤,直到所有的节点都被覆盖。这个贪心法的时间复杂度是 O(n^2),n 是节点数。

要验证主要集合问题是否 NP,需要给出一个验证器,它可以在多项式时间内验证给定的解是否正确。

主要集合问题的 NP 验证器可以这样实现:

- 遍历主要集合 D 中的每一个节点,检查其所有的邻居是否都在 D 中。如果有一个邻居不在 D 中,则返回 False。
- 遍历 V - D 中的每一个节点,检查其是否有一个邻居在 D 中。换句话说,遍历所有不在主要集合中的节点,如果所有相邻的点都是 D 中的,返回 True。

这个验证器的时间复杂度是 O(m + n),其中 n 是节点总数,m 是边的总数。

综上可知,主要集合问题是 NP 的。

### 主要集合属于 NP 完全

为了证明主要集合问题是 NP 完全的,需要构造另一个已知的 NP 完全问题,通过对它们之间的约减(reduction)来证明。这里选取一个已知的 NP 完全问题——独立集问题(independent set problem)。

独立集问题是指在无向图中寻找一个节点集合,使得这个节点集合中所有的节点相互之间没有相邻的边。也就是说,对于一个无向图 G = (V, E),一个节点集合 I 是图 G 的独立集当且仅当 I 满足:

- I 中的节点两两不相邻
- 对于每个 I 中的节点 v,v 的所有邻居都不在 I 中

现在要构造一个独立集问题实例到主要集合问题实例的约减,这个约减需要保证两个问题有相同的解,即如果有解,就对应一起有解。(这时要注意,如果要完成约减需要某些条件,比如说被约减问题的解一定要是约减后问题的解之一,这个就是需要满足并加以证明的)

设 G = (V, E) 是独立集问题实例图,则为了构造主要集合问题实例图,需要添加一些节点和边,并把独立集问题实例图中原本的节点权值(如有的话)转化为边权值。(这种约减方式叫“参数化多项式约减”,简写为 fpt-reduction)

具体来说,对于 G 中的每个节点 v,新建两个节点 u1 和 u2,分别代表 “包含” v 和 “不包含” v。如果 v 还带有权值 w,就在 u1 和 u2 之间连一条权值为 w 的边。

对于原有的边 e = (u, v),在新图中额外添加以下边:

- (u1, v2)
- (u2, v1)

最后得到的新图为 G' = (V', E'),其中 V' 包含了原有节点 v 的代理,以及对于每个节点 v 的两个节点 u1 和 u2,E' 包含了原有的边以及新加的边。

这个约减一定能在多项式时间内完成,因为新图 G' 的大小是原图 G 的多项式函数。同时,这个约减可以保证 G 的独立集 I 和 G' 的主要集合 D 有相同的解:对于 G 上的一个独立集 I,把 I 中的所有节点对应到 G' 上的节点,得到节点集合 D,并证明 D 是 G' 的主要集合;对于 G' 上的一个主要集合 D,把 D 中所有代表节点为 “包含” 的节点所对应的原节点加入到集合 I 中,则 I 是 G 的一个独立集。证明的详情此处省略。

综上可知,主要集合问题是 NP 完全的。


## 结论

在算法中,NP 是指非确定多项式时间(Nondeterministic Polynomial time),NP 完全是指一个问题如果是 NP 完全问题,同时还属于 NP 类问题的一部分。如果一个 NP 完全问题可以在多项式时间内被解决,那么它的所有问题都可以在多项式时间内被解决。