将交通网络看成带权图,结点代表地点,边代表城市之间的路,权重代表路的长度。那么此时有两个问题值得解决:
①求一结点到其他结点的最短路径
②求任意两点间的最短路径
1 求一结点到其他结点的最短路径
1.1 迪杰斯特拉算法
对于图
G
=
(
V
,
{
E
}
)
G=(V,\{E\})
G=(V,{E}),将图中的顶点分成以下两组:
第一组
S
S
S:已求出的最短路径的终点集合(开始为出发点
{
v
0
}
\{v_0\}
{v0})。
第二组
V
−
S
V-S
V−S:尚未求出最短路径的顶点集合(开始为
V
−
{
v
0
}
V-\{v_0\}
V−{v0}的全部顶点)。
算法将按最短路径的递增顺序逐个将第二组的顶点加入到第一组中,直到所有顶点都被加入到第一组顶点集
S
S
S为止。
1.2 实例
图:《数据结构用C语言描述第二版》耿国华图7.26
终点 | 加入 v 1 v_1 v1 | 加入 v 2 v_2 v2 | 加入 v 3 v_3 v3 | 加入 v 4 v_4 v4 | 加入 v 5 v_5 v5 |
---|---|---|---|---|---|
v 1 v_1 v1 | 50 | 50 | 35 | ||
v 2 v_2 v2 | 10 | ||||
v 3 v_3 v3 | ∞ | 25 | |||
v 4 v_4 v4 | 45 | 45 | 45 | 45 | |
v 5 v_5 v5 | ∞ | ∞ | ∞ | ∞ | ∞ |
S S S | ( v 0 , v 2 ) (v_0,v_2) (v0,v2) | ( v 0 , v 2 , v 3 ) (v_0,v_2,v_3) (v0,v2,v3) | ( v 0 , v 2 , v 3 , v 1 ) (v_0,v_2,v_3,v_1) (v0,v2,v3,v1) | ( v 0 , v 2 , v 3 , v 1 , v 4 ) (v_0,v_2,v_3,v_1,v_4) (v0,v2,v3,v1,v4) | ( v 0 , v 2 , v 3 , v 1 , v 4 ) (v_0,v_2,v_3,v_1,v_4) (v0,v2,v3,v1,v4) |
2 求任意两点间的最短路径
2.1 弗洛伊德算法
百度百科:弗洛伊德算法
2.2 实例
实例可以看这篇。