【应用背景】连通图中各顶点所需要的最少成本。
(1)普里姆算法
1)根据需求构造返回类型,比如求最少成本,则定义返回类型为int型的函数,传入参数为邻接矩阵g,和出发点v0;
2)定义变量:lowcost[]数组(存储图中还未并入树的各顶点到当前生成树最短边的权值),vset[]数组(标记顶点是否被并入生成树中,1为真,0为假),循环变量i,j,整型变量min,k和sum,min表示生成树到剩余顶点最短边中最短的那条边的权值,k表示与这条边相连并将被并入生成树的顶点,sum表示成本总和;
3)做一个循环将lowcost数组初始化为与出发点相邻的各条边的权值,vset初始化为0;
4)将v0标记为1,表示生成树的根结点,接下来将剩余的n-1个顶点并入生成树中,即做n-1次循环:
- 将min初始化为INF,无穷大。
- 找出min值和k值。嵌套内循环1:执行n次,依次遍历每一个顶点,如果vset[j]为0,并且lowcost[j]<min,则分别将权值lowcost[j]和顶点编号i赋值给min和k。
- 计算成本,sum += min,并将k标记为1。
- 以新并入的顶点k为媒介更新lowcost数组。因为当前生成树发生了变化,剩余顶点到生成树的权值也应发生改变。嵌套内循环2:执行n次,依次遍历每一个顶点,如果vset[i]为0,并且g.edges[k][j] < lowcost[j],表示顶点j未并入生成树,且与顶点k相连的边的权值要小于顶点j到旧的生成树最短边的权值。此时说明必须要更新lowcost[]数组,将该边权值赋值g.edges[k][j] 给lowcost[j]。
5)返回sum,算法结束。
【算法分析】算法嵌套两层循环,外层循环执行n-1次,内层循环1中if语句比较n次,所以算法时间复杂度为