Leetcode 1701 Solution

This article provides solution to leetcode question 1701 (remove-max-number-of-edges-to-keep-graph-fully-traversable)

https://leetcode.com/problems/remove-max-number-of-edges-to-keep-graph-fully-traversable

Solution

class FindUnionSet:
    def __init__(self, n):
        self.n = n
        self.p = list(range(n))

    def copy(self):
        fmset = FindUnionSet(self.n)
        fmset.p = list(self.p)
        return fmset

    def union(self, i, j):
        ri = self.find(i)
        rj = self.find(j)

        self.p[ri] = rj

    def find(self, i):
        if self.p[i] == i:
            return self.p[i]

        self.p[i] = self.find(self.p[i])
        return self.p[i]


class Solution:
    def maxNumEdgesToRemove(self, n: int, edges: List[List[int]]) -> int:
        base_fmset = FindUnionSet(n + 1)

        ans = 0
        for t, src, dst in edges:
            if t == 3:
                if base_fmset.find(src) == base_fmset.find(dst):
                    ans += 1
                else:
                    base_fmset.union(src, dst)

        fmset1 = base_fmset.copy()
        for t, src, dst in edges:
            if t == 1:
                if fmset1.find(src) == fmset1.find(dst):
                    ans += 1
                else:
                    fmset1.union(src, dst)

        root_set1 = {fmset1.find(i) for i in range(1, n + 1)}
        if len(root_set1) != 1:
            return -1

        fmset2 = base_fmset.copy()
        for t, src, dst in edges:
            if t == 2:
                if fmset2.find(src) == fmset2.find(dst):
                    ans += 1
                else:
                    fmset2.union(src, dst)


        root_set1 = {fmset2.find(i) for i in range(1, n + 1)}
        if len(root_set1) != 1:
            return -1

        return ans