最短路径:Dijkstra算法和Floyd算法
时间 2021-07-10
标签
数据结构
算法
图论
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。
由上表可知:
- 顶点v0到顶点v1的最短路径为v0→v1,长度为10.
- 顶点v0到顶点v2的最短路径为v0→v3→v2,长度为50.
- 顶点v0到顶点v3的最短路径为v0→v3,长度为30.
- 顶点v0到顶点v4的最短路径为v0→v3→v2→v4,长度为60.
Floyd算法——多源最短路径算法
算法本质:求图中任意一对顶点间的最短路径。
相关符号 |
说明 |
w<vi, vj> |
从顶点 vi 到顶点 vj 的权值 |
distk(vi, vj) |
从顶点 vi 到顶点 vj 经过的顶点编号不大于 k 的最短路径长度 |
每一对顶点的最短路径
- 初始化:假设从 vi 到 vj 的弧是最短路径,即dist-1(vi, vj)=w<vi, vj>;
- 循环变量 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