《算法概论》P266 8.9
首先证明hitting set(我暂且翻译为击中集)是一个NP问题。给定该问题的一个实例,包括一组集合{S1,S2,...,Sn},大小限制b,再给定问题的一个可能解H,我们可以在多项式时间内判断以下命题的真假:1.H中元素的数量不超过b;2.{S1,S2,...Sn}中每一个集合都至少有一个元素出现在H中。H是击中集问题的解当且仅当上面的命题均为真。也就是说,击中集问题能在多项式时间内验证解的正确性,所以它是NP问题。
然后,证明顶点覆盖问题(vertex cover)可以归约到击中集问题。设顶点覆盖问题的输入是 (G,g),其中G=(V,E)是一个图,V是顶点集合,E是边集,g是要求的顶点覆盖的大小。证明如下:
- (G,g)可以在多项式时间内转化成击中集问题的输入,方法如下:对G中的每一条边ei构造一个集合Si,Si中的元素为ei连接的两个顶点,击中集的budget为g。
- 如果击中集问题有解,即存在H与每个集合相交都不为空集,那么每个集合Si中至少有一个元素在H中。H、Si中的元素均对应G中的顶点,显然每条边ei连接的两个顶点中至少有一个在H中,H是G的顶点覆盖。而且H的大小不超过budget,budget为g,所以G一定有大小为g的顶点覆盖,即顶点覆盖问题有解。
- 如果顶点覆盖问题有解,即存在大小为g的顶点集合VC,每条边的两个顶点至少有一个在VC中。因为每条边ei对应一个集合Si,那么每个集合中至少有一个元素在VC中,并且VC的大小不超过budget,所以VC是击中集问题的解。
- 如果击中集有解,该解可以在多项式时间内转换成顶点覆盖问题的解。实际上,由于每个集合Si中的元素都为顶点,击中集的解直接就是顶点覆盖问题的解。
至此,我们证明了顶点覆盖问题可以归约到击中集问题。顶点覆盖问题已被证明是NP完全问题,即任一个NP问题都能归约到顶点覆盖问题,根据归约的传递性,任意NP问题可以归约到击中集问题。又因为击中集问题是NP问题,所以击中集问题是NP完全问题。