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