普利姆算法的核心是从一个顶点出发,以这个顶点为一个树,依次将剩余顶点中到达这棵树权值小的顶点加入到树中,
为此算法需要lowcost[ ]数组来存储图中各个顶点到这棵树的权值,其中以值0来表示该顶点已经在树中,执行N-1个即可完成添加
另外设adjvex[ ]数组用来存储每个顶点在树中的“前驱”结点,即双亲结点
//普利姆算法:从一个顶点开始形成一棵树,依次添加剩余顶点中到达这棵树权值最小的顶点 #include<stdio.h> //包含两个辅助数组 lowcost[]数组用于存储当前图中各个顶点到现有树的权值 // adjvex[]数组用于存储各个顶点与树相接的对应“前驱”顶点 void prim(MGrap G) //图以零解矩阵存储便于取顶点间权值 { int i,min,k; int lowcost[G.vexnum]; int adjvex[G.vexnum]; for(i = 0;i < G.vexnum;++i){ lowcost[i] = G.edges[0][i]; //初始化lowcost[]数组,当前存储图中各个顶点到源点的权值 adjvex[i] = 0; //初始化adjvex[]数组,此时下一个接入树中的顶点的前驱必然是0号顶点 } for(j = 1;j < G.vexnum;++j){ //此处为重点,这个for循环执行N-1次,即我们只需添加N-1条边 min = 65535; //每一次循环开始时将min的值重置 for(i = 0;i < G.vexnum;++i){ //扫描lowcost[]数组,找出下一个到达树的权值最小的顶点 if(lowcost[i] != 0 && lowcost[i] < min){ min = lowcost[i]; k = i; } } lowcost[k] = 0; //将这个到树权值最小的顶点加入到树中,其在lowcost[]数组的值标记为0 printf("%d->%d",adjvex[k],k); //打印新选中的顶点到树的边 //更新lowcost[]数组和adjvex[]数组 for(i = 0;i < G.vexnum;++i){ if(lowcost[i] != 0 && lowcost[i] > G.edges[k][i]){ lowcost[i] = G.vexnum[k][i]; adjvex[i] = k; } }