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