证明问题的NP完全性

时间:2011-01-30 04:24:31

标签: algorithm np-complete reduction

我们得到一组A = {a 1 ,一个 2 ,...,一个 n }

给定A的子集B 1 ,B 2 ,...,B m 。如果名为H的A的子集与所有给定的B交叉,则称为H“覆盖子集”。对于给定的A和B,是否有任何大小为K的“覆盖子集”(H的基数为K)?证明这个问题是NP-Complete。

我们应该将一些已知问题减少到“覆盖子集”问题。

1 个答案:

答案 0 :(得分:3)

更新这称为hitting set。您可以在维基百科文章中阅读相同的答案。

在某种程度上,这个问题是set cover problem的双重问题。

我们会改变一些术语。让{B1, B2, ...}成为元素,{a1, a2, ...}成为集合。如果原始问题中ai包含Bj,则设置'Bj在新问题中包含'元素'ai

现在,您只需选择涵盖所有“元素”ai的最小数量的“集合”Bj。这个问题是NP完全的,如上面的链接所示。

为了澄清转换,只需替换set / element和contains / contains就可以从另一个问题定义中产生一个问题定义。比较以下

每一组Bj都包含一些选定的元素ai
每个“元素”Bj都包含在某些选定的“集合”ai