快速参考

图算法速查表:复杂度、用途与选择

面试前或写代码时可快速扫一眼的一页纸。每个重要图算法、它的时间和空间复杂度、最擅长什么,以及在时间紧迫时选对算法的决策指南。

11 分钟阅读 更新时间:2026 年 7 月 所有级别
Mohammed Islam Hadjoudj
Mohammed Islam Hadjoudj
Expert Operations Research Engineer
遍历 BFS DFS 最短路径 Dijkstra Bellman-Ford Floyd-Warshall A* 生成树 Kruskal Prim 排序 拓扑排序 环检测 连通性 Union-Find Tarjan / Kosaraju (SCC) 网络流 Ford-Fulkerson Edmonds-Karp
图算法的六大家族。几乎每一个图论问题都落入其中之一。

这份速查表是为两个时刻打造的:技术面试前的最后一小时,以及写代码到一半、你已看清问题的形状却需要确切工具的时候。它刻意做得很紧凑。想了解每个算法背后的完整故事,请点开深入文章的链接;若想有条理地走完全部内容,请从图论学习路线图开始。

全文中,V 是顶点(节点)数,E 是边数。

复杂度主表

最值得背下来的一件事。这些复杂度假设采用标准的高效实现(Dijkstra 和 Prim 用二叉堆,并查集用路径压缩和按秩合并)。

算法最适合时间空间
BFS无权图最短路径、层序O(V + E)O(V)
DFS连通性、环、探索结构O(V + E)O(V)
Dijkstra最短路径,非负权O((V + E) log V)O(V)
Bellman-Ford含负权的最短路径O(V · E)O(V)
Floyd-Warshall所有点对最短路径,小而稠密的图O(V³)O(V²)
A*启发式最短路径(地图、游戏)O(E) 通常O(V)
Kruskal最小生成树,稀疏图O(E log E)O(V)
Prim最小生成树,稠密图O((V + E) log V)O(V)
Topological Sort按依赖为 DAG 排序O(V + E)O(V)
Union-Find动态连通性、分组O(α(V)) 每次操作O(V)
Tarjan / Kosaraju强连通分量O(V + E)O(V)
Edmonds-Karp最大流、最小割O(V · E²)O(V + E)
需要真正的代码吗? 这张表一眼列出 12 个核心。算法手册 收录全部 55 个,每个都配有伪代码和逐步推导的复杂度。

关于 A* 的说明:它的运行时间完全取决于启发式函数。启发式完美时,它几乎径直走向目标;启发式毫无用处时,它退化为 Dijkstra。并查集中的 α 是反阿克曼函数,对你今生会遇到的任何输入实际上都是一个小常数。每一行背后的推理,参见图算法复杂度指南

图的表示法

在任何算法之前,你要先选择如何存储图。这一个决定会影响上面每一项复杂度。

表示法空间边查询最适合
邻接表O(V + E)O(degree)稀疏图,默认选择
邻接矩阵O(V²)O(1)稠密图,常数时间查询

经验法则:除非图很稠密或你需要常数时间的边检查,否则就用邻接表。二维网格是一种隐式图,每个格子都是一个与其邻居相连的节点,所以你往往根本不需要任何显式表示。

遍历:BFS 与 DFS

其余一切都建立在这两个算法之上。完整比较见BFS vs DFS

最短路径

面试和实践中最常见的一族。正确选择由边权决定。完整深入见读懂最短路径算法

情形使用原因
无权边BFS第一次到达即为最短路径
非负权Dijkstra配最小堆的贪心,在此总是正确
负权Bellman-Ford将边松弛 V-1 次,检测负环
一次求所有点对Floyd-Warshall三重嵌套循环,代码极短,小图上很棒
你有启发式A*被引导向目标的 Dijkstra,见 A*
经典陷阱:绝不要在含负边的图上跑 Dijkstra。它会过早把某个节点定为最终结果,可能返回错误答案。请改用 Bellman-Ford。

最小生成树

以最低的总边权连接每一个顶点。两种算法都正确;按图的稠密度来选。完整讲解见最小生成树

排序与连通性

这三者在面试中层出不穷。可查看编程面试必备图算法中的套路解析。

网络流

为吞吐量、匹配和瓶颈建模。这里优美的结论是:最大流等于最小割。完整讲解见网络流与最大流最小割定理

我该用哪个算法?

使用这份速查表最快的方式:读左列,跳到右列。

如果你需要…就用
访问或探索每个节点BFS 或 DFS
在无权图中找最短路径BFS
在非负权下找最短路径Dijkstra
处理负边权Bellman-Ford
求所有点对之间的最短路径Floyd-Warshall
用启发式找一条快速路径(地图、游戏)A*
以最小代价连接一切Kruskal 或 Prim
按依赖为任务排序拓扑排序
检查两个节点是否连通,或对元素分组Union-Find
在有向图中找出簇Tarjan 或 Kosaraju(SCC)
最大化吞吐量或找出瓶颈Edmonds-Karp(最大流)

把表格变成直觉

速查表告诉你用哪个算法;看它运行则告诉你为什么。在实时图上一步步走一遍其中任意一个。

打开算法可视化工具

常见问题

Dijkstra 算法的时间复杂度是多少?

使用二叉堆(优先队列)时,Dijkstra 算法的时间为 O((V + E) log V),空间为 O(V)。若用简单数组代替堆,则为 O(V 的平方),在稠密图上可能更快。

最短路径应该用哪个图算法?

这取决于图。无权图用 BFS,非负权用 Dijkstra,有负权时用 Bellman-Ford,所有点对最短路径用 Floyd-Warshall,有好的启发式时(地图和游戏)用 A*。

应该用邻接表还是邻接矩阵?

稀疏图用邻接表:它占用 O(V + E) 空间,是大多数问题的默认选择。稠密图或需要 O(1) 边查询时用邻接矩阵,代价是 O(V 的平方) 空间。

编程面试应该记住哪些图算法?

五个核心是 BFS、DFS、Dijkstra 算法、拓扑排序和并查集。它们合起来覆盖了技术面试中绝大多数图论题。

进一步的学习资源

先收藏,再深入

速查表能让你快速脱困。真正的熟练来自看这些算法运行。挑一个,按下播放。

使用算法可视化工具进行练习