问题及代码:
prim算法为:
#include <stdio.h>
#include <malloc.h>
#include "graph.h"
void Prim(MGraph g,int v)
{
int lowcost[MAXV]; //顶点i是否在U中
int min;
int closest[MAXV],i,j,k;
for (i=0; i<g.n; i++) //给lowcost[]和closest[]置初值
{
lowcost[i]=g.edges[v][i];
closest[i]=v;
}
for (i=1; i<g.n; i++) //找出n-1个顶点
{
min=INF;
for (j=0; j<g.n; j++) //在(V-U)中找出离U最近的顶点k
if (lowcost[j]!=0 && lowcost[j]<min)
{
min=lowcost[j];
k=j; //k记录最近顶点的编号
}
printf(" 边(%d,%d)权为:%d\n",closest[k],k,min);
lowcost[k]=0; //标记k已经加入U
for (j=0; j<g.n; j++) //修改数组lowcost和closest
if (g.edges[k][j]!=0 && g.edges[k][j]<lowcost[j])
{
lowcost[j]=g.edges[k][j];
closest[j]=k;
}
}
}
int main()
{
MGraph g;
int A[6][6]=
{
{0,6,1,5,INF,INF},
{6,0,5,INF,3,INF},
{1,5,0,5,6,4},
{5,INF,5,0,INF,2},
{INF,3,6,INF,0,6},
{INF,INF,4,2,6,0}
};
ArrayToMat(A[0], 6, g);
printf("最小生成树构成:\n");
Prim(g,0);
return 0;
}
运行结果:
原图结构为:
知识点总结:
在prim算法中用lowcost记录从v到u-v边的最小权值,用closest纪录最小权值对应的顶点可以有效的记录最小生成树的所有数据,这里所说的最小生成树简单的理解可以为用最小的权值连同图上的各顶点,可以解决工程造价的最优解等实际问题。
心得体会:
数据结构中各种算法和思想的学习最后还是会落实到实际应用中,比如prim算法就是相对比较容易理解的求最小生成树的算法。
本文详细介绍了Prim算法用于求解最小生成树的过程,包括核心数据结构的应用、算法步骤和实际应用案例,有助于理解最小生成树的概念及其在工程领域的应用。

42万+

被折叠的 条评论
为什么被折叠?



