LeetCode-Python-684. じょうちょうせつぞく
本問題では、ツリーは、連通してループのない無方向図を指す.
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
注意:
更新(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