最小生成树 (prim)

/*********************************************
****************prim算法**********************
**********************************************/
void MiniSpanTree_Prim(MGraph G)
{
    int min, i, j, k;
    int adjvex[MAXVEX];      //保存相关顶点下标
    int lowcost[MAXVEX];       //保存相关顶点间边的权值
    
    lowcost[0] = 0;             //V0作为最小生成树的根开始遍历, 权值为0
    adjvex[0] = 0;              //V0第一个加入

    //初始化操作
    for (i=1; i<G.numVertexes; i++)
    {
        lowcost[i] = G.arc[0][i];       // 将邻接矩阵第0行所有权值先加入数组
        adjvex[i] = 0;                  //  初始化全部先为VO的下标
    }
    
    //生成最小生成树全过程
    for (i=1;i < G.numVertexes; i++)
    {
        min = INFINITY;    //初始化为不可能的值
        j = 1;
        k = 0;

        //遍历全部顶点
        while ( j < G.numVertexes)
        {
            //找出lowcost已存储的最小值
            if ( lowcost[j]!=0 && lowcost[j]<min)
            {
                min = lowcost[j];
                k = j;
            }
            j++;
        }

        //打印当前最小的边
        printf("(%d %d)", adjvex[k], k);
        lowcost[k] = 0;

        //邻接矩阵k行逐个遍历全部顶点
        for (j=1;j < G.numVertexes; j++)
        {
            if (lowcost[j]!=0 && G.arc[k][j]<lowcost[j])
            {
                lowcost[j] = G.arc[k][j];
                adjvex[j] = k;
            }
        }
}

猜你喜欢

转载自www.cnblogs.com/Kingpenguin/p/9977187.html