第三章 图论与搜索三
最小生成树
最小生成树:由n个节点,和n-1条边构成的无向连通图被称为G的一颗生成树,在G的所有生成树中,边的权值之和最小的生成树,被称为G的最小生成树。(换句话说就是用最小的代价把n个点都连起来)
有两种常用算法:
- Prim算法(普利姆)朴素版Prim(时间复杂度O(n2),适用于稠密图)堆优化版Prim(时间复杂度O(mlogn),适用于稀疏图)
- Kruskal算法(克鲁斯卡尔)适用于稀疏图,时间复杂度O(mlogm)对于最小生成树问题,如果是稠密图,通常选用朴素版Prim算法,因为其思路比较简洁,代码比较短,如果是稀疏图,通常选用Kruskal算法,因为其思路比Prim简单清晰。堆优化版的Prim通常不怎么用。
朴素Prim
算法流程
-
初始化距离, 将所有点的距离初始化为INF
(这里的距离指的是点到集合的距离,而Dijkstra的距离是到起点的距离)
-
n次循环
-
找到不在集合s中, 且距离最近的点t
-
用t来更新其他点到的距离
集合s
-
将t加入到集合s中
-
代码模板
Kruskal
算法流程
- 先将所有边,按照权重,从小到大排序
- 从小到大枚举每条边(a,b,w),若a,b不连通,则将这条边,加入集合中(将a点和b点连接起来)
代码模板
二分图
二分图
指的是,可以将一个图中的所有点,分成左右两部分,使得图中的所有边,都是从左边集合中的点,连到右边集合中的点。而左右两个集合内部都没有边。
有两种常用的相关算法
- 染色法
- 匈牙利算法
其中染色法是通过深度优先遍历实现,时间复杂度是O(n×m);匈牙利算法的时间复杂度理论上是O(n×m),但实际运行时间一般远小于O(n×m)。
图论中的一个重要性质:一个图是二分图,当且仅当图中不含奇数环奇数环,指的是这个环中边的个数是奇数。(环中边的个数和点的个数是相同的)
染色法
可以用染色法来判断一个图是否是二分图,使用深度优先遍历,从根节点开始把图中的每个节点都染色,保证每个节点与相邻节点的颜色不同(但是只有黑白两种),只要染色过程中没有出现矛盾,说明该图是一个二分图,否则,说明不是二分图。
匈牙利算法
解决的问题
匈牙利算法,是给定一个二分图,用来求二分图的最大匹配的。
二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。
二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。
代码模板
__EOF__

本文作者:Chenjq
本文链接:https://www.cnblogs.com/chenjq12/p/17115027.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/chenjq12/p/17115027.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】