最小生成树之Prim算法

如果连通图是一个带权图,则其生成树中的边也带权,生成树中所有边的权值之和称为生成树的代价。

1、最小生成树:带权连通图中代价最小的的生成树。

2、Prim算法:

算法思想:⑴  若从顶点v0出发构造,U={v0},TE={};
⑵ 先找权值最小的边(u,v),其中u∈U且v∈V-U,并且子图不构成环,则U= U∪{v},TE=TE∪{(u,v)} ;
⑶ 重复⑵ ,直到U=V为止。则TE中必有n-1条边, T=(U,TE)就是最小生成树。

算法实现说明:

使用邻接矩阵表示图,设置一个一维数组用来保存V-U的点到U的点具有权值最小的边,定义如下:

struct 
{   int  adjvex ;     /*   边所依附于U中的顶点   */
int  lowcost ;    /*   该边的权值   */
}closedge[MAX_EDGE] ;

所构造的最小生成树用一维数组存储其n-1条边,每条边的存储结构如下:

typedef struct MSTEdge
{  int  vex1, vex2 ;    /*  边所依附的图中两个顶点 */
WeightType  weight ;     /*  边的权值  */
}MSTEdge ;

实现:算法中只是二重循环,故时间复杂度是n^2

#define INFINITY  MAX_VAL     /* 最大值 */ 
MSTEdge *Prim_MST(AdjGraph *G , int u)              /*   从第u个顶点开始构造图G的最小生成树   */
{  
	MSTEdge TE[] ;  //  存放最小生成树n-1条边的数组指针
	int j , k , v , min ;
	for (j=0; j<G->vexnum; j++)
	{  closedge[j].adjvex=u  ; 
	closedge[j].lowcost=G->adj[j][u]  ;
	}    /*   初始化数组closedge[n]  */ 
	closedge[u].lowcost=0 ;      /*   初始时置U={u}  */ 
	TE=(MSTEdge *)malloc((G->vexnum-1)*sizeof(MSTEdge)) ;
	for (j=0; j<G->vexnum-1; j++)
	{
	 min= INFINITY ;
	for (v=0; v<G->vexnum; v++) 
    		if  (closedge[v].lowcost!=0&& closedge[v].lowcost<min)
		{  min=closedge[v].lowcost ; k=v ;  }
	TE[j].vex1=closedge[k].adjvex ; 
	TE[j].vex2=k ;
	TE[j].weight=closedge[k].lowcost ;
	closedge[k].lowcost=0 ;      /*   将顶点k并入U中  */
	for (v=0; v<G->vexnum; v++)
    	if (G->adj[v][k]<closedge[v]. lowcost)
       {  closedge[v].lowcost= G->adj[v][k] ;
           closedge[v].adjvex=k ; 
       }  /*   修改数组closedge[n]的各个元素的值   */
	}
return(TE) ;
}   /*   求最小生成树的Prime算法   */ 



读者可自行编写测试代码,或者用前边我们实现过的邻接矩阵图结构来测试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值