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

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算法

猜你喜欢

转载自blog.csdn.net/weixin_37724529/article/details/112801313