684. 冗余连接
在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。
返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [u, v] 应满足相同的格式 u < v。
解题思路:
借助并查集的思想,我们可以设置一个父亲集合,其中每一个值表示当前index的父亲index。如果某个index的值是它本身,则说明它是“祖宗”(doge)。比如[3, 2, 0, 3]:0的父亲是3,1的父亲是2,2的父亲是0,3是“祖宗”,即1->2->0->3。那么在本题中,我们拿到某个edge的两个点,让它们分别去找自己的父亲,父亲再去找父亲的父亲......推本溯源返回的结果,如果两个点的根源相同,那么它们的连接会出现环,所以这两个点就是我们要找的答案。
class Solution:
def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
father = [i for i in range(len(edges) + 1)]
def find_father(num):
while num != father[num]:
num = father[num]
return num
def union(l, r):
l = find_father(l)
r = find_father(r)
if l != r:
father[r] = l
return False
else:
return True
for item in edges:
l, r = item
if union(l, r):
return [l, r]