返回
Prim算法助力:最小成本连接所有点(Python)
后端
2023-11-02 03:02:38
Prim算法概述
Prim算法是一种贪心算法,它从一个顶点开始,逐步将尚未连接的顶点添加到生成树中,每次都选择权重最小的边连接两个连通分量。该算法可以有效地解决最小生成树问题,特别适合于稠密图。
Python实现Prim算法
# Prim算法
def prim(graph):
# 初始化
mst = [] # 最小生成树
visited = [False] * len(graph) # 标记顶点是否已访问
visited[0] = True # 将第一个顶点标记为已访问
# 循环,直到所有顶点都已访问
while not all(visited):
# 找到当前最小的权重边
min_weight = float('inf')
min_edge = None
for i in range(len(graph)):
if visited[i]:
for j in range(len(graph[i])):
if not visited[j] and graph[i][j] < min_weight:
min_weight = graph[i][j]
min_edge = (i, j)
# 将找到的边添加到最小生成树中
mst.append(min_edge)
# 将与最小边相连的顶点标记为已访问
visited[min_edge[1]] = True
# 返回最小生成树
return mst
# 使用Prim算法求解最小成本连接所有点的LeetCode 1584题
def min_cost_to_connect_points(points):
# 构造图
graph = [[0] * len(points) for _ in range(len(points))]
for i in range(len(points)):
for j in range(i+1, len(points)):
# 计算两点之间的距离
distance = abs(points[i][0] - points[j][0]) + abs(points[i][1] - points[j][1])
graph[i][j] = graph[j][i] = distance
# 使用Prim算法求解最小生成树
mst = prim(graph)
# 计算最小生成树的总权重
total_weight = 0
for edge in mst:
total_weight += graph[edge[0]][edge[1]]
return total_weight
# 测试
points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
print(min_cost_to_connect_points(points)) # 输出:20
总结
LeetCode 1584题“最小成本连接所有点”考察了Prim算法在图论中的应用。该算法通过贪心策略,一步步构建最小生成树,实现了以最小成本连接所有点的目标。我们使用Python语言清晰地实现了Prim算法,并将其应用于该问题。希望本教程对您理解Prim算法及其在图论中的应用有所帮助。