JOI 2007 春 2-3 SALT TREE XV 証明付き解説
(個人的には珍しく) まじめに証明を書く.
問題概要
2 人のプレイヤーが交互に,木に対して次の操作を行っていく.
- 辺を 1 つ削除する.
- 頂点を 1 つ削除する.その頂点が辺を持つならそれらの辺はすべて削除する.
操作ができなくなった方が負けである.
先手に必勝法があるので,それを実装せよ.(インタラクティブタスク)
https://www.ioi-jp.org/camp/2007/2007-sp-tasks/2007-sp-day2_21.pdf
解法
相手の手番に回すとき,(頂点の数, 辺の数) = (偶数, 偶数) となるようにする.
証明①
今,(頂点の数, 辺の数) = (偶数, 偶数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできないことを示す.
- 辺の削除を行ったとき,辺の数が奇数になるから不適.
- 頂点の削除を行ったとき,頂点の数が奇数になるから不適.
よって,(頂点の数, 辺の数) = (偶数, 偶数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできない.
証明②
今,(頂点の数, 辺の数) = (奇数, 奇数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできることを示す.
辺の数が奇数であることから辺は少なくとも 1 つ存在し,葉が少なくとも 1 つ存在する.この葉を選べばよい.
よって,(頂点の数, 辺の数) = (奇数, 奇数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできる.
証明③
今,(頂点の数, 辺の数) = (偶数, 奇数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできることを示す.
辺の数が奇数であることから辺は少なくとも 1 つ存在するから,この辺を選べばよい.
よって,(頂点の数, 辺の数) = (偶数, 奇数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできる.
証明④
今,(頂点の数, 辺の数) = (奇数, 偶数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできることを示す.
すべての頂点の次数が奇数だと仮定すると,頂点の数が奇数であることから,次数の総和が奇数となるが,これは (次数の総和) = (辺の数) × 2 と矛盾する.
すなわち,次数が偶数の頂点が少なくとも 1 つ存在するから,それを選べばよい.
よって,(頂点の数, 辺の数) = (奇数, 偶数) の場合,1 回の操作後に (頂点の数, 辺の数) = (偶数, 偶数) にできる.
木において (頂点の数) = (辺の数) + 1 であるから,頂点の数と辺の数の偶奇は異なる.よって,最初の状態では (頂点の数, 辺の数) ≠ (偶数, 偶数) である.
以上の 4 つの証明より,相手の手番を常に (頂点の数, 辺の数) = (偶数, 偶数) にできるが,勝つためには頂点が 1 つだけ残っている状態で手番が回ってこなければならないから,相手は絶対に勝つことが出来ない.
N ≦ 2,000 より O(N2) が間に合うので,実装は雑でよい.