BFS求无权图的单源最短路径
- d[]是保存结点2与其他结点的最短路径
- path[]是保存最短路径从哪一个结点过来
Dijkstra算法
弥补BFS算法只能求单源最短路径只适用于无权图,或所有边的权值都相同的图的短板
算法实例流程
结果分析
缺点
Dijkstra算法不适用于有负权值的带权图
Floyd算法(各顶点间的最短路径)
算法思想
使用动态规划思想,将问题的求解分为多个阶段
对于n个顶点的图G,求任意一对顶点 Vi-> Vj 之间的最短路径可分为如下几个阶段:
- #初始:不允许在其他顶点中转,最短路径是?
- #0:若允许在V0中转,最短路径是?
- #1:若允许在V0、V1中转,最短路径是?
- #2:若允许在V0、V1、V2中转,最短路径是?
- …
- #n-1:若允许在V0、V1、V2 ...... Vn-1中转,最短路径是?
算法实例演示
结果分析
Code
优缺点
- Floyd算法可以用于负权值带权图
- Floyd算法不能解决带有“负权回路”的图((有负权值的边组成回路),这种图有可能没有最短路径,如下图
三大算法的复杂度分析
BFS算法的时间复杂度要根据图的存储结构是邻接矩阵还是邻接表而定,故有两种结果!