目次

DEGwer さんの D 論応援コンテスト B問題メモ

DEGwer さんの D 論応援コンテスト

B - vs. DEGwer

B - vs. DEGwer

問題

  |   |   |     (H,W)=(3,2) の盤面、
   --- ---
S |   |   | T   「|」および「---」が扉(計13個)
   --- ---
  |   |   |

解法

前提知識と必勝条件

シャノンのスイッチングゲーム」と呼ばれるゲームの一種である。
特にこのようなグリッド状に限定したものを指して、Galeのゲーム や Bridg-it とも呼ぶらしい。

各部屋と $S,T$ を頂点、扉を辺と見なす。
あなたは辺を固定し、魔王は辺を削除して、$S$ と $T$ を連結にできればあなたの勝ちとなる。

ゲームの必勝法として、グラフから「辺疎な(辺を共有しない)全域木を2つ取る」ことができれば、 後攻であっても、必ず全ての頂点を連結にできる。
当然 $S,T$ も連結にできるので、勝利する。

全域木A
①--②--③-|-④--⑤--⑥    片方の全域木に属する辺が切られたときでも、

全域木B
     ,-------,,------,     もう一方の全域木はまるごと残っている。
①  ②  ③   ④  ⑤  ⑥    こっちの方で、分かれた成分同士を
|`------'`-------'   |     結ぶような辺(たとえば②-④)を選ぶことで
`--------------------'     

全域木A
①--(②④)--⑤--⑥         縮約したグラフでは、辺を共有しない全域木が2つある状態を維持できる
③--'

全域木B
⑤--③--①--⑥--(②④)

これを繰り返すと、全ての頂点が1つになるまで縮約(=全体を連結に)できることが示せる。

ただし、全域木が2つ取れないからといって、必敗とは限らないので注意。

勝利可能判定

さて、問題のグラフで辺は $H \times (W+1) + (H-1) \times W=2HW+H-W$ 本ある。
一方、頂点は $HW+2$ 個で、2つの全域木に必要な辺数は $2HW+2$ 本である。

少なくとも、$2HW+H-W \ge 2HW+2$、つまり $H \ge W+2$ であることが必要となる。

では、$H \ge W+2$ なら構成できるのか?

以下のようにすると、必ず構成できる。

   A   B   A   B      (H,W) = (5,3)
    -A- -B- -A-       Aだけの扉(を辺と見立てたグラフ)も、
   B   A   B   A      Bだけの扉も、全域木を構成する
    -B- -A- -B-
S  A   B   A   B  T
    -A- -B- -A-
   B   A   B   A
    -B- -A- -B-
   A   B   A   B

また、$H = W+1$ の時、辺が1本だけ足りないのだが、

   A x B x A x B      (H,W) = (4,3)
    -A- -B- -A-
   B o A x B x A      Aは全域木となっているが、
o   -B- -A- -B-   x   Bが1本だけ足りず、完全には繋がらず
   A o B o A x B      o成分とx成分の2つに分かれている
    -A- -B- -A-
   B o A o B o A

先攻の場合、この2成分を初手で縮約する(たとえば左上の -A- を選ぶ)ことで、必勝法に持ち込める。

よって、「$H \ge W+2$」または「$H = W+1$ かつあなたの先攻」の場合、勝利できる。

では、他の場合は必ず敗北するのか?
結論から言うと敗北する。以下、それを示す。

魔王からしてみると、扉の連結点を頂点と見立て、 これを閉じた扉によって上から下まで繋げることができれば、阻止が成功したと言える。

 ___ S___
/  /  \  \
|  |  |  |    (H,W) = (3,3)
o--o--o--o
|  |  |  |
o--o--o--o
|  |  |  |
\  \  /  /
 ~~~ T ~~

魔王にとっての必勝法も、このグラフから2つの全域木が取れればよいということになる。

全域木の構築の仕方もあなたの場合と同様にでき、結局、「$H \le W$」または「$H = W+1$ かつ魔王の先攻」なら、 魔王の必勝ということになり、ちょうどあなたの場合を逆にした条件であることが分かる。

実装

勝利可能で実際にゲームを行う場合、$H,W$ が小さいので、愚直にUnion-Findなどで連結判定を毎回やってよい。

「2つの全域木」を取ろうとすると、$H \ge W+3$ の時に辺があまりややこしいので、 木でなくなってもよいので上述のナナメ状に、辺を2つのグループA,Bに分ける。

相手がAに属する辺を削除してきたら、(既に固定済みの辺)+(未確定のAの辺)をUniteした後、

Python3