D
AI
学习工作台
算法2026-03-171 分钟阅读

图算法精讲

BFS、DFS、最短路与拓扑排序

图算法BFSDFS最短路拓扑排序记笔记标记疑惑

BFS 与 DFS

广度优先搜索(BFS)用队列实现,按层扩展。从源点出发,先访问所有距离为 1 的节点,再距离 2,以此类推。BFS 保证第一次到达某节点时,路径即为最短(无权图)。

深度优先搜索(DFS)用栈或递归,沿一条路径走到底再回溯。DFS 适合遍历、判环、连通分量等。在无权最短路场景,BFS 更高效;DFS 需遍历所有路径。

两者时间复杂度均为 O(V+E),空间 O(V)。BFS 空间取决于队列最大宽度;DFS 取决于递归深度。

最短路算法

Dijkstra:适用于非负权图。维护距离数组,每次取未访问中距离最小的节点松弛其邻边。用优先队列可优化至 O((V+E) log V)。不能处理负权边。

Bellman-Ford:可处理负权,检测负环。对每条边松弛 V-1 轮,若第 V 轮仍能更新则存在负环。复杂度 O(VE)。

Floyd-Warshall:全源最短路,O(V³)。枚举中间点 k,更新所有 i→j 距离。实现简单,适合稠密图或需要全源时。

拓扑排序

拓扑排序将有向无环图(DAG)的节点排成线性序列,使得任意有向边 (u,v) 中 u 在 v 前。

Kahn 算法:统计入度,将入度为 0 的节点入队,依次取出并删除其出边,新产生的入度 0 节点入队。队列顺序即为拓扑序。

DFS 方法:对每个未访问节点 DFS,递归返回时将节点加入结果,最后逆序。利用 DFS 完成时间,后完成的节点依赖先完成的。

知识卡片

问题

BFS 和 DFS 在求最短路径时有何区别?

点击翻转查看答案

答案

在无权图中,BFS 第一次到达某节点时即为最短路径;DFS 需要遍历所有路径才能确定最短,通常用 BFS 求无权最短路。

问题

Dijkstra 算法为什么不能处理负权边?

点击翻转查看答案

答案

算法基于贪心,假设已确定最短路的节点不再更新。负权边可能使已确定的节点通过负权路径获得更短距离,破坏该假设。

问题

拓扑排序的前提条件是什么?

点击翻转查看答案

答案

有向无环图(DAG)。有环则存在循环依赖,无法定义线性顺序。可用 DFS 后序逆序或 Kahn 算法(入度)实现。