码迷,mamicode.com
首页 > 编程语言 > 详细

图的最小生成树,普利姆算法

时间:2020-07-08 22:47:59      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:为我   exe   log   顶点   循环   int   实例   href   一个   

//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:暂时没时间画图,有空再搞

图的最小生成树,普利姆算法

标签:为我   exe   log   顶点   循环   int   实例   href   一个   

原文地址:https://www.cnblogs.com/rickcode/p/13269411.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!