1
- # 1 并查集、图相关算法
2
1
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 >
6
27
7
28
1、有若干个样本a、b、c、d...类型假设是V
8
29
@@ -129,7 +150,7 @@ public class Code01_UnionFind {
129
150
```
130
151
==并查集用来处理连通性的问题特别方便==
131
152
132
- ### 1.1.2 例题
153
+ < h3 id = ' 112 ' > 1.1.2 例题</ h3 >
133
154
134
155
学生实例有三个属性,身份证信息,B站ID,Github的Id。我们认为,任何两个学生实例,只要身份证一样,或者B站ID一样,或者Github的Id一样,我们都算一个人。给定一打拼学生实例,输出有实质有几个人?
135
156
@@ -257,16 +278,17 @@ public class Code07_MergeUsers {
257
278
}
258
279
```
259
280
260
- ## 1.2 图相关算法
261
- ### 1.2.1 图的概念
281
+ <h2 id =' 12 ' >1.2 图相关算法</h2 >
282
+
283
+ <h3 id =' 121 ' >1.2.1 图的概念</h3 >
262
284
263
285
1、由点的集合和边的集合构成
264
286
265
287
2、虽然存在有向图和无向图的概念,但实际上都可以用有向图来表达,无向图可以理解为两个联通点互相指向
266
288
267
289
3、边上可能带有权值
268
290
269
- ### 1.2.2 图的表示方法
291
+ < h3 id = ' 122 ' > 1.2.2 图的表示方法</ h3 >
270
292
271
293
对于下面一张无向图,可以改为有向图:
272
294
@@ -282,7 +304,7 @@ D-->A
282
304
A-->D
283
305
```
284
306
285
- #### 1.2.2.1 邻接表表示法
307
+ < h4 id = ' 1221 ' > 1.2.2.1 邻接表表示法</ h4 >
286
308
287
309
记录某个节点,直接到达的邻居节点:
288
310
@@ -296,8 +318,7 @@ D: B,A
296
318
297
319
如果是带有权重的边,可以封装我们的结构,例如A到C的权重是3,那么我们可以表示为A: C(3),D
298
320
299
-
300
- #### 1.2.2.2 邻接矩阵表示法
321
+ <h4 id =' 1222 ' >1.2.2.2 邻接矩阵表示法</h4 >
301
322
302
323
我们把不存在路径的用正无穷表示,这里用'-'表示,例如A到C的边权重是3,可把上图表示为:
303
324
@@ -442,7 +463,7 @@ public class GraphGenerator {
442
463
}
443
464
```
444
465
445
- ### 1.2.3 图的遍历
466
+ < h3 id = ' 123 ' > 1.2.3 图的遍历</ h3 >
446
467
447
468
例如该图:
448
469
@@ -459,7 +480,7 @@ C-->D
459
480
C-->E
460
481
```
461
482
462
- #### 1.2.3.1 宽度优先遍历
483
+ < h4 id = ' 1231 ' > 1.2.3.1 宽度优先遍历</ h4 >
463
484
464
485
1、利用队列实现
465
486
@@ -519,7 +540,7 @@ public class Code02_BFS {
519
540
}
520
541
```
521
542
522
- #### 1.2.3.2 深度优先遍历
543
+ < h4 id = ' 1232 ' > 1.2.3.2 深度优先遍历</ h4 >
523
544
524
545
1、利用栈实现
525
546
@@ -584,7 +605,7 @@ public class Code02_DFS {
584
605
}
585
606
```
586
607
587
- ### 1.2.4 图的拓扑排序
608
+ < h3 id = ' 124 ' > 1.2.4 图的拓扑排序</ h3 >
588
609
589
610
1、在图中找到所有入度为0的点输出
590
611
@@ -666,11 +687,11 @@ public class Code03_TopologySort {
666
687
}
667
688
```
668
689
669
- ### 1.2.5 图的最小生成树算法
690
+ < h3 id = ' 125 ' > 1.2.5 图的最小生成树算法</ h3 >
670
691
671
692
> 最小生成树解释,就是在不破坏原有图点与点的连通性基础上,让连通的边的整体权值最小。返回最小权值或者边的集合
672
693
673
- #### 1.2.5.1 Kruskal(克鲁斯卡尔)算法
694
+ < h4 id = ' 1251 ' > 1.2.5.1 Kruskal(克鲁斯卡尔)算法</ h4 >
674
695
675
696
> 连通性借助并查集实现
676
697
@@ -800,7 +821,7 @@ public class Code04_Kruskal {
800
821
```
801
822
> K算法求无向图的最小生成树,求权值是没问题的,如果纠结最小生成树的连通结构,实质是少了一侧,即A指向B, B指向A只会保留其一。可以手动补齐
802
823
803
- #### 1.2.5.2 Prim算法
824
+ < h4 id = ' 1252 ' > 1.2.5.2 Prim算法</ h4 >
804
825
805
826
> P算法无需并查集结构,普通set即可满足
806
827
@@ -925,9 +946,9 @@ public class Code05_Prim {
925
946
}
926
947
```
927
948
928
- ### 1.2.6 图的最短路径算法
949
+ < h3 id = ' 126 ' > 1.2.6 图的最短路径算法</ h3 >
929
950
930
- #### 1.2.6.1 Dijkstra(迪杰特斯拉)算法
951
+ < h4 id = ' 1261 ' > 1.2.6.1 Dijkstra(迪杰特斯拉)算法</ h4 >
931
952
932
953
> Dijkstra算法必须要求边的权值不为负,且必须指定出发点。则可以求出发点到所有节点的最短距离是多少。如果到达不了,为正无穷
933
954
@@ -1159,7 +1180,6 @@ public class Code06_Dijkstra {
1159
1180
1160
1181
}
1161
1182
```
1162
-
1163
- #### 1.2.6.2 floyd算法
1183
+ <h4 id =' 1262 ' >1.2.6.2 floyd算法</h4 >
1164
1184
1165
1185
> 图节点的最短路径,处理权值可能为负的情况。三层for循环,比较简单
0 commit comments