就像日常生活中的搭地铁问题,有的人会选择到达目的地最短距离的路线,有的人会选择地铁换乘次数最少的路线,其目的都是为了尽快到达目的地。选择到达目的地距离最短的路线,可以把两结点边的权值看成距离,而选择换乘次数最少的路线,可以把边的权值看作时间(换成次数少不代表路线就短嘛)。

图论中的最短路径问题,一般指一个无向图(或有向图),边的权值理解为两结点的距离,最短路径就是在求两个不同顶点的所有路径中,边的权值之和最小的那条路径。

而单源最短路径,是指从一个源点出发,到其他顶点的最短路径问题。在求单源最短路径时,我们遵守一个算法,由迪杰斯特拉提出的:“按路径长度递增的次序产生最短路径的算法”。

举个例子:

无权图的单源最短路径

图中从路径长度为0开始,也就是VO源点本身。接下来寻找路径长度为1的路径,V1和V3,V1和V3是V0的直接邻接点。路径长度为2的邻接点就是V2和V6,路径长度为3的是V4和V5,路径长度为4的是V7和V8,最后路径长度为5的是V6,到这一步后,图中所有的顶点都被访问过了,所以算法到这就结束了。

0:V0;

1:V1和V3;

2:V2和V6;

3:V4和V5;

4:V7和V8;

5:V6;

算法从源点开始,先把源点相邻的邻接点全部访问完后,再接着想外扩散,这就相当于一个BFS广度优先搜索。

BFS模板:

无权图的单源最短路径

算法:

无权图的单源最短路径

传进去的S是图的源点,dist数组是存放源点S到某个邻接点index的最短距离,在初始化时把dist[ S ]=0;对照BFS广度优先搜索的模板可以看到,dist数组除了存放源点S到某个邻接点index的最短距离外,还起到一个功能就是检查该顶点是否有被访问过。所以初始化dist数组时,除了源点dist[ S ]=0,数组内其他的元素应该被初始化为一个不可能是两点间距离的值(例如-1)。

path数组是记录路径,存放源点S到某个顶点index上经过的某个顶点。程序一开始先把源点S压入队列Q里,然后从队列中弹出一个元素给V,接着for循环遍历V的每一个邻接点,如果S到某个顶点index没被访问的话,就把S到该顶点index的距离存进数组dist中,它们之间的距离就等于前一个顶点的距离+1即可。而这个V就是S到V中必经过的顶点,所以存到path数组中。

相关文章:

  • 2021-09-22
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-08-04
  • 2021-03-31
  • 2022-12-23
  • 2021-11-23
  • 2021-09-05
  • 2021-11-30
相关资源
相似解决方案