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³) |