Prim算法、Kruskal算法构造最小生成树(C语言)
问题
给定一个边权重的连通图,以点1为起点,构建一个能将图中所有定点连接起来,且边权重和最小的图。
解析
prim算法
prim算法的核心是从起始点开始,每次选择到已有点路径距离最短的点连接,但不能成环。实现示意图如下:(图中右下角1应当为6)
这样一个图我们选取点1为起始点:
step 1:
step2:
step3:
step4:
step5:
kruskal算法
与prim算法的目的相同,但kruskal算法选择边,即每次选择图中权重最小的边,值得注意的是,所选的边在图中不能构成环。解析图示如下所示:
step1:
step2:
step3:
step4:
step5:
设计
prim
设计两个辅助数组(lowCost[ ],source[ ])
- lowCost:用于存储当前已经生成的点图到其他点的距离,可以连通则为具体数值,无法连通则为无穷(此处假设所有权重都小于设置的最大值)
- source:用于记录当前lowCost值是由哪个点决定的,更新lowCost数组,source数组的值也要更新。
核心代码:
void Prim(Graph graph){
int lowCast[graph->nv];
int source[graph->nv];
lowCast[0] = 0;
source[0] = 1;
int k = 0;
for (