j_random_hackerのヒントのおかげで、Vertex Coverをグリッドの問題に減らす解決策を見つけました。
私たちはを作ります E | -by- | V | 3行3列のブロック、つまり3 | E | -by- 3 | V | 列{ v 1、… 、v N 1 }として頂点を並べ、行{ e 1、… 、e N 2 }として辺を並べたグリッド。このグリッド上に四角形を作成します(下の図は、使用されているさまざまな四角形を理解するのに役立ちます)|E||V|3|E|3|V|{v1,…,vN1}{e1,…,eN2}
|V|
(ei,vj)ei=(va,vb)
- j<ab<j
- もし(RESP。J = B)、これは左の被覆3行1矩形(それぞれ右)ブロックのカラムです。j=aj=b
- 場合< J < B、これはブロックの先頭行をカバーする1×3の長方形です。a<j<b
我々は持っているのでタイプ2の長方形は、それらが入っているブロックの左上(または右上)の唯一のカバーになるため、選択する必要があります。|E||V|
前述のように、各エッジは行に対応し、頂点および(e i、v b)の端点に対応する2つのブロック(それらをエンドブロックと呼びます)で、タイプの長方形があります3:(ei,va)(ei,vb)
- エンドブロック(それぞれ(e i、v b))の場合、エンドブロックの右上(または左上)の隅を覆う1行2列の長方形があります。(ei,va)(ei,vb)
2|E|
次に、各エッジについて、エンドブロック間にタイプ4の長方形を作成し、2番目の行に2つの長方形を作成します。
- 最初のブロックの中央の正方形から2番目のブロックの中央の左の正方形に移動します。
- 最初のブロックの中央の正方形から2番目のブロックの中央の正方形に移動します。
- 3行目の同じ2つの長方形。
4|E|
それで、グリッドをカバーするために:
- |E|(|V|+2)|V|+4|E|
特定のエッジについて、まだカバーされていないエッジエンドブロックの間の部分(ブロックの行の2行目と3行目)をカバーするには、次のいずれかを使用できます。
- タイプ4の4つの長方形。
- タイプ1の1つの長方形とタイプ4の2つの長方形。
いずれにしても、タイプ4の長方形が少なくとも2つ必要であることに注意してください。
したがって、コスト関数は次のようになります。 | E| ( | V| +4)+k
それらがk未満の頂点を持つ有効な頂点カバーである場合: | E| ( | V| +2)必須の長方形、オプションの長方形には、頂点カバーに対応するタイプ1の長方形を使用できます。すべての行には、タイプ4の長方形が2つだけ必要です(タイプ1の長方形が既にあります)。したがって、グラフに有効な頂点カバーがある場合、グリッドには有効なカバーセットがあります。
グリッドに有効なカバーセットがある場合(より少ない | E| ( | V| +4)+k)長方形、次に各エッジについて、タイプ1の長方形(エッジは「覆われている」)またはタイプ4の4つの長方形があります。その場合、それらの2つをタイプ1の1つの長方形に置き換えることができます。まだ有効なカバーがあります | E| ( | V| +4)+k rectangles. By iterating this process, we reach a valid solution with no row using four rectangle of type 4, from which we can obtain a valid vertex cover.
So the vertex cover can be reduced to the grid cover. And the grid problem instance can be encoded by |E|(|V|+6)+|V| covers on a grid with 9|V||E| elements, so the reduction is polynomial and the grid problem is NPC.
PS :
I noticed after writing this answer that a lot of rectangles are actually useless and much simpler reduction can be made using a |E|-by-3|V| grid with |V|+4|E| covers, using cost function 3|E|+k