图论四算法 · 图解速查

Prim · Kruskal · Dijkstra · Floyd
系统分析师 / 软件设计师 高频考点
一页搞定 · 2026-09-16

零、先分清两类问题(最容易混)

问题要什么算法关键词
最小生成树
MST
用 n-1 条边连通所有点,总权重最小Prim / Kruskal连通、总代价最小
最短路径求两点之间路径权重和最小Dijkstra / Floyd点到点、路径最短
⚠️ 典型陷阱:题目问「A 到 D 的最短距离」,却用最小生成树选出的边去推 —— 必错。生成树只保证总代价最小,不保证任意两点间路径最短。下面的例题会让你一次记住这个区别。

一、四算法对比总表

维度PrimKruskalDijkstraFloyd
解决最小生成树最小生成树单源最短路径多源最短路径
思想贪心·加点贪心·加边贪心·松弛动态规划
适用图无向连通图无向连通图有向/无向,权非负有向/无向,可含负权(无负权回路)
复杂度O(n²)O(e·log e)O(n²)O(n³)
输出n-1 条边n-1 条边起点到各点的距离任意两点的距离矩阵
适合稠密图稀疏图单起点查询全对全查询

二、例题图(下文四种算法都用它)

10 10 15 1 A B C D
4 个顶点 / 4 条边:A-B=10、B-C=10、A-C=15、C-D=1

三、逐个算法:思想 + 手算步骤

① Prim(普里姆)· 最小生成树 · 加点法

思想:从一个起点开始,每次从"已选集合连向外面的边"里挑最短的一条,把它连的点拉进来,直到所有点都进来。

手算步骤(从 A 出发):

  1. 已选 {A};候选边:A-B(10)、A-C(15) → 选 A-B(10)
  2. 已选 {A,B};候选边:A-C(15)、B-C(10) → 选 B-C(10)
  3. 已选 {A,B,C};候选边:C-D(1) → 选 C-D(1)
  4. 全部 4 点已选,结束

结果:选边 A-B、B-C、C-D,总权重 = 10+10+1 = 21

适用:稠密图;复杂度 O(n²)

② Kruskal(克鲁斯卡尔)· 最小生成树 · 加边法

思想:把所有边按权重从小到大排序,依次取边,只要不形成回路就要,取够 n-1 条为止。

手算步骤:

  1. 排序:C-D(1)、A-B(10)、B-C(10)、A-C(15)
  2. 取 C-D(1) —— 不成环,要
  3. 取 A-B(10) —— 不成环,要
  4. 取 B-C(10) —— 不成环,要(已有 3 条 = n-1,结束)
  5. A-C(15) 不再考虑:加了会形成 A-B-C-A 回路

结果:选边 C-D、A-B、B-C,总权重 = 21(与 Prim 相同,MST 总权唯一)

适用:稀疏图;复杂度 O(e·log e)

③ Dijkstra(迪杰斯特拉)· 单源最短路 · 贪心松弛

思想:维护"起点到各点的当前最短距离",每轮从未确定的点里选距离最小的那个确定为最终值,再用它去更新(松弛)邻居。

手算步骤(求 A 到各点):

轮次确定点ABCD说明
初始—0∞∞∞起点 A 置 0
1A(0)01015∞松弛:B=0+10,C=0+15
2B(10)01015∞经 B 到 C = 10+10 = 20 > 15,不变
3C(15)0101516经 C 到 D = 15+1 = 16
4D(16)0101516结束

结果:A→B=10,A→C=15,A→D=16(路径 A-C-D)

⚠️ 划重点:最短路径 A→D = 16,走的是 A-C-D,用到了 A-C(15) 这条边 —— 而这条边不在最小生成树里(MST 用的是 A-B、B-C)。这就是「生成树 ≠ 最短路径」的铁证。

④ Floyd(弗洛伊德)· 多源最短路 · 动态规划

思想:依次把每个点当作"中转站 k",看能不能让其他两点间距离变短。三重循环,k 必须放最外层。

for k: for i: for j: d[i][j] = min(d[i][j], d[i][k] + d[k][j])

最终结果矩阵(任意两点间最短距离):

从 \ 到ABCD
A0101516
B1001011
C151001
D161110

读法:第 A 行第 D 列 = 16,即 A→D 最短 16,与 Dijkstra 结果一致(互相验证)。

适用:全对全查询;复杂度 O(n³)

四、口诀与易错点

Prim 加点,Kruskal 加边;
Dijkstra 单源贪心怕负权;
Floyd 全对全,三重循环 k 在外。
易错点正确说法
Dijkstra 能算负权图吗不能。贪心前提是"已确定的点不会被改小",负权会打破它。含负权用 Floyd(或 Bellman-Ford)
Floyd 三重循环顺序k 必须在最外层(中转站)。写成 i,j,k 结果错误
四种算法谁能求最长路都不行。最长路问题性质完全不同
最小生成树的边能推两点最短距离吗不能。见上面 A→D=16 的例子
MST 权值唯一吗总权唯一,但选出的边集可能不唯一(等权边时)
Kruskal 如何判环用并查集(Union-Find),两点已在同一集合则弃该边
🎯 考试常见问法
① 给图 + 起点,填 Dijkstra 每轮的距离表(照上面第 3 个卡片的样子做)
② 给邻接矩阵,问 Floyd 迭代若干次后某元素的值
③ 问"最小生成树的总权重"(Prim/Kruskal 都行,结果总权一致)
④ 概念题:问某算法的适用条件、复杂度、能否处理负权
图论四算法图解速查 · 备考资料
内容整理自备考资料,供学习参考