最短路径
定义:在一幅加权有向图中,从顶点s到顶点t的最短路径是所有从s到t的路径中的权重最小者。
Dijkstra 算法
Dijkstra算法会生成一颗最短路径树,树的根为起始顶点s
, 树的分支为从顶点s
到图G
中所有其他顶点的最短路径。此算法要求图中的所有权值均为非负数。与Prim
算法类似,Prim
算法每次添加的都是离树最近的非树顶点,Dijkstra
算法每次添加的都是离起点最近的非树顶点。
首先将distTo[s]初始化为0,distTo[]中的其他元素初始化为正无穷,然后将distTo[]最小的非树顶点放松并加入树中,如此这般,直到所有的顶点都在树中或者所有的非树顶点的distTo[]均为无穷大。
Dijkstra算法示例演示:
从顶点v1到其他各个顶点的最短路径
首先将数组distTo[]中起始点v1的值设置为0,然后再查找一个离v1顶点最近的顶点。
我们的顶点集T的初始化为:T={v1}
既然是求 v1顶点到其余各个顶点的最短路程,那就先找一个离 v1 顶点最近的顶点。通过数组 DistTo 可知当前离v1顶点最近是 v3顶点。当选择了 v3 号顶点后,DistTo[2](下标从0开始)的值就已经从“估计值”变为了“确定值”,即 v1顶点到 v3顶点的最短路程就是当前 DistTo[2]值。将V3加入到T中。
为什么呢?因为目前离 v1顶点最近的是 v3顶点,并且这个图所有的边都是正数,那么肯定不可能通过第三个顶点中转,使得 v1顶点到 v3顶点的路程进一步缩短了。因为 v1顶点到其它顶点的路程肯定没有 v1到 v3顶点短.
OK,既然确定了一个顶点的最短路径,下面我们就要根据这个新入的顶点V3会有出度,发现以v3 为弧尾的有: < v3,v4 >,那么我们看看路径:v1–v3–v4的长度是否比v1–v4短,其实这个已经是很明显