一、简要概述
prime算法求解最小生成树,相较于kruskal算法,在代码实现上较为简单,是一个适合初学者去学习的算法,有助于初学者了解简单的数据结构和图的原理及构造。我在这里写的代码使用的C语言,代码尽可能详细且方便理解,每个函数都有功能介绍,希望可以帮助到有需要学习的朋友。
二、有待补充与完善
代码部分仅实现了特定图的最小生成树顶点的输出,并没有最短路径的求和(可以自己补充),此外,到具体应用层面,可能还需要对图的相关数组进行扩容与修改赋值的部分。所以,代码仅供参考。
//v[N+1]----顶点集,1--A, 2--B,...., 6--F
//edge[N+1][N+1]----边的权重集, edge[i][j]---i与j之间的权重,没有通路赋值-1
//curv[N+1]----当下的顶点集
//tree[N]----最小生成树的集合,,,curv[]的结果,终态,实际未使用
#include<stdio.h>
#define N 6
int v[N+1], edge[N+1][N+1], curv[N+1];
int in_arr(int k)//判断顶点k是否在curv[]集合中
{
int i;
for(i=0;i<N+1;i++){
if(curv[i]==k)
return 1;
}
return 0;
}
int find_v(int j)//查找距离当前顶点集最近的顶点n
{
int i, k, n;
int min_adge = 10000;
//i是没有意义的,有意义的是curv[i];
for(i=1;i<j+1;i++){
for(k=1;k<N+1;k++){
if(!in_arr(k) && edge[curv[i]][k]>0 && edge[curv[i]][k]<min_adge){
min_adge=edge[curv[i]][k];
n = k;
}
}
}
return n;
}
void prim()
{
curv[1]=1;
int i=1;
while(i<N+1){
curv[i+1] = find_v(i);//找顶点,然后加入到顶点集中
i++;
}
}
void print_tree()
{
int i;
for(i=1;i<N+1;i++){
printf("%c",curv[i]+64);
if(i!=N)
printf("-");
else
printf("\n");
}
}
int main()
{
int i,j;
//顶点集初始化
for(i=0;i<N+1;i++){
v[i]=i;
curv[i]=0;
}
//边的权重集初始化
for(i=0;i<N+1;i++){
for(j=0;j<N+1;j++)
edge[i][j]=-1;
}
//构建图
edge[1][2]=edge[2][1]=5;edge[1][3]=edge[3][1]=6;edge[1][4]=edge[4][1]=4;
edge[2][3]=edge[3][2]=1;edge[2][4]=edge[4][2]=2;
edge[3][4]=edge[4][3]=2;
edge[3][5]=edge[5][3]=5;edge[3][6]=edge[6][3]=3;
edge[4][6]=edge[6][4]=4;
edge[5][6]=edge[6][5]=4;
//调用prim函数并输出最小生成树
prim();
print_tree();
return 0;
}
图长这个样子: