数据结构--prim算法

prim算法主要是计算出最小代价生成树,也叫做最小生成树

什么是prim算法

举个例子,我们在图一这个图中找出一个最小权的遍历路线。

图1

如果是使用普通的遍历方法可以达到图2的方案二,而使用prim算法可以算出方案三。
图2
可以看出虽然 方案二和方案三的权值只相差1,但是这个例子的规模很小。如果投影到现时世界,方案三却可以为你剩下更多的成本。
prim算法使用的是邻接矩阵的方法,如果忘记邻接矩阵是如何创建的的话可以回顾一下数据结构–邻接矩阵
我们使用一个二维数组表示各个顶点之间的关系,0表示自身无权值,65535表示无穷大,在图中用∞表示。
图3
这样我们就把三维的图关系用二维数组表示出来了。每一个数据都表示该点横坐标与纵坐标之间的权值,例如(v0,v1)的权值为10。

prim算法怎样实现

正如上文所说,首先需要创建一个邻接矩阵。

邻接矩阵的创建

代码实现

声明四个局部变量,两个数组(1.记录父结点信息,2.记录权值以及判断一点是否遍历过)

int min,i,j,k;
int adjvex[MAXVEX];//记录父
int lowcost[MAXVEX];//记录权值&一点是否遍历过
#define INFINITY

让图上下标为0(下文用v0表示)的顶点进入树,从v0开始遍历。

lowcost[0]=0;

初始化第一排数组,以及他们的父结点都为v0

for(i=0;i<G.numVertexes;i++)
   {
   
    lowcost[i]=G.arc[0][i];
    adjvexs[i]=0;
   }

开始遍历lowcost[],寻找最小的权值边。

   printf("%c ",G.vexs[0]);
for(i=1;i<numVertexes;i++)
   {
   
       min=INFINITY;//初始化最小值为无穷大
       k=0;
       for(j=1;j
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aitee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值