题解 | #最小生成树#

最小生成树

https://www.nowcoder.com/practice/735a34ff4672498b95660f43b7fcd628

#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 返回最小的花费代价使得这n户人家连接起来
# @param n int整型 n户人家的村庄
# @param m int整型 m条路
# @param cost int整型二维数组 一维3个参数,表示连接1个村庄到另外1个村庄的花费的代价
# @return int整型
#
class Solution:
    def miniSpanningTree(self , n: int, m: int, cost: List[List[int]]) -> int:
        # write code here
        # Kruskal算法
        
        # 构建并查集
        u = UnionFindSet(n)
        # 边按权重升序排序
        cost = sorted(cost, key = lambda x: x[2])
        # 遍历每条边
        res = 0
        for i in range(m):
            [Fr,To,weigh] = cost[i]
            if u.find(Fr) == u.find(To):
                continue
            res += weigh
            u.union(Fr, To)
        return res
    
class UnionFindSet:
    def __init__(self, n):
        self.par = dict((i,i) for i in range(1, n+1))
        
    def find(self, node):
        if node != self.par[node]:
            self.par[node] = self.find(self.par[node])
        return self.par[node]
    
    def union(self,x,y):
        self.par[self.find(y)] = self.find(x)

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务