class Solution:
def maxNumEdgesToRemove(self, n: int, edges: List[List[int]]) -> int:
auf = UF(n)
buf = UF(n)
needed_edges = 0
for t, v1, v2 in edges:
if t == 3:
needed_edges += auf.union(v1, v2) | buf.union(v1, v2)
for t, v1, v2 in edges:
if t == 1:
needed_edges += auf.union(v1, v2)
elif t == 2:
needed_edges += buf.union(v1, v2)
if auf.is_completed() and buf.is_completed():
return len(edges) - needed_edges
return -1
class UF:
def __init__(self, size):
self.rep = [i for i in range(size + 1)]
self.rank = [ 1 for _ in range(size + 1)]
self.total_edges = size - 1
def is_completed(self):
return self.total_edges == 0
def find(self, node):
if node != self.rep[node]:
self.rep[node] = self.find(self.rep[node])
return self.rep[node]
def union(self, node1, node2):
rep1 = self.find(node1)
rep2 = self.find(node2)
if rep1 != rep2:
if self.rank[rep1] < self.rank[rep2]:
self.rep[rep1] = rep2
elif self.rank[rep1] > self.rank[rep2]:
self.rep[rep2] = rep1
else:
self.rep[rep2] = rep1
self.rank[rep1] += 1
self.total_edges -= 1
return 1
else:
return 0