AtCoder Beginner Contest 267 E問題 Erasing Vertices 2
問題
提出解答
問題の概要
頂点 辺の単純無向グラフ が与えられる. ただし,
とする. また, 頂点 には整数 が書かれている.
次の操作を 回行う.
- にある頂点 を一つ選ぶ. の における近傍にある頂点に書かれている整数の総和をコストとする. その後, を に置き換える.
回の操作におけるコストの最大値を全体のコストとする. 取りうる全体のコストの最小値を求めよ.
制約
- は単純.
解法
全体のコストの定義から, 求めるべきはコストの最大値の最小値なので, 二分探索を利用することにする.
つまり, 整数 に対して, 次の問題を解くことにする.
全体のコストを 以下にできるか?
これは次のアルゴリズムによって判定できる.
- を の近傍 における の総和とする.
- を空の Queue とする.
- に であるような を全て enqueue する.
- 以下を が空ではない限り行う.
- を dequeue し, その頂点を とする.
- の (残っている) 近傍 に対して, 以下を行う.
- から を減らす.
- が に enqueue されたことがなく, ならば, に を enqueue する.
- 全ての頂点を enqueue できれば肯定的結論, そうでなければ否定的結論.
また, 解答の自明な下界は , 自明な上界は であるから, 正解を 時間で求めることができた.
なお, 判定アルゴリズムを見てみると, 実は貪欲法で解くことができるがわかり, 時間計算量を 時間に削減できる.