最小生成树求解算法-普利姆算法

发布时间 2023-11-14 10:46:45作者: 苏二七

使用场景

对于连通图从一点出发到达其他各点有很多条路径,但是我们要求最小生成树包含的点和边,最小生成树边 = 点 - 1;

用途在于:求解一地到其他地点最短布线问题。

要求:

最小生成树(1)包含所有点 (2)点点间只有一条通路

相对于克鲁什卡尔算法,适用于稠密图,与边数无关。

编码

- 输入图,minDist[]最小路径

  - 由于能生成树的是连通图所以任意一个点开始遍历都可以 我们默认第一个

  - 创建theClose 包含所有点的 adjvex相邻边,theClose.lowcost;

  - 初始化 默认选择第一个点 for 

    - 更新 theClose->->adjvex相邻边 = i; theClose.lowcost = getWeight(1, i);

  - while 剩余没有遍历的点个数 > 0

    - 寻找代价最小点【lowcost>0 || lowcost<min,返回下标min_i;

    - 输出当前遍历路径 printf("v%d v%d\n",G.vexs[theclose[min_i].adjvex邻接边],G.vexs[min_i])

    - getWeight(min_i-各点[没有被加入最小路径点]) < theClose.lowcost,更新 theClose.adjvex = min_i; theClose.lowcost = getWeight(min_i, i);