ABC 120 D Decayed Bridges【Python】

問題はこちら

橋1から壊していくのではなく、橋 M から繋いでいくと考える。

iA, B とつなぐとき、A, B の属する連結成分の大きさがそれぞれ s, t だったとすると問題文中で定義されている「不便さ」は s * t 減ることが計算するとわかる。

class UnionFind():
    # union と same と size をメソッドにもつ UnionFind木

N, M = map(int, input().split())
edges = [tuple(map(int, input().split())) for _ in range(M)]

ans = [0]*(M + 1)
ans[M] = N*(N - 1) // 2
X = UnionFind(N)
for i in reversed(range(M)):
   A, B = edges[i]
   A -= 1; B -= 1
   s, t = X.size(A), X.size(B)
   if X.same(A, B):
       ans[i] = ans[i + 1]
       continue
   ans[i] = ans[i + 1] - s * t
   X.union(A, B)
   
print('\n'.join(map(str, ans[1:])))
​


この記事が気に入ったらサポートをしてみませんか?