基本思想:
设G=(V,E)是具有n个顶点的连通网,
T=(U,TE)是G的最小生成树,
T的初始状态为U={u0}(u0属于V),TE={},
重复执行下述操作:
在所有u属于U,v属于V-U的边中找一条代价最小的边(u,v)并入集合TE,同时v并入U,直至U=V;
1.
2.
3.
4.
5.
6.
代码实现:
数组lowcost[n]:用来保存集合V-U中各顶点与集合U中顶点最短边的权值,lowcost[v]=0来表示顶点v已经加入最小生成树中;
数组adjvex[n]:用来保存该边所依附的(集合V-U中各顶点与集合U中顶点最短边)集合U中的顶点。
lowcost[i]=w
表示顶点vi和顶点vk之间的权值为w,其中vi属于V-U且vk属于U
adjvex[i]=k
伪代码实现
1.初始化两个辅助数组lowcost(=arc[0][i])和adjvex(=0)(0是起始点)
2.输出顶点u0,将顶点u0加入集合U中;
3.重复执行下列操作n-1次
3.1在lowcost中选取最短边lowcost[k],取对应的顶点序号k;
3.2输出顶点k和对应的权值;
3.3将顶点k加入集合U中(lowcost[k]=0)
3.4调整数组lowcost和adjvex;
void prime(MGraph G)//上篇博客写了图的实现
{
fort(int i=1;i<G.vertexNum;++i)
{
lowcost[i]=G.arc[0][j];adjvex[i]=0;
}
lowcost[0]=0;
for(int i=1;i<G.vertexNum;++i)
{
k=MinEdge(lowcost,G.vertexNum)
cout<<k<<adjvex[k]<<lowcost[k];
lowcost[k]=0;
for(int j=1,j<G.vertexNum;++j)
if(G.arc[k][j]<lowcost[j]){
lowcost[j]=G.arc[k][j];
arcvex[j]=k;
}
}
}