1.Dijkstra(迪杰斯特拉)算法
(1)适用范围
单源最短路径、带权图(不适合有负权值的带权图)、无权图
(2)算法描述
设
V
0
,
V
1
,
.
.
.
,
V
n
−
1
V_0,V_1,...,V_{n-1}
V0,V1,...,Vn−1是图的各个顶点,数组下标和各顶点的下标相对应
数组 | 描述 |
---|---|
final[n] | 标记各顶点是否已经找到最短路径,初始值都为false |
distance[n] | 到各顶点的最短路径长度 |
path[n] | 路径上的前驱 |
1)从源顶点开始,初始化三个数组信息
final:将源顶点置为True
distance:源顶点置为0,源顶点的所有后继置为弧的权值
path:源顶点置为-1,源顶点的所有后继置为源顶点的下标
2)循环遍历所有顶点,找到还没确定最短路径且最短路径长度最小的顶点,将其标记为已找到最短路径。检查该顶点的所有后继,若其还未找到最短路径,则更新后继顶点的distance和path信息
distance:distance[顶点] = distance[前驱]+弧的权值
path:path[顶点]=前驱的下标
3)重复2)直到所有顶点都找到最短路径
(3)性能分析
指标 | 性能 |
---|---|
时间复杂度 | O ( ∣ V ∣ 2 ) O(|V|^2) O(∣V∣2) |
空间复杂度 | O ( ∣ V ∣ ) O(|V|) O(∣V∣) |
2.Floyd算法
(1)适用范围
每对顶点间的最短路径、带权图(可以用于负权值带权图但不适用于带负权回路的图)、无权图
(2)算法描述
利用了动态规划思想,设
V
0
,
V
1
,
.
.
.
,
V
n
−
1
V_0,V_1,...,V_{n-1}
V0,V1,...,Vn−1是图的各个顶点,数组下标和各顶点的下标相对应
二维数组 | 描述 |
---|---|
A k [ n ] [ n ] A^k[n][n] Ak[n][n] | 当前各顶点间的最短路径长度,初始值为各边的权值,即图的邻接矩阵 |
P a t h k [ n ] [ n ] Path^k[n][n] Pathk[n][n] | 两个顶点之间的中转顶点的下标,初始值都为-1 |
1)初始化
A
k
A^k
Ak和
P
a
t
h
k
Path^k
Pathk两个二维数组,k的初始值为-1
2)遍历矩阵
A
k
A^k
Ak,若
A
k
[
i
]
[
k
+
1
]
+
A
k
[
k
+
1
]
[
j
]
<
A
k
[
i
]
[
j
]
A^k[i][k+1]+A^k[k+1][j]<A^k[i][j]
Ak[i][k+1]+Ak[k+1][j]<Ak[i][j],则
A
k
+
1
[
i
]
[
j
]
=
A
k
[
i
]
[
k
+
1
]
+
A
k
[
k
+
1
]
[
j
]
A^{k+1}[i][j]=A^k[i][k+1]+A^k[k+1][j]
Ak+1[i][j]=Ak[i][k+1]+Ak[k+1][j]且
P
a
t
h
k
+
1
[
i
]
[
j
]
=
k
+
1
Path^{k+1}[i][j]=k+1
Pathk+1[i][j]=k+1,否则
A
k
A^k
Ak和
P
a
t
h
k
Path^k
Pathk保持原值
3)k++
4)重复步骤2)和3),直到
k
>
n
−
1
k>n-1
k>n−1
(3)性能分析
指标 | 性能 |
---|---|
时间复杂度 | O ( ∣ V ∣ 3 ) O(|V|^3) O(∣V∣3) |
空间复杂度 | O ( ∣ V ∣ 2 ) O(|V|^2) O(∣V∣2) |