Harukaze

 

【力扣】冗余连接

来源:力扣(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)

 

posted on 2021-01-13 13:51  Harukaze  阅读(142)  评论(0)    收藏  举报

导航