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>,则对应元素为权值;否则为
  • 逐步试着在原直接路径中增加中间顶点,若加入中间点后路径变短,则修改之;否则,维持原值
  • 所有顶点试探完毕,算法结束
posted @ 2020-08-14 20:30  夜明_Yoake  阅读(151)  评论(0编辑  收藏  举报