1class DSUF:2def __init__(self, n):3self.arr = [-1] * n45def find(self, node):6p = self.arr[node]7if p == -1:8return node9self.arr[node] = self.find(p)10return self.arr[node]1112def union(self, a, b):13aP = self.find(a)14bP = self.find(b)15if aP == bP:16return 017self.arr[aP] = bP18return 11920def countParents(self):21count = 022for i in self.arr:23if i == -1:24count += 125return count262728class Solution:29def maxNumEdgesToRemove(self, n: int, edges: List[List[int]]) -> int:30# Solution - DSU31# Time - O(ElogV)32# Space - O(V)3334aliceSet = DSUF(n)35bobSet = DSUF(n)3637bothEdges = []38bobEdges = []39aliceEdges = []40for i in range(len(edges)):41if edges[i][0] == 3:42bothEdges.append(edges[i])43elif edges[i][0] == 1:44aliceEdges.append(edges[i])45else:46bobEdges.append(edges[i])4748usedEdgeCount = 04950# connect both edges51for edge in bothEdges:52aReq = aliceSet.union(edge[1] - 1, edge[2] - 1)53bReq = bobSet.union(edge[1] - 1, edge[2] - 1)54if aReq and bReq:55usedEdgeCount += 15657# connect individual edges58for edge in aliceEdges:59usedEdgeCount += aliceSet.union(edge[1] - 1, edge[2] - 1)6061for edge in bobEdges:62usedEdgeCount += bobSet.union(edge[1] - 1, edge[2] - 1)6364if aliceSet.countParents() == 1 and bobSet.countParents() == 1:65return len(edges) - usedEdgeCount6667return -1