在计算机科学中,Prim算法是一种用于求解最小生成树(Minimum Spanning Tree, MST)的经典算法。它广泛应用于网络设计、电路布线、聚类分析等领域。本教程将带你从零开始,用Python实现Prim算法,即使你是编程小白,也能轻松理解并掌握这一重要的图论算法。
Prim算法由数学家Robert C. Prim于1957年提出,其核心思想是:从图中的任意一个顶点开始,逐步扩展一棵树,每次选择连接树与非树顶点之间权重最小的边,直到所有顶点都被包含进来。最终得到的树就是最小生成树——即连接所有顶点且总权重最小的无环子图。
下面我们使用邻接矩阵来表示图,并用优先队列(heapq)优化边的选择过程,使算法更高效。
import heapqdef prim_algorithm(graph, start_vertex): """ 使用Prim算法求解最小生成树 :param graph: 邻接矩阵表示的图,graph[i][j] 表示顶点i到j的边权重,若无边则为float('inf') :param start_vertex: 起始顶点索引 :return: 最小生成树的边列表 [(weight, u, v), ...] """ n = len(graph) visited = [False] * n # 标记顶点是否已加入MST min_heap = [] # 优先队列:(weight, from_vertex, to_vertex) mst_edges = [] # 存储MST的边 # 从起始顶点开始 visited[start_vertex] = True # 将起始顶点的所有邻接边加入堆 for neighbor in range(n): if graph[start_vertex][neighbor] != float('inf'): heapq.heappush(min_heap, (graph[start_vertex][neighbor], start_vertex, neighbor)) while min_heap and len(mst_edges) < n - 1: weight, u, v = heapq.heappop(min_heap) # 如果目标顶点已访问,跳过 if visited[v]: continue # 将该边加入MST visited[v] = True mst_edges.append((weight, u, v)) # 将新顶点v的所有未访问邻接边加入堆 for next_neighbor in range(n): if not visited[next_neighbor] and graph[v][next_neighbor] != float('inf'): heapq.heappush(min_heap, (graph[v][next_neighbor], v, next_neighbor)) return mst_edges# 示例:定义一个图(邻接矩阵)INF = float('inf')graph = [ [0, 2, INF, 6, INF], [2, 0, 3, 8, 5], [INF, 3, 0, INF, 7], [6, 8, INF, 0, 9], [INF, 5, 7, 9, 0]]# 执行Prim算法mst = prim_algorithm(graph, start_vertex=0)print("最小生成树的边(权重, 起点, 终点):")for edge in mst: print(edge)# 计算总权重total_weight = sum(edge[0] for edge in mst)print(f"\n最小生成树总权重:{total_weight}") INF 表示两点之间无直接连接。掌握Prim算法不仅能帮助你理解最小生成树的核心思想,还能为你打下坚实的图论算法基础。在实际工程中,如设计通信网络、城市道路规划或电力线路布局时,这类算法能有效降低成本。通过本教程的Python实现Prim过程,你不仅学会了编码,更理解了算法背后的逻辑。
本文详细讲解了Prim算法的原理、步骤,并提供了完整的Python代码实现。无论你是算法初学者还是希望复习图论知识的开发者,都能从中受益。动手运行代码,修改图的结构,观察结果变化,是掌握这一图论算法的最佳方式!
本文由主机测评网于2025-12-11发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025126130.html