最短路径:Dijkstra算法和Floyd算法

Dijkstra算法——单源最短路径算法

算法本质:求图中某个顶点到其余各顶点的最短路径。

相关符号 说明
v 源点
S 已经生成最短路径的终点
w<v, vi> 从顶点 v 到顶点 vi 的权值
dist(v, vi) 表示从顶点 v 到顶点 vi 的最短路径长度
数组dist[n] 存储当前最短路径的长度
数组path[n] 存储当前的最短路径,即顶点序列

从 v 到其他所有顶点的最短路径

  • 初始化:集合S = {v};dist(v, vi) = w<v, vi>, (i=1…n);
  • 重复下述操作直到 S == V
    2.1 dist(v, vk) = min{dist(v, vj), (j=1…n)};
    2.2 S = S + {vk};
    2.3 dist(v, vj)=min{dist(v, vj), dist(v, vk) + w<vk, vj>};

例:
在这里插入图片描述
图采用邻接矩阵来存储
在这里插入图片描述

  • (1)从顶点v0到其余顶点最短路径。当v0到vi有边,则写出权值,否则∞。

在这里插入图片描述
在这里插入图片描述

  • (2) 从通往当前剩余顶点的路径选取权值最小的,是v0->v1.权值为10,因此将顶点v1并入到S中。

在这里插入图片描述
在这里插入图片描述

  • (3)从通往当前剩余顶点的路径中选取权值最小的,是v0->v3,权值为30,因此将v3并入到S中。
    v0->v3->v2,权值为50,将v2并入到S。

在这里插入图片描述

  • 重复上述操作

在这里插入图片描述
在这里插入图片描述
由上表可知:

  1. 顶点v0到顶点v1的最短路径为v0→v1,长度为10.
  2. 顶点v0到顶点v2的最短路径为v0→v3→v2,长度为50.
  3. 顶点v0到顶点v3的最短路径为v0→v3,长度为30.
  4. 顶点v0到顶点v4的最短路径为v0→v3→v2→v4,长度为60.

Floyd算法——多源最短路径算法

算法本质:求图中任意一对顶点间的最短路径。

相关符号 说明
w<vi, vj> 从顶点 vi 到顶点 vj 的权值
distk(vi, vj) 从顶点 vi 到顶点 vj 经过的顶点编号不大于 k 的最短路径长度

每一对顶点的最短路径

  1. 初始化:假设从 vi 到 vj 的弧是最短路径,即dist-1(vi, vj)=w<vi, vj>;
  2. 循环变量 k 从 0~n-1 进行 n 次迭代:
    distk(vi, vj)=min{distk-1(vi, vj), distk-1(vi, vk)+distk-1(vk, vj)}

例:有三座城市,v0与v2、v1城市有互相到达的公路,v2没有直接到达v1的公路。
在这里插入图片描述
城市v2去城市v1经过了城市v0,距离为7。
在这里插入图片描述
城市v0去城市v2可以经过了城市v1,距离为6<直接去的距离11.
在这里插入图片描述
城市v1去城市v0可以经过了城市v2,距离为5<直接去的距离6.
在这里插入图片描述

时间复杂度

最短路径算法 时间复杂度
Dijkstra算法 O(n²)
Floyd算法 O(n³)

此次的数据结构分享就到这里,欢迎大家指导指正~ 我是爱吃肉的小白yyyloki,如果你觉得不错的话点个赞👍吧!我们下次见~886

在这里插入图片描述