深入解析最短路径算法
正文
第一节 问题的提出及解决方法
所谓最短路径问题,可以说有两种情况来描述。
描述一:在图论中,指的是寻找图中两个节点之间的最短距离。如下图
第一节 问题的提出及解决方法
所谓最短路径问题,可以说有两种情况来描述。
描述一:在图论中,指的是寻找图中两个节点之间的最短距离。如下图
描述二:在现实生活中,指的是找到从一个地方到另一个地方的最近距离。如下图
上述两种情况的本质是一样的,即求一个点到另一个点的最短路径。好了,问题已经提出来了,那怎么解决呢?解决该问题的方法还是比较多的,不过由于各个路径算法所对应的问题条件不同,我们可根据不同的情况,选择不同的路径算法。
本文将介绍三种最短路径算法,分别是:戴克斯特拉算法(Dijkstra algorithm),弗洛伊德算法(Floyd algorithm)以及A*搜索算法。
第二节 戴克斯特拉算法(Dijkstra algorithm)
该算法解决的是有向图中单个源点到其他顶点的最短路径问题。
戴克斯特拉算法的实现过程如下:
第一步:用带权的矩阵WeiArcs来表示带权有向图,如果图中的两个顶点vi和vj是连通的,则用WeiArcs[i][j]表示这两个顶点所形成边的权值;如果vi和vj不连通,即<vi,vj>这条边不存在,那么将WeiArcs[i][j]置为∞。
第二步:设S为已求得的从某一顶点v始发的最短路径的终点的集合,且S的初始状态为空,初始化时,将始发顶点置于S集合中。那么从v出发到图中其余各个顶点vi可能达到的最短路径长度的初值为D[i]。
第三步:选择一顶点vj,使得vj就是当前求得的一条从顶点v出发的最短路径的终点。此时令S = S ∪ {vj}。
第四步:修改从v出发到集合V-S(V为图顶点的集合&#
本文将介绍三种最短路径算法,分别是:戴克斯特拉算法(Dijkstra algorithm),弗洛伊德算法(Floyd algorithm)以及A*搜索算法。
第二节 戴克斯特拉算法(Dijkstra algorithm)
该算法解决的是有向图中单个源点到其他顶点的最短路径问题。
戴克斯特拉算法的实现过程如下:
第一步:用带权的矩阵WeiArcs来表示带权有向图,如果图中的两个顶点vi和vj是连通的,则用WeiArcs[i][j]表示这两个顶点所形成边的权值;如果vi和vj不连通,即<vi,vj>这条边不存在,那么将WeiArcs[i][j]置为∞。
第二步:设S为已求得的从某一顶点v始发的最短路径的终点的集合,且S的初始状态为空,初始化时,将始发顶点置于S集合中。那么从v出发到图中其余各个顶点vi可能达到的最短路径长度的初值为D[i]。
第三步:选择一顶点vj,使得vj就是当前求得的一条从顶点v出发的最短路径的终点。此时令S = S ∪ {vj}。
第四步:修改从v出发到集合V-S(V为图顶点的集合&#