完整源码地址:[email protected]:hglspace/MinCostSpTree.git
图例:
1 普里姆算法
/*
普里姆算法:假设N={v,{E}}是连通图,TE是N上的最小生成树中边的集合,算法从U={u0}(u0属于V),TE={}开始,重复执行下述操作:
在所有u属于U,v属于V-U的边<u0,v0>属于E中找一条代价最小的边(u0,v0)并入集合TE,直至U=V为止,此时TE中必有n-1条边,则T={V,{TE}}为N的最小生成树
*/
void MiniSpanTree_PRIM(structGraph g,structvert u){
struct tmp closedge[MAX_VEX_NUM];
int index=u.index,i,j;
int minimum(structtmp closedge[]);
for(j=0;j<g.vexnum;j++){ //初始化辅助数组,辅助数组是记录从U到V-U具有最小代价的边
if(j!=index){
closedge[j].lowcost=g.arcs[index][j].cost;
closedge[j].vex=u;
}
}
closedge[index].lowcost=0;//自己到自己的最小权值是0
for(i=1;i<g.vexnum;i++){
index=minimum(closedge);
if(index<0){
printf("此图不是连通图\n");
exit(0);
}
printf("下一个顶点是:%c,权值是:%d\n",g.vexs[index].data,closedge[index].lowcost);
closedge[index].lowcost=0;
for(j=0;j<g.vexnum;j++){ //U中有增加了新顶点,比较closedge数组中的最小权值和该顶点到V-U其他顶点的权值
if(g.arcs[index][j].cost<closedge[j].lowcost){
closedge[j].lowcost=g.arcs[index][j].cost;
closedge[j].vex=g.vexs[index];
}
}
}
}
int minimum(structtmp closedge[]){ //求closedge数组中最小权值的边,返回V-U中的顶点位置
int