Leetcode 684. 冗余连接 / 最小生成树 - Krustal / python实现

题目

在这里插入图片描述

解题思路

从题意中可以看出来就是找出无向图中的最小生成树,可以采用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

猜你喜欢

转载自blog.csdn.net/qq_42711381/article/details/105832440