图-普里姆(Prim)算法记录

普里姆(Prim)算法记录

参考资料:《大话数据结构》
prim算法是在无向有权连通图中找到最小生成树;
先把自己用excel做的流程和访问结果截图给出来,然后语言描述,然后再贴《大话数据结构》书中代码!
图-普里姆(Prim)算法记录_第1张图片
原图:
图-普里姆(Prim)算法记录_第2张图片
访问结果:
图-普里姆(Prim)算法记录_第3张图片
两个数组:

int adjvx[9];   //保存的是能到lowcost数组中最短权值结点的结点下标
int lowcost[9]; //adjvx数组中各个结点到“能到达”结点的最短路径,值为0表示已经访问

开始流程(将v0作为第一个访问结点示例)

第一轮:
a)访问v0,将lowcost[0]=0;【标识v0已经访问过了】
b)查找与v0相连的结点,将对应相连的权值写到lowcost[]数组(不可达我用的是【~】标识),将能到此节点的结点下标写到adjvex[]数组,例如:到v1的结点路径长度为10,所以lowcost[1]=10;adjvex[1]=0【表示v1可以通过v0到达】;到v5的结点也是如此!

第二轮:
a)在上一轮的lowcost数组中,查找以一个最小值,访问该值对应的结点;
例如:上一轮lowcost数组中最小值是10,对应下标为v1,访问v1;将lowcost[1]=0;【标识v1已经访问过了】
b)查找与v1相连的结点,将对应相连的权值写到lowcost[]数组,将能到此节点【也就是v1】的结点下标写到adjvex[]数组;
例如:v1能到v2,权值为18,所以lowcost[2]=18;adjvex[2]=1;v1到v6,v1到v8也是类似;

第三轮:
a)在上一轮的lowcost数组中,查找以一个最小值,访问该值对应的结点;
例如:上一轮lowcost数组中最小值是11,对应下标为v5,访问v5;将lowcost[5]=0;【标识v5已经访问过了】
b)查找与v5相连的结点,将对应相连的权值写到lowcost[]数组,将能到此节点【也就是v5】的结点下标写到adjvex[]数组;
注意:v5能到v6,权值为17,与v1到v6权值为16相比,前者要大,所以保留v1到v6的记录,不把v5到v6的数据写进lowcost数组和adjvex数组;其实在每一轮做这一步的时候,都要比较此次访问的结点到相连结点,在此之前的访问过程中,是否有更短的权值路径,有的话,则保留原记录!
v5能到v4,将此记录写到lowcost数组和adjvex数组!

第四轮:
a)在上一轮的lowcost数组中,查找以一个最小值,访问该值对应的结点;
例如:上一轮lowcost数组中最小值是12,对应下标为v8,访问v8;将lowcost[8]=0;【标识v8已经访问过了】
b)查找与v8相连的结点,将对应相连的权值写到lowcost[]数组,将能到此节点【也就是v8】的结点下标写到adjvex[]数组;
例如:v8到v2,v8到v3;
。。。。。。
后面的就可以自己模拟了

源码:

void MiniSpanTree_Prim(MGraph G)
{
    int min, i, j, k;
    int adjvex[MAXVEX];
    int lowcost[MAXVEX];
    lowcost[0] = 0;
    adjvex[0] = 0;
    for(i = 1; i0][i];
        adjvex[i] = 0;
    }
    for(i = 1; imin = INFINITY;
        j = 1; 
        k = 1;
        while(jif(lowcost[j]!=0 && lowcost[j]<min)
            {
                min = lowcost[j];
                k = j;
            }
            j++;
        }
        printf("(%d,%d)",adjvex[k],k);
        lowcost[k] = 0;
        for(j = 1; jif(lowcost[j]!=0 && G.arc[k][j]

你可能感兴趣的:(C,数据结构)