Redundant Connection
冗余的连接; LeetCode 684; LintCode 1088
Input: edges = [[1,2],[1,3],[2,3]]
Output: [2,3]Input: edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]
Output: [1,4]Last updated
冗余的连接; LeetCode 684; LintCode 1088
Input: edges = [[1,2],[1,3],[2,3]]
Output: [2,3]Input: edges = [[1,2],[2,3],[3,4],[1,4],[1,5]]
Output: [1,4]Last updated
从一张空白的图开始
从edges里面依次取出每一条edge,用[u,v]来表示:
if u,v 在当前的图中连通:
[u,v]就是答案 -> return [u,v]
else:
把edge [u,v]加入图中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 []