Official

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: