Prim算法构造最小生成树
1. 问题
连通图的生成树是一个极小的连通子图,vertex=n;Edge=n-1;
最小生成树:构造最小权值的生成树。
Prim算法构造一棵只有一个根节点的树MST,通过不断加入结点使树长大。所加的顶点必须是与子树直接相连的最小权值,重复收录顶点直到vertex=n;如果收录不到n,则不存在最小生成树。
2、解析】
3、设计
int Prim(MGraph Graph,LGraph MST)
{
Int dist[1000],parent[1000],v,w;
/初始化dist,parent数组。/
for(w=0;wnv;w++){
dist[w]=从顶点0->直接相连的点的权值;
不连通则为无穷大
Parent[w]=0;
}
Dist[0]=0;
/收录v0/
Parent[0]=-1;
/V0的父节点/
MST=creat(Graph->nv);
/创建最小生成树/
While(1){
v=findMinDist(Graph,dist);
/找到下一个未收录的最小权值的点/
如果v未找到此值,则退出循环。
Edge E=()malloc();E->v1=parent[v];
E->v2=v;E->weight=dist[v];
/将边的信息填好/
Insert(MST,E)
/将边插入子树中/
//进行dist,parent数组的更新for(w=0;wnv;w++){
If(dist[0]!=0&&Graph->G[v][w]<MAXSIZE)/*
如果w与v连通并且w点未被收录*/
If(Graph->G[v][w]<dist[w]){
/*如果vw边比原本dist[w]中的值更小,更新dist[w],parent[w]
}
}
}
/如果未收录到n个点,则未生成最小生成树,
反之返回totalweight,总权值/
}
4、源码
源码地址:https://github.com/ACynj/Tree.git