通过减少“顶点覆盖”可以解决此问题。
在“顶点覆盖”问题中,我们得到一个图形和一个数,并且我们的任务是确定是否存在从到最多个顶点的某个子集,从而使中的每个边都入射在中至少一个顶点上。(等效地:是否可以通过删除最多个顶点来杀死的每个边?)G = (V ,E )r U r V E U G rG = (V,E)[Rü[RVËüG[R
首先,将划分为不相交的子集等效于将每个元素分配为可能的标签中的一个。减少的基本思想是建立标签为每个顶点在,和“允许”仅被分配对应于它的端点两个标签中的一个的每个边缘,在下面的意义:分配相应的边缘标签没有对其他可以分配相同标签的边引入(真正的)约束,而将边分配给不对应的标签则可以防止其他边被分配相同的标签-当然,这样做可以提高数字需要不同的标签。甲小号甲小号小号Ĵ v Ĵ V一种s一种s小号ĴvĴV
从Vertex Cover 实例构造问题的实例:(A ,a ,s )(G ,r )(A ,a ,s )(G ,r )
- 将设置为,并创建一个元件在对于每个边缘在。(可以将这些对视为整数;它们之间的任何双射都可以。)k | E | (i ,j )A v i v j E 1 ,… ,kķ| Ë|(i ,j )一种v一世vĴË1 ,… ,k
- 将为如果或 ; 否则,将为1。a (b ,c ),d | E | d = b d = c一种(b,c),d|E|d=bd=c a (b ,c ),da(b,c),d
- 设置。s = rs=r
如果是顶点覆盖的YES实例,那么很容易看到问题的刚刚构造的实例也是YES实例:只需在任何解决方案选择与顶点对应的标签,并为每个边分配相应的元素以选择标签或之一为准(如果同时选择了两个标签,则任意选择)。此解决方案使用子集,并且有效,因为有效的唯一是对应于(g ^ ,- [R )š Ĵ v Ĵ ü v b v Ç ∈ ë (b ,c ^ )∈ 甲小号b 小号Ç小号一个我Ĵ | E |(G,r)SjvjUvbvc∈E(b ,c )∈ASbSCsa我Ĵ标签,具有(|非)防止超过边缘被分配了相同的标签。|E|
仍有待证明,问题的YES实例表示原始是“顶点覆盖”的YES实例。这是稍微更复杂的,因为一个有效的解决方案到一般可以分配一个边缘一个非 -对应标签,即,这意味着我们不能不一定是“读出”有效的顶点覆盖从一个有效的解决方案。X = (甲,一,小号)(g ^ ,- [R )ÿ X (我,Ĵ )小号米米∉ { 我,ĴX= (A ,a ,s )(G ,r )ÿX(i ,j )S米 } û ÿm∉{i,j}UY
但是,分配不对应的标签的成本很高,严重地限制了解决方案的结构:每当分配一条边这样的标签,,事实那确保了它必须是唯一分配了该标签边缘。因此,在包含这样的非对应标记的边任何解决方案中,我们都可以按如下方式构造替代解决方案:(我,Ĵ )小号米米∉ { 我,Ĵ } 一个(我,Ĵ ),米 = 1 Ý (我,Ĵ )↦ 小号米ÿ '(i,j)Smm∉{i,j}a(i,j),m=1Y(i,j)↦SmY′
- 任意选择新标签的是要么或。小号Ž(我,Ĵ )Sz(i,j) S i S jSiSj
- 分配这个新标签。如果这导致无效的解决方案,那一定是因为恰好另一个边缘,已被分配了标签。在这种情况下,设置并转到步骤1。(我,Ĵ )(我',Ĵ ')Ž ∉ { 我',Ĵ ' } 小号Ž(我,Ĵ )= (我',Ĵ ')(i,j)(i′,j′)z∉{i′,j′}Sz(i,j)=(i′,j′)
上面的算法必须以以下两种方式之一终止:找到没有引入矛盾的新标签,或者找到完整的顶点循环。在前一种情况下,找到具有集合的有效新解,而在后一种情况下,找到具有集合的有效新解;无论哪种方式,我们都构建了一个有效的新解决方案,并将至少一个以上的边分配给相应的标签。最多重复整个过程之后次,我们将产生一个有效的解决方案,从中可以读取原始Vertex Cover问题的解决方案。S z s - 1 sSzs−1s| E | Ÿ “| Ë|ÿ′
这种构造显然是多项式时间,因此得出的问题是NP难的。