No.317
まずは Union-Find で各連結部分の頂点数を計算する.
そうすると, 問題は「 円のコインを使って 円を作るときの最小の硬貨の枚数を求めよ」と同じ問題となる. (追加する辺の数は (硬貨の枚数 - 1) となるがこれは最後に引けばいい)
これはナップザック問題であるが, 普通の DP を使うと硬貨の枚数が最大 枚であるので, 計算量が となって間に合わない.
そこで, 「 円のコインが 枚あり, これを使って 円を作るための最小の硬貨の枚数を求める」と問題を読み替える. 硬貨の種類は 円となるときに最大になるので, 種類程度になる.
このとき, 種類まで使ったときに 円を作るための最小の硬貨の枚数を とすると, 漸化式は,
となる. これを素直に計算すると ごとに かかってしまう. そこで ごとに,
の配列を作っておく. この配列を使ってスライド最小値の要領で ごとの最小値の計算をすれば, ごとの計算量を に抑えることができ, 硬貨の種類数は 程度であるので, 全体の計算量を に抑えることができる.
ただし, このやり方を枚数の少ない硬貨でやると定数倍が大きいので, 枚数の少ない硬貨については普通の DP を使う.