软考-软件设计师:数据结构-图:最短路径(迪杰斯特拉(Dijkstra)算法)

介绍

最短路径,两结点之间最短的路径(可以是非邻接结点)

算法:

  • 迪杰斯特拉(Dijkstra)算法(源点最短路径)

  • 弗洛伊德(Floyd)算法(每对顶点间的最短路径)

迪杰斯特拉(Dijkstra)算法

贪心算法

需要指定起点(源点)

引进两个集合S和U:

  • S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度)
  • U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离)。

初始时,S中只有起点s;U中是除s之外的顶点,并且U中顶点的路径是”起点s到该顶点的路径”。

然后,从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。

然后,再从U中找出路径最短的顶点,并将其加入到S中;接着,更新U中的顶点和顶点对应的路径。
…
重复该操作,直到遍历完所有顶点。

例子

初始状态

S是已计算出最短路径的顶点集合
U是未计算除最短路径的顶点的集合

第1步

将顶点D加入到S中:

S={D(0)}
U={A(∞),B(∞),C(3),E(4),F(∞),G(∞)}

注: C(3)表示C到起点D的距离是3。

第2步

将顶点C加入到S中。
上一步操作之后,U中顶点C到起点D的距离最短;
因此,将C加入到S中,同时更新U中顶点的距离。
以顶点F为例,之前F到D的距离为 ∞;但是将C加入到S之后,F到D的距离为 9=(F,C)+(C,D)

此时,

S={D(0),C(3)}
U={A(∞),B(23),E(4),F(9),G(∞)}

第3步

将顶点E加入到S中。
上一步操作之后,U中顶点E到起点D的距离最短;因此,将E加入到S中,同时更新U中顶点的距离。还是以顶点F为例,之前F到D的距离为9;但是将E加入到S之后,F到D的距离为 6=(F,E)+(E,D)

此时,

S={D(0),C(3),E(4)}
U={A(∞),B(23),F(6),G(12)}

第4步

将顶点F加入到S中。
此时,

S={D(0),C(3),E(4),F(6)}
U={A(22),B(13),G(12)}

第5步

将顶点G加入到S中
此时,

S={D(0),C(3),E(4),F(6),G(12)}
U={A(22),B(13)}

第6步

将顶点B加入到S中。
此时,

S={D(0),C(3),E(4),F(6),G(12),B(13)}
U={A(22)}

第7步

将顶点A加入到S中。
此时,

S={D(0),C(3),E(4),F(6),G(12),B(13),A(22)}

此时,起点D到各个顶点的最短距离就计算出来了:

  • A(22)
  • B(13)
  • C(3)
  • D(0)
  • E(4)
  • F(6)
  • G(12)

参考:
https://blog.csdn.net/wang13342322203/article/details/89377256


原文出处:/show_1GWwH5RGwQ2.html