感谢j_random_hacker的提示,我找到了一种解决方案,可以将“顶点覆盖”减少到网格问题:
我们-by-3 x 3块的网格,即-by-网格,其顶点按列排序,边按行{ e 1,… ,e N 2 }排序。我们将在此网格上构造矩形(下图将有助于您理解所使用的不同矩形)| V | 3 | E | 3 | V | { v 1,… ,v N 1 }|E||V|3|E|3|V|{v1,…,vN1}{e1,…,eN2}
对于每个顶点,我们创建一个类型为1的矩形,该矩形覆盖与该顶点对应的块的列的中心列,因此类型1的矩形|V|
每个块对应一个唯一的对,对于每个块e i = (v a,v b),我们添加一个类型2的矩形:(ei,vj)ei=(va,vb)
- 如果或b < j,则这是一个3 x 3的矩形,覆盖整个块。j<ab<j
- j=aj=b
- a<j<b
|E||V|
(ei,va)(ei,vb)
- (ei,va)(ei,vb)
2|E|
现在,对于每个边缘,我们在端块之间构造类型为4的矩形,第二行有两个矩形:
- 从第一个块的中心正方形到第二个块的左中心正方形。
- 从第一个块的右中角正方形到第二个块的中央正方形。
- 和第三行相同的两个矩形。
4|E|
所以现在,覆盖网格:
- |E|(|V|+2)|V|+4|E|
为了覆盖给定的边缘,尚未覆盖的边缘端块之间的部分(块行的第二行和第三行),我们可以使用:
- 类型4的四个矩形。
- 类型1的一个矩形和类型4的两个矩形
请注意,无论如何,我们至少需要两个4型矩形。
|E|(|V|+4)+k
|E|(|V|+6)+|V|9|V||E|
|E|3|V||V|+4|E|3|E|+k