1.问题
(1)用Floyd算法求解下图各个顶点的最短距离。写出Floyd算法的伪代码和给出距离矩阵(顶点之间的最短距离矩阵)。
(2)对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径。
2.解析
Floyd算法
从任意节点i到任意节点j的最短路径不外乎2种可能:(1)直接从i到j(2)从i经过若干个节点k到j。假设D(i,j)是节点i到节点j的最短路径的距离,对于剩余的每一个节点k,我们检查D(i,k)+D(k,j)<D(i,j)是否成立,如果成立,则从i到k加上从k到j的距离小于原先节点i到节点j的最短距离,我们便让D(i,j)=D(i,k)+D(k,j)。当遍历完所有节点时,D(i,j)中存放的就是i到j的最短路径。
最短距离矩阵:
1 | 2 | 3 | 4 | |
---|---|---|---|---|
1 | 0 | 2 | 5 | 4 |
2 | 9 | 0 | 3 | 4 |
3 | 6 | 8 | 0 | 1 |
4 | 5 | 7 | 11 | 0 |
Dijkstra算法
Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后松弛一次再找出最短的,所谓的松弛操作就是,遍历一遍看通过刚刚找到的距离最短的点作为中转站会不会更近,如果更近了就更新距离,这样把所有的点找遍之后就存下了起点到其他所有点的最短距离。
做法如图: