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  

 

posted @ 2017-03-13 15:37  夜梦多离殇  阅读(268)  评论(0编辑  收藏  举报