最小生成树Prim算法

来源:互联网 发布:百度网络存在安全隐患 编辑:程序博客网 时间:2024/06/04 17:49

        MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为V,U为最小生成树的顶点的集合。建立两个数组:lowcost[i]和mst[i],前者表示以i为终点的边的最小权值;后者对应lowcost[i]的起点。若lowcost[i]=0,则表示顶点i已经加入到U中;若lowcost[i]为无穷大,则表示无通路;若mst[i]=0,则表示顶点i已经加入到U中。

第一步:首先任意选择图G中的一点作为起始点a,将该点加入集合U;

第二步:判断V中各个顶点到U中a点的lowcost[i],及对应的mst[i](均等于a),将lowcost[i]的最小值对应的边的终点i(假设i=b)加入到U中,则此时U中含有2个顶点a和b;

第三步:重新设置lowcost[i]和mst[i]的值(此时lowcost[i]等于ai边和bi边直接的最小权值,mst[i]等于对应最小权值的顶点,a或b);

第四步:以此类推,直到所有顶点全部加入到U中,此时就构建了一颗MST。

以下是图例说明:

初始状态:



我们假设V1是起始点,进行初始化(*代表无限大,即无通路):


lowcost[2]=6lowcost[3]=1lowcost[4]=5lowcost[5]=*,lowcost[6]=*

mst[2]=1mst[3]=1,mst[4]=1mst[5]=1,mst[6]=1(所有点默认起点是V1)


明显看出,以V3为终点的边的权值最小=1,所以边<mst[3],3>=1加入MST


此时,因为点V3的加入,需要更新lowcost数组和mst数组:

lowcost[2]=5lowcost[3]=0lowcost[4]=5lowcost[5]=6,lowcost[6]=4

mst[2]=3mst[3]=0,mst[4]=1mst[5]=3,mst[6]=3


明显看出,以V6为终点的边的权值最小=4,所以边<mst[6],6>=4加入MST


此时,因为点V6的加入,需要更新lowcost数组和mst数组:

lowcost[2]=5lowcost[3]=0lowcost[4]=2lowcost[5]=6lowcost[6]=0

mst[2]=3mst[3]=0,mst[4]=6mst[5]=3,mst[6]=0


明显看出,以V4为终点的边的权值最小=2,所以边<mst[4],4>=4加入MST


此时,因为点V4的加入,需要更新lowcost数组和mst数组:

lowcost[2]=5,lowcost[3]=0,lowcost[4]=0,lowcost[5]=6lowcost[6]=0

mst[2]=3,mst[3]=0,mst[4]=0mst[5]=3mst[6]=0


明显看出,以V2为终点的边的权值最小=5,所以边<mst[2],2>=5加入MST


此时,因为点V2的加入,需要更新lowcost数组和mst数组:

lowcost[2]=0,lowcost[3]=0,lowcost[4]=0,lowcost[5]=3,lowcost[6]=0

mst[2]=0,mst[3]=0,mst[4]=0mst[5]=2mst[6]=0


很明显,以V5为终点的边的权值最小=3,所以边<mst[5],5>=3加入MST

lowcost[2]=0,lowcost[3]=0lowcost[4]=0,lowcost[5]=0lowcost[6]=0

mst[2]=0,mst[3]=0mst[4]=0,mst[5]=0mst[6]=0


至此,MST构建成功,如图所示:

Prim算法结构如下:

#define INF 65535#define MAXV 100void Prim(Graph *graph,int v){int lowcost[MAXV];int mst[MAXV];int min;int i,j,k;for(i=0;i>graph->vertex_num;i++){lowcost[i]=graph->edges[v][i];mst[i]=graph->v;}for(j=0;j<graph->vertex_num;j++){min=INF;for(i=0;i<graph->vertex_num;i++){if(lowcost[i]!=0&&lowcost[i]<min){min=lowcost[i];k=i;}}lowcost[k]=0;for(j=0;j<graph->vertex_num;j++){if(graph->edges[k][j]!=0&&graph->edges[k][j]<lowcost[j]){lowcost[j]=graph->edges[k][j];mst[j]=k;}}}}

参考:http://blog.csdn.net/yeruby/article/details/38615045




0 0