图论更新
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
|
||||
从深搜广搜 到并查集,从最小生成树到拓扑排序, 最后是最短路算法系列。
|
||||
|
||||
至此算上本篇,一共32篇文章,图论之旅就在此收官了。
|
||||
至此算上本篇,一共30篇文章,图论之旅就在此收官了。
|
||||
|
||||
在[0098.所有可达路径](./0098.所有可达路径.md) ,我们接触了两种图的存储方式,邻接表和邻接矩阵,掌握两种图的存储方式很重要。
|
||||
|
||||
@@ -67,20 +67,79 @@
|
||||
|
||||
其实理论基础篇就算是给大家出了一道裸的并查集题目了,所以在后面的题目安排中,会稍稍的拔高一些,重点在于并查集的应用上。
|
||||
|
||||
例如 并查集可以判断这个图是否是树,因为树的话,只有一个根,符合并查集判断集合的逻辑,题目:[0108.冗余连接](./0108.冗余连接.md)。
|
||||
|
||||
|
||||
[0108.冗余连接](./0108.冗余连接.md), [0109.冗余连接II](./0109.冗余连接II.md)
|
||||
|
||||
后面的两道题目,[0108.冗余连接](./0108.冗余连接.md) 和
|
||||
|
||||
在[0109.冗余连接II](./0109.冗余连接II.md) 中 对有向树的判断难度更大一些,需要考虑的情况比较多。
|
||||
|
||||
|
||||
## 最小生成树
|
||||
|
||||
最小生成树是所有节点的最小连通子图, 即:以最小的成本(边的权值)将图中所有节点链接到一起。
|
||||
|
||||
最小生成树算法,有prim 和 kruskal。
|
||||
|
||||
**prim 算法是维护节点的集合,而 Kruskal 是维护边的集合**。
|
||||
|
||||
在 稀疏图中,用Kruskal更优。 在稠密图中,用prim算法更优。
|
||||
|
||||
> 边数量较少为稀疏图,接近或等于完全图(所有节点皆相连)为稠密图
|
||||
|
||||
Prim 算法 时间复杂度为 O(n^2),其中 n 为节点数量,它的运行效率和图中边树无关,适用稠密图。
|
||||
|
||||
Kruskal算法 时间复杂度 为 O(nlogn),其中n 为边的数量,适用稀疏图。
|
||||
|
||||
关于 prim算法,我自创了三部曲,来帮助大家理解:
|
||||
|
||||
1. 第一步,选距离生成树最近节点
|
||||
2. 第二步,最近节点加入生成树
|
||||
3. 第三步,更新非生成树节点到生成树的距离(即更新minDist数组)
|
||||
|
||||
大家只要理解这三部曲, prim算法 至少是可以写出一个框架出来,然后在慢慢补充细节,这样不至于 自己在写prim的时候 两眼一抹黑 完全凭感觉去写。
|
||||
|
||||
**minDist数组 是prim算法的灵魂,它帮助 prim算法完成最重要的一步,就是如何找到 距离最小生成树最近的点**。
|
||||
|
||||
kruscal的主要思路:
|
||||
|
||||
* 边的权值排序,因为要优先选最小的边加入到生成树里
|
||||
* 遍历排序后的边
|
||||
* 如果边首尾的两个节点在同一个集合,说明如果连上这条边图中会出现环
|
||||
* 如果边首尾的两个节点不在同一个集合,加入到最小生成树,并把两个节点加入同一个集合
|
||||
|
||||
而判断节点是否在一个集合 以及将两个节点放入同一个集合,正是并查集的擅长所在。
|
||||
|
||||
所以 Kruskal 是需要用到并查集的。
|
||||
|
||||
这也是我在代码随想录图论编排上 为什么要先 讲解 并查集 在讲解 最小生成树。
|
||||
|
||||
|
||||
## 拓扑排序
|
||||
|
||||
拓扑排序 是在图上的一种排序。
|
||||
|
||||
概括来说,**给出一个 有向图,把这个有向图转成线性的排序 就叫拓扑排序**。
|
||||
|
||||
同样,拓扑排序也可以检测这个有向图 是否有环,即存在循环依赖的情况。
|
||||
|
||||
拓扑排序的一些应用场景,例如:大学排课,文件下载依赖 等等。
|
||||
|
||||
只要记住如下两步拓扑排序的过程,代码就容易写了:
|
||||
|
||||
1. 找到入度为0 的节点,加入结果集
|
||||
2. 将该节点从图中移除
|
||||
|
||||
## 最短路算法
|
||||
|
||||
最短路算法是图论中,比较复杂的算法,而且不同的最短路算法都有不同的应用场景。
|
||||
|
||||
我在 [最短路算法总结篇](./最短路问题总结篇.md) 里已经做了一个高度的概括。
|
||||
|
||||
大家要时常温故而知新,才能透彻理解各个最短路算法。
|
||||
|
||||
|
||||
算法4,只讲解了 Dijkstra,SPFA (Bellman-Ford算法基于队列) 和 拓扑排序,
|
||||
## 总结
|
||||
|
||||
到最后,图论终于剧终了,相信这是市面上大家能看到最全最细致的图论讲解教程。
|
||||
|
||||
图论也是我 《代码随想录》所有章节里 所费精力最大的一个章节。
|
||||
|
||||
只为了不负录友们的期待。 大家加油💪🏻
|
||||
|
||||
Reference in New Issue
Block a user