MST_1584_连接所有点的最小费用_最小生成树 Minimum Spanning Tree


在这里插入图片描述

Prim Algorithm

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Kruskal Algorithm

在这里插入图片描述
在这里插入图片描述

LeetCode1584. 连接所有点的最小费用

题目描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Prim解法 - 这里是稠密图 用O(n^2) 解法

class Solution:
    def minCostConnectPoints(self, points: List[List[int]]) -> int:
        cost, n = 0, len(points)
        vis = [0] * n
        distance = [float('inf')] * n
        distance[0] = 0
        for _ in range(n):
            node = -1
            mid_cost = float('inf')
            for i in range(n):
                if not vis[i] and distance[i] < mid_cost:
                    mid_cost = distance[i]
                    node = i 
            cost += mid_cost
            vis[node] = 1
            for j in range(n):
                if not vis[j]:
                    a = abs(points[node][0] - points[j][0])
                    b = abs(points[node][1] - points[j][1])
                    distance[j] = min(distance[j], a+b)
        return cost

Kruskal解法

class Solution:
    def minCostConnectPoints(self, points: List[List[int]]) -> int:
        # if len(points) < 2: return 0
        data_dict = {}  # (start, end): distance
        for i in range(len(points)):
            for j in range(i+1, len(points)):
                a = abs(points[i][0] - points[j][0])
                b = abs(points[i][1] - points[j][1])
                data_dict[(i, j)] = a+b
        data = sorted(data_dict.items(), key=lambda item: item[1])
        tree = [_ for _ in range(len(points))]

        def find_root(x):
            if tree[x] == x: return x
            else: return find_root(tree[x])

        res = 0
        for one, cost in data:
            a, b = one
            a_root = find_root(a)
            b_root = find_root(b)
            if a_root != b_root:
                res += cost
                tree[a_root] = b_root
        return res

Reference

https://www.bilibili.com/video/av84820276/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值