最小生成树

/*********************************************
****************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;
            }
        }
    }
}
/*****************************************
******************************************
***************Kruskal算法****************
******************************************
*****************************************/

int Find (int *parent, int f)
{
    while (parent[f] > 0)
    {
        f = parent[f];
    }
    
    return f;
}

void MiniSpanTree_Kruskal (MGraph G)
{
    int i, n, m;
    Edge edges[MAGEDGE];    //定义边集数组
    int parent[MAXVEX];     //定义parent数组用来判断边与边是否形成环路
    
    for (i=0;i<G.numEdges;i++)
    {
        parent[i] = 0;
    }
    
    for (i=0;i<G>numEdges;i++)
    {
        n = Find(parent, edges[i].begin);
        m = Find(parent, edges[i].end);
        
        if (n!=m)           //如果n==m 则形成环路 不满足
        {
            parent[n] = m;  //将此边的结尾顶点放入下标为起点的parent数组中,表示此顶点已经在生成树中
            printf("(%d %d) %d" edges[i].begin, edges[i].end, edges[i].weight);
        }
    }
}

 

posted @ 2018-11-18 10:38  企鹅君  阅读(171)  评论(0编辑  收藏  举报