最小生成树(Kruskal算法和Prim算法)
关于图的几个概念定义:
- 连通图:在无向图中,若任意两个顶点vi与vj都有路径相通,则称该无向图为连通图。
- 强连通图:在有向图中,若任意两个顶点都有路径相通,则称该有向图为强连通图。
- 连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。
- 生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边。一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则必定成环。
- 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树。
(一)Kruskal算法
1.介绍
此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。
- 初始化并查集。father[x]=x,
- tot=0
- 将所有边用快排从小到大排序。
- 计数器 k=0;
- for (i=1; i<=M; i++) //循环所有已从小到大排序的边
- if 这是一条u,v不属于同一集合的边(u,v)(因为已经排序,所以必为最小),
- ①合并u,v所在的集合,相当于把边(u,v)加入最小生成树。
- ②tot=tot+W(u,v)
- ③k++
- ④如果k=n-1,说明最小生成树已经生成,则break;
- if 这是一条u,v不属于同一集合的边(u,v)(因为已经排序,所以必为最小),
- 结束,tot即为最小生成树的总权值之和。
2.算法分析
假若以“堆”结构来存放边进行堆排序,对于包含 e 条边的网,上述算法排序的时间复杂度为 O(e㏒2e)。只要采取合适的数据结构,算法的时间复杂度为 O(e㏒2e)。与普里姆算法相比,该算法更适合于求稀疏图的最小生成树。
(二)Prim算法
1.算法介绍
此算法可以称为“加点法”,每次迭代选择代价最小的边对应的点,加入到最小生成树中。算法从某一个顶点s开始,逐渐长大覆盖整个连通网的所有顶点。
- 初始化:min[v]= ∞(v≠1); min[1]=0;MST=0;
- for (i = 1; i<= n; i++)
- (1)寻找min[u]最小的蓝点u。
- (2)将u标记为白点
- (3)MST+=min[u]
- (4)for 与白点u相连的所有蓝点v
- if (w[u][v]<min[v])
- min[v]=w[u][v];
- 算法结束: MST即为最小生成树的权值之和
2.算法分析
该算法时间复杂度为 O(n2),与图结构的边数无关,适合稠密图。(n是点的数量)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了