LeetCode——1584. 连接所有点的最小费用

14 篇文章 0 订阅

 

class Solution:
    def minCostConnectPoints(self, points: List[List[int]]) -> int:
        plen = len(points)
        if plen < 2:
            return 0
        
        #计算任意两点之间曼哈顿距离
        cost_list = []
        for i in range(plen-1):
            for j in range(i+1, plen):
                x1, y1 = points[i]
                x2, y2 = points[j]
                cost = abs(x1-x2) + abs(y1-y2)
                cost_list.append((cost, i, j))
        cost_list.sort(key=lambda x:x[0])
        

        ans_cost = 0
        nodes = [i for i in range(plen)]
        #寻找连通分量
        def get_key(x):
            if nodes[x] == x:
                return x
            else:
                return get_key(nodes[x])
        
        for cost, i, j in cost_list:
            gi = get_key(i)
            gj = get_key(j)
            if gi != gj:
                #连通分量更新
                nodes[gi] = gj
                ans_cost += cost
        
        return ans_cost
                

  •  题目的本质是求最小生成树,可以把列表中的点抽象成图中的点
  • 最小生成树两种求解方法
    • Kruskal算法

    • Prim算法 

  • Kruskal算法

    • ​​​​​​​

    • 可以看出该算法是将权值的最小边找出来,然后最终找到最大连通分量

  • Prim算法 ​​​​​​​

    • 可以看出该算法是先找出一个最小边,然后找与该点相连的最小权重边,然后最终找到最大连通分量

  • 本次所用的方法是Kruskal算法

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值