Prim普利姆算法

普利姆算法的核心是从一个顶点出发,以这个顶点为一个树,依次将剩余顶点中到达这棵树权值小的顶点加入到树中,

为此算法需要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;
            }
        }
    

猜你喜欢

转载自www.cnblogs.com/strolling-leisurely/p/11374698.html