Skip to Main Content
考研 408 · 图核心知识点Back to Top

考研 408 · 图核心知识点

2 minutes

考研 408 · 图核心知识点

图是 408 大题最爱:存储 → 遍历 → 生成树 → 最短路 → 拓扑/关键路径


1. 图的存储

邻接矩阵

      1   2   3   4
1  [  0   1   1   0 ]
2  [  1   0   1   1 ]
3  [  1   1   0   1 ]
4  [  0   1   1   0 ]

无向图对称;有向图按出边填写。判断两点是否相邻 O(1),求度方便;但空间 O(n²)

邻接表

1 → 2 → 3
2 → 1 → 3 → 4
3 → 1 → 2 → 4
4 → 2 → 3

空间 O(n+e),适合稀疏图;求某点出度方便,判断相邻需扫描。

存储空间判断相邻求所有邻点
邻接矩阵O(n²)O(1)O(n)
邻接表O(n+e)O(degree)O(degree)

2. 遍历

DFS(深度优先,用栈/递归)

访问顶点 → 递归访问第一个未访问邻点 → 回溯

BFS(广度优先,用队列)

访问顶点 → 邻点全部入队 → 逐个出队重复

复杂度:邻接表 O(n+e),邻接矩阵 O(n²)。

BFS 还能求无权图最短路径(边数)、判断连通分量数。


3. 最小生成树 MST

Prim(加点)

从一个顶点出发,每次选择"连接已选集合与未选集合的最短边"加入集合,直到覆盖全部顶点。
复杂度:邻接矩阵 O(n²);适合稠密图。

Kruskal(加边)

边按权排序,从小到大选边,用并查集避免成环,选 n−1 条为止。
复杂度:O(e·log e);适合稀疏图。

示例

    1 --2-- 2
    |  \    |
    2    4  3
    |    \  |
    3 --1-- 4

按 Kruskal:先取 3-4(1)、1-2(2)、1-3(2)(跳过 2-4(3)) ⇒ MST 总权 5

4. 最短路径

Dijkstra(单源,非负权)

维护 dist[],每次取未确定顶点中 dist 最小者,松弛其邻边。
复杂度:邻接矩阵 O(n²);堆优化 O((n+e)log n)。
不能处理负权边。

Floyd(多源)

三重循环:d[i][j] = min(d[i][j], d[i][k] + d[k][j])
复杂度 O(n³);可处理负权(无负环)。

示例(Dijkstra 从 1 出发)

      2
  1 ───── 3
  | 1   1 |
  2 ───── 4
      3

dist: 1→1=0, 1→2=1, 1→3=2, 1→4=3(经 3)

5. 拓扑排序(AOV 网)

无环有向图,顶点表示活动。
反复:选入度为 0 的顶点输出,删除其出边,直到全部输出。
若剩余顶点仍有入度 ⇒ 存在环。
复杂度:邻接表 O(n+e)。

示例

课程依赖:A→C, B→C, C→D
拓扑序之一:A B C D(不唯一)

6. 关键路径(AOE 网)

顶点 = 事件,边 = 活动(带权=耗时)
ve(最早发生) 正向取 max;vl(最迟发生) 逆向取 min
活动最早 e = ve(弧尾);活动最迟 l = vl(弧头) − 权
e == l 的活动为关键活动,串联成关键路径
关键路径长度 = 工程最短工期

示例

   v1 ─2─▶ v2 ─3─▶ v4
     \            ▲
      4 ────────▶ 3
ve: v1=0, v2=2, v4=5, v3=4
vl: v1=0, v2=2, v4=5, v3=2(逆向)
关键活动:v1→v2(2), v2→v4(3),关键路径长 5

7. 常考题型

  1. 画邻接矩阵/邻接表;
  2. 给图写 DFS/BFS 序列;
  3. Prim/Kruskal 过程与总权;
  4. Dijkstra/Floyd 逐步表;
  5. 拓扑排序与环检测;
  6. 求 ve/vl/e/l 与关键路径;
  7. 判断有向图强连通、无向图连通分量。

8. 易错点

上一篇: | 下一篇:排序

Read Also