AtCoder Beginner Contest 264 E問題 Blackout 2
問題
提出解答
問題の概要
個の都市と 個の発電所からなる国がある. これらを総称して地点と呼ぶ.
個の都市は地点 と, 個の発電所は地点 と名付けられている.
この国には 本の電線があり, 番目の電線は地点 , 地点 を結ぶ.
ここから 個のイベントがおこる. 各イベントが起こった後の状況に対して, 以下の問に答えよ.
- イベント: 番目の電線が切れる.
- 問: 切れていない電線をいくつか辿ることにより, ある発電所に到達できるような都市の数を求めよ.
制約
解法
問題は次のようにしてグラフの問題に帰着できる.
無向グラフ が与えられる. ただし,
- 操作: 辺 を削除する.
- 問: 頂点 のうち, 頂点 のうち1つ以上と連結であるような頂点の数を求めよ.
ここで, 一般的に連結性については "辺を削除する" 操作より "辺を追加する" 操作に対する処理の方が速い事が多い. 今回もその性質を使う. つまり, 次のような問題に変換する.
無向グラフ が与えられる. ただし,
- 問: 頂点 のうち, 頂点 のうち1つ以上と連結であるような頂点の数を求めよ.
- 操作: 辺 を追加する.
このとき, 辺の追加と連結性の判定を得意とするデータ構造は Union Find である. この Union Find を利用する. このとき, 各連結成分に対して, 次のような状態及び, 状態をマージする関数を用意する.
- 状態:
- マージ関数:
ここで, はその連結成分に都市が 個, 発電所が 個ある事に対応する.
これを利用して, 次のようにして正解できる. ただし, 番目の操作後における解答を と表すことにする.
- を 頂点からなる Union Find とする.
- 頂点 の状態を に, 頂点 の状態を に設定する.
- となる が存在しない全ての に対して, に対して頂点 に辺を加えてマージする.
- の各連結成分 に対して, の状態を としたとき, ならば, に を加える.
- の順に次を行う.
- において, 頂点 が非連結な場合, 以下を行う.
- 頂点 が属する連結成分の状態を , 頂点 が属する連結成分の状態を とする.
- かつ ならば, に を加算する.
- かつ ならば, に を加算する.
- をマージ関数として, 頂点 に辺を加えてマージする.
- において, 頂点 が非連結な場合, 以下を行う.
このとき, がそれぞれ求めるべき解答である.
計算量は 時間である.