AtCoder Beginner Contest 229 E 問題 Graph Destruction
問題
提出解答
問題の概要
とする. グラフ に対して, に対して, 以下を求めよ.
- の連結成分の個数
制約
- 入力は全て整数
解法
一般的に, 「消す」という操作よりも, 「入れる」という操作の方が簡単である場合が多い. また, この問題を解くにあたって, の順に解く必要がないことから, の順に解くことにする.
とする. このとき, の間には以下のような関係がある.
- のグラフに, 頂点 と, である全ての に対して, 辺 を加えると, になる *1.
この関係から, の連結成分の個数を としたとき, 以下のようにして, を求めることができる.
- である ( 頂点からなるグラフの連結成分の数は である).
- の順に以下を実行する.
- とする ( に孤立している頂点 を加える).
- である全ての に対して, 頂点 と頂点 が非連結ならば, この辺を加え, から を引く (非連結な頂点同士辺を結ぶと, 連結成分の数は 減る).
グラフに辺を加える, および2頂点が非連結かどうかをみることを得意とするデータ構造は Union Find である.
よって, 計算量 で求めることができた.
*1: という制約に注意