题目描述:
给你一个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