问题描述
我有一项作业要求我计算给定完整无向图的最短路径。问题给出一个完整的无向图,基本算法(BFS和DFS)可以提供最短路径。我想知道使用 BFS 或 DFS 是否会产生相同的输出,因为它是一个完整的无向图。
解决方法
我假设图表是用非负权重加权的
- 最短路径在未加权的完全图中是微不足道的
- 在无向图中,负权重边将创建负权重循环。此类图中没有最短路径,因为您始终可以通过添加负循环来改进它。
我还假设您正在寻找两个给定顶点之间的最短路径,因为这是 DFS 和 BFS 都真正适用的唯一最短路径任务。
- 要查找所有单源最短路径,您可以使用 Dijkstra
- 要找到所有对的最短路径,您可以使用 Floyd-Warshall
如果图是有限的,DFS 和 BFS 都会给你最短路径。如果有多个最短路径,DFS 和 BFS 都可以完成,以便它们返回所有最短路径。否则,它们不能保证为您提供相同的最短路径 - 即使对于同一算法的不同实现也不能保证,它可能因边的顺序而异。
DFS 和 BFS 都将具有可怕的时间复杂度 O(n!),因为它们将遍历整个问题空间,找到从源到目标的所有可能路径。此外,BFS 将具有更大的空间复杂度(再次为 O(n!))。
对于 DFS 和 BFS,通过保持“当前最佳”和修剪无法击败它的分支(因为它们的长度已经更糟),这种复杂性在一般情况下可以有所改善。但是您仍然无法赶上更合适的算法的速度,例如 Dijkstra 或 A*