【力扣】冗余连接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/redundant-connection
在本问题中, 树指的是一个连通且无环的无向图。
输入一个图,该图由一个有着N个节点 (节点值不重复1, 2, ..., N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间,这条附加的边不属于树中已存在的边。
结果图是一个以边组成的二维数组。每一个边的元素是一对[u, v] ,满足 u < v,表示连接顶点u 和v的无向图的边。
返回一条可以删去的边,使得结果图是一个有着N个节点的树。如果有多个答案,则返回二维数组中最后出现的边。答案边 [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
思路:并查集,我模仿以前做过的题目写但没写完整。
1 class Solution: 2 def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: 3 a = set() 4 for l,r in edges: 5 a.append(l) #set不能用append方法 6 a.append(r) 7 parent={i:i for i in range(len(a))} 8 def find(x): 9 if x!=parent[x]: 10 parent[x]=find(parent[x]) 11 return parent[x] 12 for l,r in edges: 13 a,b = find(l),find(r) 14 if a!= b: 15 parent[b]=a 16 dic=collections.defaultdict(list) 17 for i in range(n): 18 a=find(i) 19 dic[a].append(i)
在合并两个点之前,去check一下两个点的root是否相同,如果相同肯定有环了。
正确代码:
1 class Solution: 2 def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: 3 n = len(edges) 4 f = {} 5 def find(x): 6 f.setdefault(x, x) 7 if x != f[x]: 8 f[x] = find(f[x]) 9 return f[x] 10 11 def union(x, y): 12 f[find(x)] = find(y) 13 14 for i in range(n): 15 if find(edges[i][0]) != find(edges[i][1]): 16 union(edges[i][0], edges[i][1]) 17 else: 18 return edges[i] 19 return -1 20 21 作者:syr123 22 链接:https://leetcode-cn.com/problems/redundant-connection/solution/dfs-bfs-bing-cha-ji-xiang-xi-quan-mian-d-j050/ 23 来源:力扣(LeetCode)
其他思路:
dfs,用字典构造无向图,key为某点a,value为与某点a相连的点集合set。
实现过程,边构造边检测,没必要构建完了图再删边去检测。详细见代码:
1 class Solution: 2 def findRedundantConnection(self, edges: List[List[int]]) -> List[int]: 3 graph = {} 4 5 def dfs(u, v): 6 visited.add(u) 7 for node in graph[u]: 8 if node == v: 9 return True 10 elif node not in visited: 11 if dfs(node, v): 12 return True 13 return False 14 15 for edge in edges: 16 if edge[0] not in graph: 17 graph[edge[0]] = {edge[1]} 18 else: 19 visited = set() 20 if dfs(edge[0], edge[1]): 21 return edge 22 else: 23 graph[edge[0]].add(edge[1]) 24 if edge[1] not in graph: 25 graph[edge[1]] = {edge[0]} 26 else: 27 graph[edge[1]].add(edge[0]) 28 29 作者:syr123 30 链接:https://leetcode-cn.com/problems/redundant-connection/solution/dfs-bfs-bing-cha-ji-xiang-xi-quan-mian-d-j050/ 31 来源:力扣(LeetCode)
浙公网安备 33010602011771号