概要
初始状态时候两点的距离:
A
[
i
]
[
j
]
=
0
(
如
果
i
=
=
j
)
A[i][j] = 0 (如果i == j)
A[i][j]=0(如果i==j)
A
[
i
]
[
j
]
=
∞
(
如
果
i
!
=
j
,
且
无
边
相
连
)
A[i][j] = ∞ (如果 i != j, 且无边相连)
A[i][j]=∞(如果i!=j,且无边相连)
A
[
i
]
[
j
]
=
W
[
i
]
[
j
]
(
如
果
i
!
=
j
,
且
有
边
相
连
接
)
A[i][j] = W[i][j] (如果 i != j, 且有边相连接)
A[i][j]=W[i][j](如果i!=j,且有边相连接)
计算最短路径
A
−
1
[
i
]
[
j
]
=
g
.
e
d
g
e
s
[
i
]
[
j
]
A_{-1}[i][j] = g.edges[i][j]
A−1[i][j]=g.edges[i][j]
A
k
[
i
]
[
j
]
=
M
I
N
(
A
k
−
1
[
i
]
[
j
]
,
A
k
−
1
[
i
]
[
k
]
+
A
k
−
1
[
k
]
[
j
]
)
,
其
中
0
⩽
k
⩽
n
−
1
A_k[i][j] = MIN{( A_{k-1}[i][j], A_{k-1}[i][k] + A_{k-1}[k][j])}, 其中 0\leqslant k \leqslant n-1
Ak[i][j]=MIN(Ak−1[i][j],Ak−1[i][k]+Ak−1[k][j]),其中0⩽k⩽n−1
上面的式子是一个迭代表达式,每迭代依次,
i
→
j
i\rightarrow j
i→j 的最短路径上就多考虑了一个顶点;
经过
n
n
n 次迭代后得到的
A
n
−
1
[
i
]
[
j
]
A_{n-1}[i][j]
An−1[i][j] 值就是考虑所有顶点后
i
→
j
i \rightarrow j
i→j 的最短路径,也就是最终解。
另外用二维数组
p
a
t
h
path
path 保存最短路径,它与当前迭代次数有关。
p
a
t
h
k
[
i
]
[
j
]
path_k{[i]}{[j]}
pathk[i][j]存放着考察顶点
0
、
1
、
⋯
、
k
0、1、\cdots、k
0、1、⋯、k 之后得到的
i
→
j
i \rightarrow j
i→j的最短路径顶点
j
j
j 的前一个顶点编号,这和
D
i
j
k
s
t
r
a
Dijkstra
Dijkstra 算法采用的方式相似。
由
p
a
t
h
path
path 数组可以推导出所有顶点的最短路径,下面以求
1
→
0
1\rightarrow 0
1→0 举例说明:
p
a
t
h
[
1
]
[
0
]
=
2
path[1][0]=2
path[1][0]=2,说明顶点
0
0
0 的前一项顶点是顶点
2
2
2,
p
a
t
h
[
1
]
[
2
]
=
3
path[1][2]=3
path[1][2]=3,表示顶点
2
2
2 的前一个顶点是顶点
3
3
3,
p
a
t
h
[
1
]
[
3
]
=
1
path[1][3] = 1
path[1][3]=1,表示顶点
3
3
3 的前一个顶点是顶点
1
1
1,找到起点。依次得到的顶点序列为:
[
0
,
2
,
3
,
1
]
[0,2,3,1]
[0,2,3,1],则
1
→
0
1 \rightarrow 0
1→0的最短路径为:
1
→
3
→
2
→
0
1\rightarrow3\rightarrow2\rightarrow0
1→3→2→0
代码
#include "../MatGraph.h"
void Floy(MatGraph g) {
int A[MAXV][MAXV], path[MAXV][MAXV];
int i, j, k;
/// the start of the loop
for (i = 0; i < g.n; i++) {
for (j = 0; j < g.n; j++) {
A[i][j] = g.edges[i][j];
if (i != j && g.edges[i][j] < INF) {
path[i][j] = i; /// 表示顶点 i 到顶点 j 有边时
} else {
path[i][j] = -1; /// 顶点 i 到顶点 j 没有边时
}
}
}
/// the end of the loof
for (k = 0; k < g.n; k++) {
for (i = 0; i < g.n; i++) {
for (j = 0; j < g.n; j++) {
if (A[i][j] > A[i][k] + A[k][j]) {
A[i][j] = A[i][k] + A[k][j];/// 修改最短路径长度
path[i][j] = path[k][j];/// 修改最短路径
}
}
}
}
}
演示ppt下载
链接:https://pan.baidu.com/s/1v3JPJZyDHG4p0f3ioero7w
提取码:q5f8