7.6 最短路径
迪杰斯特拉算法、弗洛伊德算法
用带权的有向图表示一个交通运输网,图中:
- 顶点——表示城市
- 边——表示城市间的交通联系
- 权——表示此线路的长度或沿此线路运输所花的时间或费用等
- 问题:从某顶点出发,沿图的边到达另一顶点所经过的路径中,各边上权值之和最小的一条路径——最短路径。
从某个源点到其余各顶点的最短路径
方法一:迪杰斯特拉(Dijkstra)算法
算法思想
首先,在这些最短路径中,长度最短的这条路径上必定只有一条弧,且它的权值是从源点出发的所有弧上权的最小值。
其次,第二条长度次短的最短路径只可能有两种情况:
1)或者只含一条从源点出发的弧且小于其它从源点出发的弧上的权值;
2)或者是一条只经过已求得最短路径的顶点的路径。
依次类推,按迪杰斯特拉算法先后求得的每一条最短路径必定只有两种情况,或者是由源点直接到达终点,或者是只经过已经求得最短路径的顶点到达终点。
求最短路径步骤
- 初使时令 S={V0},T={其余顶点},T中顶点对应的距离值
- 若存在<V0,Vi>,为<V0,Vi>弧上的权值
若不存在<V0,Vi>,为 - 从T中选取一个其距离值为最小的顶点W,加入S.
- 对T中顶点的距离值进行修改:若加进W作中间顶点,从V0到Vi的距离值比不加W的路径要短,则修改此距离值
- 重复上述步骤,直到S中包含所有顶点,即S=V为止
方法二:弗洛伊德(Floyd)算法
算法思想
逐个顶点试探法
求最短路径步骤
- 初始时设置一个n阶方阵,令其对角线元素为0,若存在弧<Vi,Vj>,则对应元素为权值;否则为
- 逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值
- 所有顶点试探完毕,算法结束