最小生成树:普里姆算法.c++

来源:互联网 发布:淘宝双11打折 编辑:程序博客网 时间:2024/06/05 06:57

普里姆算法

简易步骤:
这里写图片描述

辅助数组closedge记录从U到V-U具有最小权值的边,其中lowcost储存最小边上的权值,adjvex储存最小边在U中的那个顶点

数组的定义:

struct{  VerTexType adjvex;  ArcType lowcost;  }closedge[MVNum];

普里姆算法

步骤:
1.将初始顶点u加入U中,对其余的每一个顶点vj,将closedge[j]均初始化为到u的边信息
2.循环n-1次:
从各组边closedge中选出最小边closedge[k],输出此边
将k加入到U中
更新剩余的每组最小边信息closedge[j],对于V-U中的边,新增加了一条从k到j的边,如果新边的权值比closedge[j].lowcost小,则将closedge[j].lowcost更新为新边的权值

算法描述:

void MiniSpanTree_Prim(AMGraph G,VerTexType u){  //无向网G以邻接矩阵形式储存,从顶点u出发构造G的最小生成树T,输出T的各条边  k=LocateVex(G,u);//k为顶点u的下标  for(j=0;j<G.vexnum;++j)//对V-U的每一个顶点vj,初始化closedge[j]    if(j!=k) closedge[j]={u,G.arcs[k][j]};  clsoedge[k].lowcost=0;//初始,U={u}  for(i=1;i<G.vexnum;++i){    //选择其余n-1个顶点,生成n-1条边    k=Min(closedge);    u0=closedge[k].adjvex;//u0为最小边的一个顶点,u0属于U    v0=G.vexs[k];//v0为最小边的另一个顶点,v0属于V-U    cout<<u0<<v0;    closedge[k].lowcost=0;    for(j=0;j<G.vexnum;++j)      if(G.arcs[k][j]<closedge[j].lowcost)//新顶点并入U后重新选择最小边        closedge[j]={G.vexs[k],G.arcs[k][j]};    } }

算法时间复杂度为O(n的平方)

原创粉丝点击