From b54cd79a06d5f346f02da3b76b7e4b5c157fcd7d Mon Sep 17 00:00:00 2001
From: kn5886348135 <56352848+kn5886348135@users.noreply.github.com>
Date: Mon, 19 Dec 2022 16:02:04 +0800
Subject: [PATCH] =?UTF-8?q?=E5=9B=BE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
algorithm/11、图.md | 46 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 45 insertions(+), 1 deletion(-)
diff --git a/algorithm/11、图.md b/algorithm/11、图.md
index 3aefd7b..f97d52e 100644
--- a/algorithm/11、图.md
+++ b/algorithm/11、图.md
@@ -56,6 +56,7 @@ public class Edge {
}
```
+
### 宽度优先遍历
* 利用队列实现
@@ -69,7 +70,50 @@ public class Edge {
* 从源节点开始把节点按照深度放入栈,然后弹出
* 每弹出一个点,把该节点下一个没有进过栈的邻接点放入栈
* 直到栈变空
+
### 拓扑排序
- 拓扑排序是不唯一的
+ 拓扑排序要求有向无环图,拓扑排序结果不唯一,可以用宽度优先遍历和深度优先遍历实现。应用场景有事件安排、编译顺序等
+
+* 在图中找到所有入度为0的点输出
+* 把所有入度为0的点在图中删掉,继续找入度为0的点输出,周而复始
+* 图的所有点都被删除后,依次输出的顺序就是拓扑排序
+
+
+### 最小生成树(无向图)
+
+ 最小生成树要求无向图,可以使用Kruskal和Prim算法实现,Kruskal和Prim都是贪心算法。
+
+#### Kruskal算法使用并查集
+
+* 总是从权值最小的边开始考虑,依次考察权值依次变大的边
+* 当前的边要么进入最小生成树的集合,要么丢弃
+* 如果当前的边进入最小生成树的集合中不会形成环,就要当前边
+* 如果当前的边进入最小生成树的集合中会形成环,就不要当前边
+* 考察完所有边之后,最小生成树的集合也得到了
+
+#### Prim算法
+
+* 1)可以从任意节点出发来寻找最小生成树
+* 2)某个点加入到被选取的点中后,解锁这个点出发的所有新的边
+* 3)在所有解锁的边中选最小的边,然后看看这个边会不会形成环
+* 4)如果会,不要当前边,继续考察剩下解锁的边中最小的边,重复3)
+* 5)如果不会,要当前边,将该边的指向点加入到被选取的点中,重复2)
+* 6)当所有点都被选取,最小生成树就得到了
+
+### 最短路径算法
+
+ 可以使用Dijkstra算法实现最短路径。
+
+#### 迪瑞克斯拉算法(有向、无负权重、可以有环)
+
+1)Dijkstra算法必须指定一个源点
+2)生成一个源点到各个点的最小距离表,一开始只有一条记录,即原点到自己的最小距离为0,源点到其他所有点的最小距离都为正无穷大
+3)从距离表中拿出没拿过记录里的最小记录,通过这个点发出的边,更新源点到各个点的最小距离表,不断重复这一步
+4)源点到所有的点记录如果都被拿过一遍,过程停止,最小距离表得到了
+
+#### Dijkstral算法优化
+
+ 利用加强堆
+ 某个节点最短距离改变时做动态调整