問題. Must Be Rectangular!
平面上に 個の点があり,
番目の点の座標は
である.
のうち3点が存在するときに残りの1箇所に点を追加するという操作を行う.最大でこの操作を何回行えるかを求めよ.
制約: ,
解法
解説 を参考にした.
解説通りに二部グラフ を次のように構成する.
・ ,
・
平面上の点を追加する操作は二部グラフ上で辺を追加する操作に対応する.また, の異なる連結成分間に辺を加える操作はできない.したがって,各連結成分ごとに加えることができる辺数を求めれば十分である.
の連結成分数は 1 であると仮定する.
または
のときは辺を加えることがきないので,それ以外の場合を考える(細かい場合分けは省略).
下の証明は間違い(後で直す)
は完全二部グラフにできることを示すために,任意の頂点
と
を考えて,その誘導部分グラフを完全二部グラフにできることを示す.
まず,最小次数が 2 以上のときは,閉路が存在するので,下の図のように赤い辺 を加えることができる.

それ以外の場合は次数 1 の頂点が存在する.一般性を失わずに次数 1 の頂点を とすると,連結性から
かつ
が成り立つ.ここで,
ならば辺
を加えることができる.それ以外の場合は,連結性から
と
の間に道が存在する.このとき,緑色の辺を右から逐次加えることによって,赤色の辺
と
を加えることができ,
を完全二部グラフにすることができる.
以上から は完全二部グラフにすることが可能である.

実装では, なので,
を陽に構成して連結成分ごとに DFS で連結成分内の
と
に属する頂点数を数えた.
番目の連結成分の
と
に属する頂点数をそれぞれ
とすると,求める答えは
となる.ただし, または
となる
番目の連結成分内の辺数は
となることに注意が必要である.また,
は
std::set で 時間で求めた.
計算時間:
二部グラフと言われればそうなんだけど,そこまでに至る思考過程が難しい.強い人云わく典型らしい(どこらへんかは分からない).