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

89 阅读1分钟

#include <stdio.h>
#include <malloc.h>
#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.记录最小边已存入树,记录该顶点已存入树.