1- # 1 并查集、图相关算法
21
3- ## 1.1 并查集
4-
5- ### 1.1.1 并查集基本结构和操作
2+ - [ 1 并查集、图相关算法] ( #1 )
3+ * [ 1.1 并查集] ( #11 )
4+ + [ 1.1.1 并查集基本结构和操作] ( #111 )
5+ + [ 1.1.2 例题] ( #112 )
6+ * [ 1.2 图相关算法] ( #12 )
7+ + [ 1.2.1 图的概念] ( #121 )
8+ + [ 1.2.2 图的表示方法] ( #122 )
9+ - [ 1.2.2.1 邻接表表示法] ( #1221 )
10+ - [ 1.2.2.2 邻接矩阵表示法] ( #1222 )
11+ + [ 1.2.3 图的遍历] ( #123 )
12+ - [ 1.2.3.1 宽度优先遍历] ( #1231 )
13+ - [ 1.2.3.2 深度优先遍历] ( #1232 )
14+ + [ 1.2.4 图的拓扑排序] ( #124 )
15+ + [ 1.2.5 图的最小生成树算法] ( #125 )
16+ - [ 1.2.5.1 Kruskal(克鲁斯卡尔)算法] ( #1251 )
17+ - [ 1.2.5.2 Prim算法] ( #1252 )
18+ + [ 1.2.6 图的最短路径算法] ( #126 )
19+ - [ 1.2.6.1 Dijkstra(迪杰特斯拉)算法] ( #1261 )
20+ - [ 1.2.6.2 floyd算法] ( #1262 )
21+
22+ <h1 id =' 1 ' >1 并查集、图相关算法</h1 >
23+
24+ <h2 id =' 11 ' >1.1 并查集</h2 >
25+
26+ <h3 id =' 111 ' >1.1.1 并查集基本结构和操作</h3 >
627
7281、有若干个样本a、b、c、d...类型假设是V
829
@@ -129,7 +150,7 @@ public class Code01_UnionFind {
129150```
130151==并查集用来处理连通性的问题特别方便==
131152
132- ### 1.1.2 例题
153+ < h3 id = ' 112 ' > 1.1.2 例题</ h3 >
133154
134155学生实例有三个属性,身份证信息,B站ID,Github的Id。我们认为,任何两个学生实例,只要身份证一样,或者B站ID一样,或者Github的Id一样,我们都算一个人。给定一打拼学生实例,输出有实质有几个人?
135156
@@ -257,16 +278,17 @@ public class Code07_MergeUsers {
257278}
258279```
259280
260- ## 1.2 图相关算法
261- ### 1.2.1 图的概念
281+ <h2 id =' 12 ' >1.2 图相关算法</h2 >
282+
283+ <h3 id =' 121 ' >1.2.1 图的概念</h3 >
262284
2632851、由点的集合和边的集合构成
264286
2652872、虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达,无向图可以理解为两个联通点互相指向
266288
2672893、边上可能带有权值
268290
269- ### 1.2.2 图的表示方法
291+ < h3 id = ' 122 ' > 1.2.2 图的表示方法</ h3 >
270292
271293对于下面一张无向图,可以改为有向图:
272294
@@ -282,7 +304,7 @@ D-->A
282304A-->D
283305```
284306
285- #### 1.2.2.1 邻接表表示法
307+ < h4 id = ' 1221 ' > 1.2.2.1 邻接表表示法</ h4 >
286308
287309记录某个节点,直接到达的邻居节点:
288310
@@ -296,8 +318,7 @@ D: B,A
296318
297319如果是带有权重的边,可以封装我们的结构,例如A到C的权重是3,那么我们可以表示为A: C(3),D
298320
299-
300- #### 1.2.2.2 邻接矩阵表示法
321+ <h4 id =' 1222 ' >1.2.2.2 邻接矩阵表示法</h4 >
301322
302323我们把不存在路径的用正无穷表示,这里用'-'表示,例如A到C的边权重是3,可把上图表示为:
303324
@@ -442,7 +463,7 @@ public class GraphGenerator {
442463}
443464```
444465
445- ### 1.2.3 图的遍历
466+ < h3 id = ' 123 ' > 1.2.3 图的遍历</ h3 >
446467
447468例如该图:
448469
@@ -459,7 +480,7 @@ C-->D
459480C-->E
460481```
461482
462- #### 1.2.3.1 宽度优先遍历
483+ < h4 id = ' 1231 ' > 1.2.3.1 宽度优先遍历</ h4 >
463484
4644851、利用队列实现
465486
@@ -519,7 +540,7 @@ public class Code02_BFS {
519540}
520541```
521542
522- #### 1.2.3.2 深度优先遍历
543+ < h4 id = ' 1232 ' > 1.2.3.2 深度优先遍历</ h4 >
523544
5245451、利用栈实现
525546
@@ -584,7 +605,7 @@ public class Code02_DFS {
584605}
585606```
586607
587- ### 1.2.4 图的拓扑排序
608+ < h3 id = ' 124 ' > 1.2.4 图的拓扑排序</ h3 >
588609
5896101、在图中找到所有入度为0的点输出
590611
@@ -666,11 +687,11 @@ public class Code03_TopologySort {
666687}
667688```
668689
669- ### 1.2.5 图的最小生成树算法
690+ < h3 id = ' 125 ' > 1.2.5 图的最小生成树算法</ h3 >
670691
671692> 最小生成树解释,就是在不破坏原有图点与点的连通性基础上,让连通的边的整体权值最小。返回最小权值或者边的集合
672693
673- #### 1.2.5.1 Kruskal(克鲁斯卡尔)算法
694+ < h4 id = ' 1251 ' > 1.2.5.1 Kruskal(克鲁斯卡尔)算法</ h4 >
674695
675696> 连通性借助并查集实现
676697
@@ -800,7 +821,7 @@ public class Code04_Kruskal {
800821```
801822> K算法求无向图的最小生成树,求权值是没问题的,如果纠结最小生成树的连通结构,实质是少了一侧,即A指向B, B指向A只会保留其一。可以手动补齐
802823
803- #### 1.2.5.2 Prim算法
824+ < h4 id = ' 1252 ' > 1.2.5.2 Prim算法</ h4 >
804825
805826> P算法无需并查集结构,普通set即可满足
806827
@@ -925,9 +946,9 @@ public class Code05_Prim {
925946}
926947```
927948
928- ### 1.2.6 图的最短路径算法
949+ < h3 id = ' 126 ' > 1.2.6 图的最短路径算法</ h3 >
929950
930- #### 1.2.6.1 Dijkstra(迪杰特斯拉)算法
951+ < h4 id = ' 1261 ' > 1.2.6.1 Dijkstra(迪杰特斯拉)算法</ h4 >
931952
932953> Dijkstra算法必须要求边的权值不为负,且必须指定出发点。则可以求出发点到所有节点的最短距离是多少。如果到达不了,为正无穷
933954
@@ -1159,7 +1180,6 @@ public class Code06_Dijkstra {
11591180
11601181}
11611182```
1162-
1163- #### 1.2.6.2 floyd算法
1183+ <h4 id =' 1262 ' >1.2.6.2 floyd算法</h4 >
11641184
11651185> 图节点的最短路径,处理权值可能为负的情况。三层for循环,比较简单
0 commit comments