算法设计与分析1(用prim算法和kruskal构造最小生成树)

本文介绍Prim与Kruskal两种算法构造最小生成树的过程与原理。通过详细解析这两种算法如何找到连通图中权值最小的结构,并提供设计思路与时间复杂度分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.问题

采用prim算法和kruskal构造最小生成树。

2.解析

最小生成树是由n个顶点和n-1条边,将一个连通图连接起来,且使权值最小的结构。使用prim算法便是每次找与之连线权值最小的顶点,将该点加入最小生成树集合中。最后不允许出现闭合回路。
例如:
在这里插入图片描述

固定开始端点不动同时加入最小生成树集合,每次找与之连线权值最小的顶点并将该点加入集合。
2.
首先将每个顶点赋予不同的标记符号,利用快排选取其中权重最小的边,将两个顶点的标记统一,再不断选取已根据权重排序好的边,若该边两个顶点属于同一个标记符号则换边,否则不断统一顶点标记,直到所有顶点标记统一。
在这里插入图片描述

3.设计

设置visited辅助数组记录顶点是否被访问。
设dis辅助数组记录权值。
将visited置为0.w[][]是无向网。
从v1开始访问,pos为端点,i为另一端点的边的权值。
将dis赋予pos点的所有边的权值。
for (i = 1; i < 顶点个数; i++)
{
min = 自己设的最大值;
for (j = 1; j <= 顶点数目; j++)
{
该点是未被访问过的点且边权值小于之前min
{
min = dis[j];
下一个pos端点转移为j
}
}
for (j = 1; j <=顶点个数; j++)
如果该点未被访问且该点所对应边的权值比以遍历的顶点的边的权值大
那么就将dis数组内的权值改为以遍历的顶点的边的权值
}

2.在这里插入图片描述

4.分析

prim算法的时间复杂度是NcodeNcode,空间复杂度为1.
Kruskal算法时间复杂度为arcnum
vernum,空间复杂度为1.

5.源码

GitHub源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值