最小生成树(prim算法)C语言实现

本文详细介绍了普里姆算法的基本思想及其C语言实现过程,用于求解带权无向图的最小生成树问题。通过选取权值最小的边连接已选顶点集与未选顶点集,逐步构建生成树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先看一下下面这张图。

 

 

 

 算法思想:可取图中任意一个顶点V作为生成树的根,之后若要往生成树上添加顶点W,则在顶点V和W之间必定存在一条边。并且该边的权值在所有连通顶点V和W之间的边中取值最小。

一般情况下,假设n个顶点分成两个集合:U(包含已落在生成树上的结点)和V-U(尚未落在生成树上的顶点),则在所有连通U中顶点和V-U中顶点的边中选取权值最小的边

 

 

下面是其C语言算法实现:

//最小生成树 普里姆算法    采用邻接矩阵存储  
void MiniSpanTree(MGraph *G)  
{  
    int min, i, j, k;  
    int adjvex[MaxVex];     //保存相关顶点下标  
    int lowcost[MaxVex];    //保存相关顶点间边的权值  
    lowcost[0] = 0;         //初始化第一个权值为0,即V0加入生成树  
    adjvex[0] = 0;          //初始化第一个顶点下标为0  
  
  //初始化操作
    for (i=1; i<G->numVertexes; ++i)  
    {  
        lowcost[i] = G->arc[0][i];  
        adjvex[i] = 0;              //将v0顶点与之有边的权值存入数组  并初始化都为v0的下标  
    }  //adjvex[i],i是其他节点的标记,adjvex[i]=0即是把0~n的节点都与节点0关联起来
  
    for (i=1; i<G->numVertexes; ++i)  
    {  
        min = INFINITY;  
  
        j = 1;  
        k = 0;  //保存权值最小的顶点
        //遍历v-u集合中剩下的节点
        while (j<G->numVertexes)  
        {  
            //如果两个顶点之间存在边并且权值小于min  
            if (lowcost[j]!=0 && lowcost[j]<min)  
            {  
                min = lowcost[j];  
                k = j;  
            }  
  
            ++j;  
        }  
        printf("(%d, %d)", adjvex[k], k);   //输出当前顶点边中权值最小的边  
        lowcost[k] = 0;                     //将当前顶点的权值设为0,表示此顶点已经完成任务  

        //更新新节点与其他节点之间的最小花费和关联
        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;  
            }  
        }  
    }  
}  

 

转载于:https://www.cnblogs.com/You0/p/5476920.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值