[leetcode]Redundant Connection II

用了并查集,分成有入度为2以及有环两种情况。

class Solution:
    def findRedundantDirectedConnection(self, edges: List[List[int]]) -> List[int]:
        n = len(edges)
        indegrees = {k + 1: 0 for k in range(n)}
        for u, v in edges:
            indegrees[v] += 1
        
        for i in range(n - 1, -1, -1):
            u, v = edges[i]
            if indegrees[v] == 2 and self.validTreeExceptN(edges, i):
                return edges[i]

        for i in range(n - 1, -1, -1):
            u, v = edges[i]
            if indegrees[v] == 1 and self.validTreeExceptN(edges, i):
                return edges[i]

        return None

    def validTreeExceptN(self, edges, n):

        def find(fa, i):
            if fa[i] != i:
                fa[i] = find(fa, fa[i])
            return fa[i]

        def union(fa, i, j):
            fa[j] = find(fa, i)

        # union-find set
        fa = [0] * (len(edges) + 1)
        for i in range(len(fa)):
            fa[i] = i

        # valid tree with out edge n
        cnt = len(edges)
        for i in range(len(edges)):
            if i == n:
                continue
            
            u, v = edges[i]
            fu = find(fa, u)
            fv = find(fa, v)
            if fu != fv:
                union(fa, v, u)
                cnt -= 1
        
        return cnt == 1

        

        

  

原文地址:https://www.cnblogs.com/lautsie/p/12269702.html