力扣1584. 连接所有点的最小费用之最小生成树---Python

本文介绍了一种解决最小生成树问题的经典算法——Prim算法。通过该算法可以求解给定点集之间的最小连接成本,特别适用于计算2D平面上点之间的曼哈顿距离。文章详细解释了Prim算法的具体实现过程,并提供了完整的AC代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
给你一个points 数组,表示 2D 平面上的一些点,其中 points[i] = [xi, yi] 。

连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 :|xi - xj| + |yi - yj| ,其中 |val| 表示 val 的绝对值。

请你返回将所有点连接的最小总费用。只有任意两点之间 有且仅有 一条简单路径时,才认为所有点都已连接。

示例 1:

输入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
输出:20

示例 2:

输入:points = [[3,12],[-2,5],[-4,1]]
输出:18

示例 3:

输入:points = [[0,0],[1,1],[1,0],[-1,1]]
输出:4

示例 4:

输入:points = [[-1000000,-1000000],[1000000,1000000]]
输出:4000000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/min-cost-to-connect-all-points
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:
比较正常的最小生成树之prim算法的解法,初始化一个起点,依次选择距离已选节点集中最近的节点,直到每个节点都被选到,即可。

AC代码:

class Solution:
    def minCostConnectPoints(self, points: List[List[int]]) -> int:
        n = len(points)
        self.ans = 0
        vis = [False for i in range(n)]
        dis = [[float('inf') for j in range(n)]for i in  range(n)]
        low = [float('inf') for i in range(n)]
        # 初始化权重
        for i in range(n):
            for j in range(i+1, n):
                dis[j][i] = dis[i][j] = abs(points[i][0]-points[j][0])+abs(points[i][1]-points[j][1])
        # print(dis)
        def prim(n):
            # 从任意一个节点开始,比如从第0个节点开始
            pre_point = 0
            vis[0] = True
            for i in range(n):
                if vis[i]:
                    continue
                low[i] = dis[i][0]
            # 找到距离当前节点集距离最小的节点,并标记
            # 循环n-1次,因为要选择剩下的n-1个节点
            for cnt in range(n-1):
                minValue = float('inf')
                for i in range(n):
                    if vis[i]:
                        continue
                    # print('distance is ',dis[i][pre_point])
                    if low[i] < minValue:
                        minValue = low[i]
                        pre_point = i
                # print(pre_point,minValue)
                vis[pre_point] = True
                self.ans += minValue
                #print(minValue)
                # 更新权重
                for i in range(n):
                    if vis[i]:
                        continue
                    if  low[i] > dis[i][pre_point]:
                        low[i] = dis[i][pre_point]
        prim(n)
        return self.ans
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

细水长流者

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值