真实面经题目 · 原创解析
图论算法具体有哪些?
这题考察图问题分类能力,要把问题类型、适用条件、图表示和复杂度一起说,而不是背算法名清单。
真实面经题目 · 原创解析
这题考察图问题分类能力,要把问题类型、适用条件、图表示和复杂度一起说,而不是背算法名清单。
图论算法可以按问题分:遍历和连通性用 DFS/BFS、并查集;无权最短路用 BFS,非负权单源最短路用 Dijkstra,允许负权用 Bellman-Ford,全源最短路可用 Floyd;最小生成树用 Kruskal 或 Prim;DAG 依赖用拓扑排序;强连通分量用 Tarjan/Kosaraju;二分图匹配和网络流处理匹配、容量和最大流问题。回答时要先说明图是有向还是无向、是否有权、是否有负权、稀疏还是稠密,再选算法和复杂度。
邻接表适合稀疏图,DFS/BFS 是 `O(V + E)`;邻接矩阵适合稠密图或快速判断两点是否有边,但空间是 `O(V²)`;Kruskal 常用边集排序。
DFS/BFS 可解决连通块、层级遍历、环检测、无权最短路。动态连通性或合并集合常用并查集,并用路径压缩和按秩合并降低复杂度。
无权图 BFS;边权非负用 Dijkstra,堆优化常见复杂度是 `O(E log V)`;有负权边考虑 Bellman-Ford;全源最短路且点数不大时可用 Floyd。
最小生成树面向无向连通带权图,目标是选边连通所有点且总权重最小,常用 Kruskal/Prim;拓扑排序处理有向无环依赖,可判断是否有环。
强连通分量处理有向图互相可达;二分图匹配解决任务分配;网络流处理容量约束和最大流最小割。回答到这里能体现分类而非死记。
它每次确定当前最短点后不再回头,负权边可能让已确定的距离变小,破坏贪心前提。
Kruskal 按边排序并用并查集跳过环,适合边集清晰的稀疏图;Prim 从点扩展,配合堆也适合稀疏图,矩阵实现更适合稠密图。
处理 DAG 依赖顺序,例如课程安排、编译依赖、任务调度。若最终无法输出所有点,说明有环。
BFS 按层扩展,第一次到达某个点时经过的边数最少,这个前提依赖每条边权相同。