C++普里姆算法(最小生成树)代码实现

#include
#include
#define w 3
//定义边 
typedef struct lkp
{
    int begin,end; //边的两个顶点 
    int weight;    //边的权值 
}edge;

//定义邻接矩阵
typedef struct ok
{
    int dian[w]; //定义顶点集
    int m,n;     //定义顶点总数和边的总数
    int ju[w][w];//矩阵 
}mar;

//开始普利姆算法
void prim(mar lin,edge tree[])
{
    //tree[] 代表 储存已存入最小数的边集

    edge min;
    min.weight = 999; //设定一个边 , 令这条边的权值最大,但这条边的两个顶点不知道
    
    int num;          //储存进树的顶点总数
    
    int vax[w]={0};       //判断顶点是否存储进二叉树     0为未储存 1为储存
    
    num=0;
    vax[0] = 1;         //这两步是以0作为起点开始建树
    
    int i , j;
    while(num < w)
    {
        for(i = 0 ; i < w ; i++)
        {
            if(vax[i] == 1) //从已存入树的节点开始寻找下一个权值最小的顶点
            {
                for(j = 0 ; j < w ; j++)
                {
                    if(vax[j] != 1 && min.weight > lin.ju[i][j])
                    {
                        min.begin=i; 
                        min.end=j;    
                        min.weight = lin.ju[i][j]; 
                    }    
                }    
            }    
        }    
        tree[num++] = min;//记录这条边已加入树 
        vax[j] = 1;//记录这个顶点已加入树 
    } 

 

主要步骤:

1.定义好边和矩阵

2. 传入矩阵和一个代表已存入树的边集数组

3.定义一个最小边,(两个顶点不明确),设定它的权值最大

4.定义一个数组,用来表名该顶点是否存入树

5.定义一个变量,表明有多少顶点存入树

6.从0开始建树 

7.从已存入树的顶点开始,寻找下一个权值最小的点

8.把这个点的属性(左右顶点和权值)传给最小边

9.记录最小边已存入树,记录该顶点已存入树.

你可能感兴趣的:(c++基础与数据结构,算法,c++,开发语言)