图的最小生成树,普利姆算法
Posted rickcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图的最小生成树,普利姆算法相关的知识,希望对你有一定的参考价值。
//Prim算法生成最小生成树
void MiniSpanTree_prim(MGraph G)
{
int min, i, j, k;
int adjvex[MAXVEX]; //保存相连的两个顶点,比如数组下表j,adjvex[j]内有顶点k,则是j与k顶点相连;
int lowcost[MAXVEX]; //保存顶点间边的权值,比如lowcost[j]代表顶点j与顶点“adjvex[j]=‘k’”的边权值;
lowcost[0] = 0; //初始化第一个权值为0,即将v0加入生成树
//lowcost的值为0表示此下标的顶点已经加入生成树
adjvex[0] = 0; //初始化第一个顶点下标为0
for (i = 1; i < G.numVertexes;i++)
{
lowcost[i] = G.arc[0][i]; //将v0顶点与之有关的边的权值都存放入权值数组
adjvex[i] = 0; //初始化都为v0的下标
}
for (i = 1; i < G.numVertexes;i++)
{
min = INFINITY;
j = 1;
k = 0;
while (j<G.numVertexes)
{
if (lowcost[j]!=0&&lowcost[j]<min)
{
//如果权值不为0且权值小于min
min = lowcost[j]; //则让当前权值成为最小值
k = j; //将当前最小值的下标存放k
}
j++;
}
printf("(%d,%d)", adjvex[k], k); //打印当前顶点边中权值最小边
lowcost[k] = 0;//将当前顶点的权值置为0,表示此顶点已经完成任务
//和上面做了几乎一样的操作,就是更新权值
for (j = 1; j < G.numVertexes;j++) //循环所有顶点,因为我们已经确认第一个放入的0,所有我们循环可以省去0
{
if (lowcost[j] != 0 && G.arc[k][j]<lowcost[j]) //如果j顶点还没找到“与j顶点相连的最小边权值的顶点k2” 且 当前k顶点与j顶点边权值小于之前的"j顶点与k1顶点的边权值"
{
lowcost[j] = G.arc[k][j]; //将较小权值存入lowcost,表明顶点j与k相连的边权值;
adjvex[j] = k; //将下标为k的顶点存入adjvex,表明顶点j与k相连;
}
}
}
}
代码作者:山上有风景
---博客:https://www.cnblogs.com/ssyfj/p/9488723.html
以下为实例图片和数组:
PS:暂时没时间画图,有空再搞
以上是关于图的最小生成树,普利姆算法的主要内容,如果未能解决你的问题,请参考以下文章
(王道408考研数据结构)第六章图-第四节1:最小生成树之普利姆算法(思想代码演示答题规范)