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 完成时间,后完成的节点依赖先完成的。