LeetCode-Python-684. じょうちょうせつぞく

2596 ワード


本問題では、ツリーは、連通してループのない無方向図を指す.
N個のノード(ノード値が1,2,...,Nを繰り返さない)を有するツリーと、付加的なエッジからなる図を入力する.追加のエッジの2つの頂点は、ツリーにすでに存在するエッジではない1~Nの中間に含まれます.
結果図は からなる2次元配列である.各 の要素は、[u, v]のペアであり、u < vを満たし、頂点uおよびvを接続する無方向図のエッジを表す.
削除可能なエッジを返し、結果図がN個のノードを持つツリーになるようにします.複数の答えがある場合は、2 D配列の最後に表示されるエッジを返します.答えのエッジ[u, v]は、同じフォーマットu < vを満たすべきである.
例1:
  : [[1,2], [1,3], [2,3]]
  : [2,3]
  :        :
  1
 / \
2 - 3

例2:
  : [[1,2], [2,3], [3,4], [1,4], [1,5]]
  : [1,4]
  :        :
5 - 1 - 2
    |   |
    4 - 3

注意:
  • 入力の2 D配列サイズは3~1000です.
  • の2次元配列の整数は1〜Nであり、Nは入力配列のサイズである.

  • 更新(2017-09-26):問題の説明とテスト例を再確認し、図が無方向図であることを明らかにした.図面の詳細については、冗長接続IIを参照してください.いかなるご不便をおかけしても、深くお詫び申し上げます.
     
    考え方:
    各エッジを順に挿入し、
    1つのエッジの2つの端点がこのエッジを挿入する前に同じrootを見つけることができる場合は、このエッジが挿入されるとループが形成されることを示します.
    条件を満たす最後のエッジを見つけて返せばいいです.
    class UnionFindSet(object):
        def __init__(self, edges):
    
            # m, n = len(grid), len(grid[0])
            self.roots = [i for i in range(1001)]
            self.rank = [0 for i in range(1001)]
            self.count = 0
    
        def find(self, member):
            tmp = []
            while member != self.roots[member]:
                tmp.append(member)
                member = self.roots[member]
            # for root in tmp:
            #     self.roots[root] = member
            return member
            
        def union(self, p, q):
            parentP = self.find(p)
            parentQ = self.find(q)
            if parentP != parentQ:
                if self.rank[parentP] > self.rank[parentQ]:
                    self.roots[parentQ] = parentP
                elif self.rank[parentP] < self.rank[parentQ]:
                    self.roots[parentP] = parentQ
                else:
                    self.roots[parentQ] = parentP
                    self.rank[parentP] -= 1
                self.count -= 1
    class Solution(object):
        def findRedundantConnection(self, edges):
            """
            :type edges: List[List[int]]
            :rtype: List[int]
            """
            ufs = UnionFindSet(edges)
            res = []
            for edge in edges:
                x, y = edge[0], edge[1]
                p, q = ufs.find(x), ufs.find(y)
                # print (x, y), (p, q)
                if p == q:
                    res = edge
                else:          
                    ufs.union(p, q)
            
            return res