我们日常会遇到这样的问题:有多个城市(对应图中的 “顶点”),城市间有公路(对应 “边”)且每条公路有造价(对应 “权值”),如何用最低的总造价修公路,让所有城市都连通?这就是 “最小生成树” 问题,而Prim 算法就是解决这个问题的经典方法之一。
简单说,Prim 算法的核心思路的是 “逐步扩张”:从任意一个顶点(比如代码中的 A 点)开始,每次选一条 “连接当前已连通区域和未连通区域” 的最短边,把未连通的顶点纳入已连通区域,重复直到所有顶点都连通。最终选出的边,就构成了总权值最小的生成树。
提供的 C 语言代码,完美实现了 Prim 算法解决 9 个顶点(A-I)、15 条边的无向图问题。我们一步步拆解核心逻辑:

代码里先定义了图的结构(graph),包含顶点数组(ver[]存储 A-I)、邻接矩阵(arc[][]存储边的权值)、顶点数和边数。create_graph函数初始化了图:


算法从 A 点(下标 0)开始,用两个数组辅助:
第一步:初始化
第二步:循环选最短边(共选 8 条,因为 n 个顶点的生成树有 n-1 条边)
举个实际运行例子:
编译运行代码后,会依次输出 8 条最短边,比如:
(A,B)权值是:10
(A,I)权值是:12
(I,C)权值是:8
(C,D)权值是:22
(D,H)权值是:16
(H,E)权值是:7
(A,F)权值是:11
(F,G)权值是:17
把这些边的权值相加,就是最小总造价,所有顶点 A-I 都连通,没有环路 —— 这就是 Prim 算法的最终成果!