文章目录
题目
解题思路
从题意中可以看出来就是找出无向图中的最小生成树,可以采用prim和krustal。
Krustal算法
Krustal算法:利用并查集,初始时每个点的祖先都是自身,将每一个点看作是一棵独立的树。(无向图)每次取出一条边,如果两端点的祖先结点不同,则表明是两颗不同的树,合并两棵树(一个点变成另一个点的祖先),处理完整个集合后,所有不同的树,最后就会合并成一课树,也就是我们需要的最小生成树。
(对于有向图,求最小花费,只需在开始的时候对边权值进行从小到大排序,再进行树的合并即可)
代码实现
"""
最小生成树,krustal
"""
class Solution:
def findRedundantConnection(self, edges):
# pre为每个点对应祖先的集合
pre, res = [i for i in range(len(edges)+1)], []
# 找祖先
def find_root(r):
while pre[r] != r:
r = pre[r]
return r
# 合并树
for x, y in edges:
tx, ty = find_root(x), find_root(y)
if tx != ty:
pre[tx] = ty
continue
res = [x, y]
return res