Prim最小树生成算法C语言实现
自己看书中的代码没看懂,但是理解了算法的实现方法.经过边想边写,实现了如下代码,并测试通过.通过地址:http://codepad.org/QNSPlJwq
程序构造了一个和原图一样大小的邻接矩阵用以存储结果.对结果邻接矩阵进行加法计算可得出最小权值.
#include <stdio.h> #define MAX_NUM 999 #define vnum 6 int Graph[vnum][vnum]=\ {0,6,1,5,0,0,\ 6,0,5,0,3,0,\ 1,5,0,5,6,4,\ 5,0,5,0,0,2,\ 0,3,6,0,0,6,\ 0,0,4,2,6,0}; void Prim(int v){ int T[vnum][vnum]={0}; int used[vnum]={0};//记录移动到U集里的顶点情况 int i,j,k,min_cost,min_u,min_v; used[v]=1;//加入第一个顶点进入U集里 for(i=0;i<vnum;i++){ for(j=0;j<vnum;j++) printf("%d ",Graph[i][j]); printf("\n"); } printf("\n"); for(k=0;k<vnum-1;k++){ min_cost=MAX_NUM; for(j=0;j<vnum;j++){//遍历整个U集里的顶点,寻找代价最小的边 if(used[j]==1)//判断顶是否在U集里 for(i=0;i<vnum;i++)//找出顶点j的代价最小的边,找到后记录下代价值和顶点j的值 if(used[i]==0&&Graph[j][i]!=0&&Graph[j][i]<min_cost){//不为0则表示有边,并且排队掉已在U集里的顶点, min_cost=Graph[j][i];//记下最小的代价值 min_v=i;//记下代价值最小的顶终点 min_u=j;//记下代价值最小边的始点 } } used[min_v]=1;//添加入U集. T[min_u][min_v]=min_cost;//记录边 } for(i=0;i<vnum;i++){ for(j=0;j<vnum;j++) printf("%d ",T[i][j]); printf("\n"); } } int main(){ Prim(0); return 0; }
输出结果:
上面的原图的邻接矩阵,下的是新图的邻接矩阵.最后最小生成树的权值为15.
0 6 1 5 0 0 6 0 5 0 3 0 1 5 0 5 6 4 5 0 5 0 0 2 0 3 6 0 0 6 0 0 4 2 6 0 0 0 1 0 0 0 0 0 0 0 3 0 0 5 0 0 0 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 0 0