最小生成树之Prim算法

来源:互联网 发布:李杰灵的淘宝店 编辑:程序博客网 时间:2024/05/29 19:54

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

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


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

原创粉丝点击