class Solution:
def maxNumEdgesToRemove(self, n: int, edges: List[List[int]]) -> int:
# step1: use type3 edges as much as possible to connect vertices for both Bob and Alice
# step2: use type1, type2 to connect Alice vertices, Bob vertices respectively
aliceUnions = UnionFind(n + 1)
bobUnions = UnionFind(n + 1)
usedEdges = 0
for _, u, v in filter(lambda edge: edge[0] == 3, edges):
if aliceUnions.find(u) != aliceUnions.find(v):
usedEdges += 1
aliceUnions.union(u, v)
bobUnions.union(u, v)
for edgeType, u, v in filter(lambda edge: edge[0] != 3, edges):
targetUnions = aliceUnions if edgeType == 1 else bobUnions
if targetUnions.find(u) != targetUnions.find(v):
usedEdges += 1
targetUnions.union(u, v)
if not aliceUnions.getUnionCount() == bobUnions.getUnionCount() == 2:
return -1
return len(edges) - usedEdges
class UnionFind:
def __init__(self, dataSize):
self.par = list(range(dataSize))
self.size = [1] * dataSize
self.unionCount = dataSize
def find(self, u):
if self.par[u] != u:
self.par[u] = self.find(self.par[u])
return self.par[u]
def getSize(self, u):
return self.size[self.find(u)]
def union(self, u, v):
u, v = self.find(u), self.find(v)
if u == v:
return
if self.size[u] < self.size[v]:
u, v = v, u
self.par[v] = u
self.size[u] += self.size[v]
self.unionCount -= 1
def getUnionCount(self):
return self.unionCount