In this problem, a tree is an undirected graph that is connected and has no cycles.
You are given a graph that started as a tree with n nodes labeled from 1 to n, with one additional edge added. The added edge has two different vertices chosen from 1 to n, and was not an edge that already existed. The graph is represented as an array edges of length n where edges[i] = [ai, bi] indicates that there is an edge between nodes ai and bi in the graph.
Return an edge that can be removed so that the resulting graph is a tree of n nodes. If there are multiple answers, return the answer that occurs last in the input.
class Solution:
def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
#按照官方Solution 1的思路
graph = collections.defaultdict(list)
def dfs(current, target, visited):
if current == target:
return True
if current in visited:
return False
visited.add(current)
for n in graph[current]:
if dfs(n, target, visited):
return True
return False
for u, v in edges:
if dfs(u, v, set()):
return [u,v]
graph[u].append(v)
graph[v].append(u)
return []
class Solution:
def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
#按照官方Solution 2的思路,利用 union find
N = max(map(max, edges))
father = [i for i in range(N+1)]
def find(x):
if father[x] != x:
father[x] = find(father[x])
return father[x]
def union(x, y):
father[find(x)] = find(y)
for u, v in edges:
if find(u) == find(v):
return [u, v]
else:
union(u, v)
return []
class Solution:
def findRedundantConnection(self, edges: List[List[int]]) -> List[int]:
#找环
nbs = collections.defaultdict(list)
for u,v in edges:
nbs[u].append(v)
nbs[v].append(u)
def dfs_find_loop(cur, pre, path, visited):
if cur in visited:
index = path.index(cur)
return path[index:]
visited.add(cur)
path.append(cur)
for neighbor in nbs[cur]:
if neighbor == pre:
continue #不走回头路
loop = dfs_find_loop(neighbor, cur, path, visited)
if loop:
return loop
visited.remove(cur)
path.pop()
return None #这条路上找不到环
loop = dfs_find_loop(1,-1,[],set())
loop_edges = set()
for i in range(len(loop)):
loop_edges.add((loop[i], loop[(i+1) % len(loop) ])) #最后一条边是连接最后一个元素到元素0,所以要mod
for u,v in reversed(edges): #按照题目要求,返回最后出现的那个
if (u,v) in loop_edges or (v,u) in loop_edges:
return [u,v]
return []