prim算法构造最小生成树(邻接表和数组两种存储方式实现)

最小生成树问题简单地说就是在有N个结点的图中寻找能连接n个结点的n-1条边,使总的代价最小。

构造构造最小生成树有两个典型的算法,prim算法和Kruskal算法。

prim算法思想:

假设N={V,{E}}是联通网,TE是N上最小生成树中边的集合。算法从U={u}(u在v中),TE={}开始,重复执行以下操作:在所有的U和V中相连接的边中寻找一条代价最小的边(u,v)加入TE中,同时将u加入到U中,知道U=V为止。此时TE中必有n-1条边,则T={V,{TE}}为N的最小生成树。

此程序的几个关键点:

1、使用辅助数组closedge记录从U中到V-U中代价最小的边。(即V-U中的结点到U中哪个结点的代价最小)

2、V表示图的全部结点的集合,当有结点已经用于生成最小生成树后把结点加入U中,cloaedge的lowcost为0表示结点在U中

3、图用邻接表存储时,要注意在每一次将节点加入U过程后对closedge中lowcost的更新。要设置一个标志,表示在当前过程该节点的lowcost是否已经被更新过,如果已经被更新过,则不再被更新。

图中弧的信息可以采用邻接表存储也可以采用二维数组数组存储,由于此矩阵是对称的,因此我们可以用上三角矩阵或下三角矩阵来存储图中弧的信息。此算法实现时,图中弧的信息用数组存储比用邻接表存储稍微简单一点,因为在修改closedge中元素的代价时我们可以直接在数组中查找而不用使用指针,但是用邻接表存储时查找效率会比数组高。

以下分别用数组和邻接表存储图中弧的信息时的代码,第一个为用邻接表存储,第二个为用数组存储。

#include <iostream>
#define ERROR 1;
typedef char VertexType;
typedef int InfoType;
typedef int VRType;
using namespace std;

typedef struct ArcNode{
	int adjvex;    //图中的弧所依附的顶点的编号
	InfoType weight;   //弧上所带的权值
	struct ArcNode *nextarc;  //指向下一条弧的指针
}ArcNode;

typedef struct VNode{
	VertexType data;  //弧中结点的值
	ArcNode *firstarc; 
  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值