prim算法主要是计算出最小代价生成树,也叫做最小生成树
什么是prim算法
举个例子,我们在图一这个图中找出一个最小权的遍历路线。
如果是使用普通的遍历方法可以达到图2的方案二,而使用prim算法可以算出方案三。
可以看出虽然 方案二和方案三的权值只相差1,但是这个例子的规模很小。如果投影到现时世界,方案三却可以为你剩下更多的成本。
prim算法使用的是邻接矩阵的方法,如果忘记邻接矩阵是如何创建的的话可以回顾一下数据结构–邻接矩阵
我们使用一个二维数组表示各个顶点之间的关系,0表示自身无权值,65535表示无穷大,在图中用∞表示。
这样我们就把三维的图关系用二维数组表示出来了。每一个数据都表示该点横坐标与纵坐标之间的权值,例如(v0,v1)的权值为10。
prim算法怎样实现
正如上文所说,首先需要创建一个邻接矩阵。
代码实现
声明四个局部变量,两个数组(1.记录父结点信息,2.记录权值以及判断一点是否遍历过)
int min,i,j,k;
int adjvex[MAXVEX];//记录父
int lowcost[MAXVEX];//记录权值&一点是否遍历过
#define INFINITY
让图上下标为0(下文用v0表示)的顶点进入树,从v0开始遍历。
lowcost[0]=0;
初始化第一排数组,以及他们的父结点都为v0
for(i=0;i<G.numVertexes;i++)
{
lowcost[i]=G.arc[0][i];
adjvexs[i]=0;
}
开始遍历lowcost[],寻找最小的权值边。
printf("%c ",G.vexs[0]);
for(i=1;i<numVertexes;i++)
{
min=INFINITY;//初始化最小值为无穷大
k=0;
for(j=1;j