AtCoder Beginner Contest 293 D問題 Tying Rope
問題
提出解答
問題の概要
本のロープがある. 各ロープにはそれぞれ 以上 以下の番号が振られている. また, 各ロープの一方の端は赤で塗られており, 他方の端は青で塗られている.
以下の操作を 回行う.
- ロープ の色 とロープ の色 を結ぶ. なお, 色 とは赤色を, 色 とは青色を表す.
なお, 回の操作において, 各ロープにおいて, 同じ端が 回以上登場しない.
このとき, ひとつながりになっているロープの組について環状になっているものの個数 とそうでないものの個数 をそれぞれ求めよ.
制約
- は のどちらか一方
- は全て異なる.
解法
ロープの端を頂点, 結ばれている関係を辺とするグラフを構成する.
具体的には以下のようにして無向グラフ を構成する.
なお, の集合の和集合について, 左側は元から同じロープであること, 右側は操作によってつながった部分を表す.
ここで, 各頂点は制約から次数が または である. よって, 各連結成分はパスかサイクルになる.
この条件下では 頂点の連結成分において, パスは辺の数が で, サイクルは になる.
よって, 辺数が超点数未満の連結成分の数が , 頂点数と辺数が等しい連結成分の数が である.
これを求めるためには BFS, DFS や Union Find を利用することにより, 時間で求めることができる.