geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ABC239F Construct Highway

解説AC

問題へのリンク
解説1へのリンク
解説2へのリンク

web解説を見てよくわからなかったので、自分なりに証明してみました。
素人なので、間違っていたらすみません。

森と、森の各連結成分C_iについて、他の連結成分と連結しなければならない次数の不足数D_iが与えられる(以下、不足数と表現します。)。これを満たすように連結させ、森を1つの木とすることを考えます。

C=1のときは既に木が構成されているので、C\geq 2を仮定します。

これを達成するための必要十分条件は、連結成分数をC、与えられた不足数の合計をDとして、

D=2C-2かつD_i\gt 0

が成り立つことである。 また、これを満たす時、その構成方法は、

C\geq 3なら、少なくとも一方が不足数2以上である連結成分を選び、連結する
C=2なら、不足数が1である2つの連結成分を連結にする

ことである。

まず、木を構成する上で、なぜ
C=2C-2かつD_i\gt0
という条件が出てくるのかメモしておきます。

木の構成可能条件が出てくる理由

Tの辺を1本ずつ切断していくことを考える。

任意の辺を1本切断した時、連結成分数はC_1,C_2の2個になり、不足数D_1 = D_2 = 1で合計は2となる。 これは、D=2C-2かつD_i\gt 0を満たす。

次に、k本目の切断時にD=2C-2かつD_i\gt 0が成り立っていると仮定し、k+1本目の辺を切断した時を考える。
辺が1本以上存在する任意の連結成分C_xの辺を切断し、C_y,C_zに分割されたとする。

C_y,C_zには次数の不足が+1ずつされることからD_y,D_z\geq 1 \gt 0が成り立つ。

k+1本目の辺を切断した後の連結成分数をC'不足数の合計をD'とすると、連結成分数は1つ増え、次数の不足は2つ増える。

k本目切断時のC,Dから、C' = C + 1D' = D + 2となるので、D=2C-2に代入すると、
D'-2=2(C'-1)-2\rightarrow D'=2C'-2
となる。
従って、D=2C-2が成り立つ。

以上から、木から任意の辺を1本以上取り除くと、D=2C-2かつD_i\gt 0が常に成り立つことが示された。

このようにして条件が出てきます。

次に、D=2C-2かつD_i\gt 0ならば、木が構成できることを構成方法の正当性とともに示します。

D=2C-2かつD_i\gt 0\Rightarrow木を構成できる

C\geq 3である間、先程示した帰納法の逆を考えると、任意の連結成分を連結しても常に、D=2C-2が成り立つ。

連結する2つの連結成分の内、少なくとも一方について、連結前の不足数が2以上であれば、不足数が各々1減っても新たにできる連結成分の不足数は0とならないので、D_i \gt 0も保たれる。

よって、C=2となるまで、この操作を繰り返す。

C=2となったとき、D=2C-2かつD\gt 0が成り立っていることから、2つの連結成分のそれぞれの不足数が1である。これを連結させることで1つの木とできる。

以上で証明は終了ですが、以下を示しておきます。

補足

C\geq 3であり、D=2C-2かつD\gt 0ならば、

  • D_i = 1しか存在しない
  • D_i\geq 2しか存在しない

ことがあり得ないことを示す。
これが示されると、各段階で常に不足数が2以上の連結成分と1の連結成分が1個以上存在することになる。 また、これが成り立たないと、構成の途中で木にできない状態を作り出してしまうことになる。

D_i = 1しか存在しない状態にならない

この状態になったと仮定すると、D=Cとなり、D=2C-2が成立していることから、C=2C-2\rightarrow C=2が成り立つはずである。 しかし、C\geq 3という仮定からこれは成り立たない。

D_i \geq 2しか存在しない状態にならない

D\geq 2Cとなるが、D=2C-2と矛盾する。

最後に、十分性を示しておきます。

木を構成できる\RightarrowD=2C-2かつD_i\gt 0

対偶

  • D\neq 2C-2であるか、または、不足数0となる連結成分が1つでも存在するなら木を構成できない

を示す。

不足数0である連結成分が1つでも存在すると、その連結成分を連結できないため、1つの木とならない。よって、木を構成できない。

i回目の連結操作の終了時点で、D\neq 2C-2が成立し、i+1回目の連結操作でD=2C-2にできると仮定する。
しかし、先程示した帰納法と同様の議論で、i+1回目にD=2C-2が成立する場合、i回目の操作終了時点にD=2C-2が成り立つことが証明できる。
よって、仮定と矛盾するため、D\neq 2C-2からD=2C-2が成立する状態にできない。
従って、D\neq 2C-2の状態から1つの木を構成することはできない。

以上で対偶が示された。

解法

これでweb解説の2つの構成方法

がそれぞれ正しいことがわかりました。

ところで、次の構成方法も問題ないはずです。

  • 初期状態(M個の辺を繋げた状態)において、不足数が最大のものをC_xとおく。まず、不足数が2以上の連結成分を全てC_xに連結させる。その後、不足数が1の連結成分をC_xに連結させる。

この解法でACできました。
(C_xとして不足数最大を取らなくても不足数2以上であれば何でも良さそうです)

なお、構成前の前提として、以下の場合も解なしです。

  • 頂点数と不足数の和がD=2N-2を満たさない
  • M個の辺を繋いだ時に不足数が負となる連結成分が存在する

余談ですが、解説にあるような、個数の小さい方から大きい方にマージすることをマージテクと呼ぶのを初めて知りました。

提出コード