Official
C - ネットワークの整理 / Organizing the Network Editorial
by
C - ネットワークの整理 / Organizing the Network Editorial
by
harurun4635
結論から言えば、\(C \le K\) (ただし \(C\) は連結成分数 )かどうかを判定すればよいです。
まず、 \(N\) 頂点で \(C\) 個の連結成分がある森は、辺の数は \(N-C\) です。これは、各連結成分は木であることから「頂点数 \(- 1\) 本」の辺があることによって示されます。
辺の削除によって、連結成分数は減ることはありません。よって、少なくとも \(C\) 回の辺の削除は必要です。
また「連結成分数が変わらないような辺の削除」を繰り返せば、 \(C\) 回で森にすることができます。(そのような辺が存在しないのであれば、森ではないのでこれは明らかにできます)
以上より示されました。
実装例[
from atcoder.dsu import DSU
n, k = map(int, input().split())
uf = DSU(n)
for i in range(n):
a, b = map(int, input().split())
uf.merge(a-1, b-1)
print("Yes" if len(uf.groups()) <= k else "No")
posted:
last update: