class DisjointSet: def __init__(self, n): self.rank = [0] * (n + 1) self.parent = list(range(n + 1)) self.size = [1] * (n + 1) def find_upar(self, node): if node == self.parent[node]: return node self.parent[node] = self.find_upar(self.parent[node]) return self.parent[node] def union_by_rank(self, u, v): ulp_u = self.find_upar(u) ulp_v = self.find_upar(v) if ulp_u == ulp_v: return if self.rank[ulp_u] < self.rank[ulp_v]: self.parent[ulp_u] = ulp_v elif self.rank[ulp_v] < self.rank[ulp_u]: self.parent[ulp_v] = ulp_u else: self.parent[ulp_v] = ulp_u self.rank[ulp_u] += 1 def union_by_size(self, u, v): ulp_u = self.find_upar(u) ulp_v = self.find_upar(v) if ulp_u == ulp_v: return if self.size[ulp_u] < self.size[ulp_v]: self.parent[ulp_u] = ulp_v self.size[ulp_v] += self.size[ulp_u] else: self.parent[ulp_v] = ulp_u self.size[ulp_u] += self.size[ulp_v] class Solution: def Solve(self, n, edge): ds = DisjointSet(n) cnt_extras = 0 for u, v in edge: if ds.find_upar(u) == ds.find_upar(v): cnt_extras += 1 else: ds.union_by_size(u, v) cnt_c = sum(1 for i in range(n) if ds.parent[i] == i) ans = cnt_c - 1 if cnt_extras >= ans: return ans return -1 if __name__ == "__main__": V = 9 edge = [[0, 1], [0, 2], [0, 3], [1, 2], [2, 3], [4, 5], [5, 6], [7, 8]] obj = Solution() ans = obj.Solve(V, edge) print("The number of operations needed:", ans)