多源最短路:
Floyd(O(n^3)):
依次考虑以每个点为中间点更新距离,判断考虑了这个点之后所有点两两之间的最短距离。(三重循环;松弛;可以处理负权、检测负环)
单源最短路:
Dijkstra(O(n^2)):
从源点开始,选距离源点最近的点,加入源点所在的集合,之后每次都选择离源点所在集合最近的点加入集合,直到所有点都加入集合。每次加入点的时候,记录该点到源点的距离,就是该点到源点的最短距离。(不能解决带有负权边的问题,因为它利用贪心的思想:若A到C的最短路径经过B,则A到B的那一段必须取最短)
Bellman-ford(O(VE)):
每一次循环,遍历所有边,进行松弛。循环V-1次后,得到单源最短路。(可以处理负权、检测负环(V-1次循环必得最短路,遍历所有边,若仍存在d(v)>d(u)+w(u,v)则有负环))
SPFA:对Bellman-ford用队列优化的版本,类似广度优先搜索。
两点之间最短路:
A*:
根据点到源点的代价和点到终点的预估代价,选择下一个点。